Subversion Repositories HomeAutomation

Rev

Blame | Last modification | View Log | SVN | RSS feed

  1. /**
  2.  * CAN Test. This program sends a CAN message once every second. The ID of the
  3.  * message is increased each time for testing purposes.
  4.  *
  5.  * @date    2006-11-21
  6.  * @author  Jimmy Myhrman
  7.  *  
  8.  */
  9.  
  10. /*-----------------------------------------------------------------------------
  11.  * Includes
  12.  *---------------------------------------------------------------------------*/
  13. /* system files */
  14. #include <avr/io.h>
  15. #include <avr/interrupt.h>
  16. #include <avr/wdt.h>
  17. #include <stdio.h>
  18. /* lib files */
  19. #include <can.h>
  20. #include <serial.h>
  21. #include <timebase.h>
  22. #include <irreceiver.h>
  23.  
  24.  
  25.  
  26. /*-----------------------------------------------------------------------------
  27.  * Main Program
  28.  *---------------------------------------------------------------------------*/
  29. int main(void) {
  30.     Timebase_Init();
  31.     Serial_Init();
  32.     sei();
  33.    
  34.     DDRD |= (1<<PD5);
  35.     PORTD &= ~(1<<PD5);
  36.  
  37.     IRDDR &= ~(1<<IRBIT);
  38.    
  39.     printf("\n------------------------------------------------------------\n");
  40.     printf(  "   CAN Test: Periodic Transmission\n");
  41.     printf(  "------------------------------------------------------------\n");
  42.    
  43.     printf("CanInit...");
  44.     if (Can_Init() != CAN_OK) {
  45.         printf("FAILED!\n");
  46.     }
  47.     else {
  48.         printf("OK!\n");
  49.     }
  50.    
  51.     uint32_t timeStamp = 0;
  52.    
  53.     Can_Message_t txMsg;
  54.     Can_Message_t rxMsg;
  55.     txMsg.Id = 2;
  56.    
  57.     uint8_t ir_protocol, ir_address, ir_command;
  58.    
  59.     /* main loop */
  60.     while (1) {
  61.         /* service the CAN routines */
  62.         Can_Service();
  63.        
  64.         if (IRPIN & (1<<IRBIT)) {
  65.             PORTD |= (1<<PD5);
  66.         } else {
  67.             PORTD &= ~(1<<PD5);
  68.         }
  69.        
  70.         if (checkIr(&ir_protocol, &ir_address, &ir_command) == IR_OK) {
  71.             txMsg.Data.bytes[0] = 0x00;
  72.             txMsg.Data.bytes[1] = ir_protocol;
  73.             txMsg.Data.bytes[2] = ir_address;
  74.             txMsg.Data.bytes[3] = ir_command;
  75.             txMsg.DataLength = 4;
  76.             Can_Send(&txMsg);
  77.         }
  78.        
  79.         /* send CAN message and check for CAN errors once every second */
  80.         if (Timebase_PassedTimeMillis(timeStamp) >= 2000) {
  81.             timeStamp = Timebase_CurrentTime();
  82.             txMsg.DataLength = 0;
  83.             /* send txMsg */
  84.             Can_Send(&txMsg);
  85.         }
  86.        
  87.         /* check if any messages have been received */
  88.         while (Can_Receive(&rxMsg) == CAN_OK) {
  89.             printf("MSG Received: ID=%lx, DLC=%u, EXT=%u, RTR=%u, ", rxMsg.Id, (uint16_t)(rxMsg.DataLength), (uint16_t)(rxMsg.ExtendedFlag), (uint16_t)(rxMsg.RemoteFlag));
  90.             printf("data={ ");
  91.             for (uint8_t i=0; i<rxMsg.DataLength; i++) {
  92.                 printf("%x ", rxMsg.Data.bytes[i]);
  93.             }
  94.             printf("}\n");
  95.         }
  96.     }
  97.    
  98.     return 0;
  99. }
  100.