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.  * Added LCD output
  5.  *
  6.  * @date    2006-11-21, LCD addition 2006-12-11
  7.  * @author  Jimmy Myhrman, Erik Larsson
  8.  *  
  9.  *   Observera! Applikationen är helt otestad
  10.  */
  11.  
  12. /*-----------------------------------------------------------------------------
  13.  * Includes
  14.  *---------------------------------------------------------------------------*/
  15. /* system files */
  16. #include <avr/io.h>
  17. #include <avr/interrupt.h>
  18. #include <avr/wdt.h>
  19. #include <stdio.h>
  20. /* lib files */
  21. #include <can.h>
  22. #include <serial.h>
  23. #include <timebase.h>
  24.  
  25. #define RELAY_PORT  PORTC
  26. #define RELAY_PIN   PC1
  27. #define OFF     0x00
  28. #define ON      0x01
  29.  
  30. /*-----------------------------------------------------------------------------
  31.  * Main Program
  32.  *---------------------------------------------------------------------------*/
  33. int main(void) {
  34.  
  35.     uint8_t relayStatus;
  36.  
  37.     Timebase_Init();
  38.     Serial_Init();
  39.     sei();
  40.  
  41.     /* Enable RELAY_PIN as output */
  42.     DDRC |= (1<<DDC1);
  43.     /* Turn relay off */
  44.     RELAY_PORT &= ~(1<<RELAY_PIN);
  45.     relayStatus = OFF;
  46.  
  47.     // TODO initiera temperatursensor
  48.  
  49.     printf("\n------------------------------------------------------------\n");
  50.     printf(  "   CAN: Relay\n");
  51.     printf(  "------------------------------------------------------------\n");
  52.  
  53.  
  54.     printf("CanInit...");
  55.     if (Can_Init() != CAN_OK) {
  56.         printf("FAILED!\n");
  57.     }
  58.     else {
  59.         printf("OK!\n");
  60.     }
  61.    
  62.     uint32_t timeStamp = 0;
  63.    
  64.     Can_Message_t txMsg;
  65.     Can_Message_t rxMsg;
  66.     txMsg.Id = 0;
  67.     txMsg.RemoteFlag = 0;
  68.     txMsg.ExtendedFlag = 1;
  69.  
  70.  
  71.     /* main loop */
  72.     while (1) {
  73.         /* service the CAN routines */
  74.         Can_Service();
  75.        
  76.         /* check if any messages have been received */
  77.         while (Can_Receive(&rxMsg) == CAN_OK) {
  78.             /* This relay is adressed*/
  79.             if( rxMsg.Id == 0x1200 ){
  80.  
  81.                 if( rxMsg.Data.bytes[0] == 0x01 ){
  82.                     /* Turn relay on */
  83.  
  84.                     RELAY_PORT |= (1<<RELAY_PIN);
  85.                     relayStatus = ON;
  86.  
  87.                 }else if(rxMsg.Data.bytes[0] == 0x02){
  88.                     /* Turn relay off */
  89.  
  90.                     RELAY_PORT &= ~(1<<RELAY_PIN);
  91.                     relayStatus = OFF;
  92.  
  93.                 }else if(rxMsg.Data.bytes[0] == 0x03){
  94.                     /* Toggle relay */
  95.  
  96.                     if(relayStatus == ON){
  97.                         RELAY_PORT &= ~(1<<RELAY_PIN);
  98.                         relayStatus = OFF;
  99.                     }else{
  100.                         RELAY_PORT |= (1<<RELAY_PIN);
  101.                         relayStatus = ON;
  102.                     }
  103.  
  104.                 }else if(rxMsg.Data.bytes[0] == 0x04){
  105.                     /* Get relay status (ON/OFF?, temperature) */
  106.                     // TODO läsa värde från temperatursensor
  107.  
  108.                     txMsg.Id = 0x1201;
  109.                     txMsg.Data.bytes[0] = relayStatus;
  110.                     txMsg.DataLength = 3;
  111.  
  112.                     Can_Send( &txMsg );
  113.                 }
  114.             }
  115.         }
  116.     // TODO
  117.     // ska status på relä och temperatur skickas periodiskt?
  118.     // tätare intervall om temperaturen kommer över en viss gräns?
  119.  
  120.         if( Timebase_PassedTimeMillis(timeStamp) >=5000){
  121.             timeStamp = Timebase_CurrentTime();
  122.              /* Get relay status (ON/OFF?, temperature) */
  123.             // TODO läsa värde från temperatursensor
  124.  
  125.             txMsg.Id = 0x1201;
  126.             txMsg.Data.bytes[0] = relayStatus;
  127.             txMsg.DataLength = 3;
  128.  
  129.             Can_Send( &txMsg );
  130.  
  131.         }
  132.  
  133.     }
  134.  
  135.  
  136.     return 0;
  137. }
  138.