Subversion Repositories HomeAutomation

Rev

Rev 175 | Rev 177 | Go to most recent revision | Blame | Compare with Previous | 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.  *   ADC=Vin*1024/Vref
  11.  *   Vout=( 10 mV/C )( Temperature C ) + 500 mV
  12.  *
  13.  *  Transmitts: DATA: <temperature high byte> <temperature low byte> <relay status>
  14.  *
  15.  */
  16.  
  17. /*-----------------------------------------------------------------------------
  18.  * Includes
  19.  *---------------------------------------------------------------------------*/
  20. /* system files */
  21. #include <avr/io.h>
  22. #include <avr/interrupt.h>
  23. #include <avr/wdt.h>
  24. #include <stdio.h>
  25. /* lib files */
  26. #include <can.h>
  27. #include <serial.h>
  28. #include <timebase.h>
  29.  
  30. #define OFF     0x00
  31. #define ON      0x01
  32. #define Vref    5
  33.  
  34. /*------------------------------------------------------------------------------
  35.  * Read relay state (OPEN/CLOSED) and temperature
  36.  * ---------------------------------------------------------------------------*/
  37. void sendRelayStatus( Can_Message_t* msg, uint8_t state )
  38. {
  39.     int16_t temp;
  40.  
  41.     /* Start measureing */
  42.     ADCSRA |= (1<<ADSC);
  43.  
  44.     /* Wait for conversion to complete */
  45.     while( ADCSRA & (1<<ADSC) ){}
  46.  
  47.     msg->Id = 0x1201; // temporary ID
  48.  
  49.     msg->Data.bytes[0] = state;
  50.  
  51.     /* Convert voltage to temperature */
  52.     temp = (ADCL & (ADCH<<8));
  53.     temp = temp*Vref/1024;
  54.     temp = (temp - 0.5)/(0.01);
  55.  
  56.     msg->Data.bytes[1]= temp;
  57.     msg->Data.bytes[2]= (temp>>8);
  58.     msg->DataLength = 3;
  59.  
  60.     Can_Send( &msg );
  61. }
  62.  
  63. /*-----------------------------------------------------------------------------
  64.  * Main Program
  65.  *---------------------------------------------------------------------------*/
  66. int main(void) {
  67.  
  68.     uint8_t relayStatus;
  69.  
  70.     Timebase_Init();
  71.     Serial_Init();
  72.     sei();
  73.  
  74.     /* Turn relay off */
  75.     PORTC &= ~(1<<PC1);
  76.     DDRC |= (1<<DDC1);
  77.  
  78.     relayStatus = OFF;
  79.  
  80.     /* Initiate ADC for reading temperature sensor */
  81.  
  82.     /* Wake up ADC */
  83.     PRR &= ~(1<<PRADC);
  84.     /* Enable AREF and ADC7 */
  85.     ADMUX = 0x07;
  86.     ADCSRA |= (1<<ADEN);
  87.  
  88.     printf("\n------------------------------------------------------------\n");
  89.     printf(  "   CAN: Relay\n");
  90.     printf(  "------------------------------------------------------------\n");
  91.  
  92.  
  93.     printf("CanInit...");
  94.     if (Can_Init() != CAN_OK) {
  95.         printf("FAILED!\n");
  96.     }else{
  97.         printf("OK!\n");
  98.     }
  99.  
  100.     uint32_t timeStamp = 0;
  101.  
  102.     Can_Message_t txMsg;
  103.     Can_Message_t rxMsg;
  104.     txMsg.Id = 0;
  105.     txMsg.RemoteFlag = 0;
  106.     txMsg.ExtendedFlag = 1;
  107.  
  108.  
  109.     /* main loop */
  110.     while (1) {
  111.         /* service the CAN routines */
  112.         Can_Service();
  113.  
  114.         /* check if any messages have been received */
  115.         while (Can_Receive(&rxMsg) == CAN_OK) {
  116.             /* This relay is adressed*/
  117.             if( rxMsg.Id == 0x1200 ){
  118.  
  119.                 if( rxMsg.Data.bytes[0] == 0x01 ){
  120.                     /* Turn relay on */
  121.  
  122.                     /* Set as input and enable pull-up */
  123.                     DDRC &= ~(1<<DDC1);
  124.                     PORTC |= (1<<PC1);
  125.  
  126.                     relayStatus = ON;
  127.  
  128.                 }else if(rxMsg.Data.bytes[0] == 0x02){
  129.                     /* Turn relay off */
  130.  
  131.                     PORTC &= ~(1<<PC1);
  132.                     DDRC |= (1<<DDC1);
  133.  
  134.                     relayStatus = OFF;
  135.  
  136.                 }else if(rxMsg.Data.bytes[0] == 0x03){
  137.                     /* Toggle relay */
  138.  
  139.                     if(relayStatus == ON){
  140.                         PORTC &= ~(1<<PC1);
  141.                         DDRC |= (1<<DDC1);
  142.  
  143.                         relayStatus = OFF;
  144.  
  145.                     }else{
  146.                         DDRC &= ~(1<<DDC1);
  147.                         PORTC |= (1<<PC1);
  148.  
  149.                         relayStatus = ON;
  150.                     }
  151.  
  152.                 }else if(rxMsg.Data.bytes[0] == 0x04){
  153.                     /* Get relay status (ON/OFF?, temperature) */
  154.                     sendRelayStatus( &txMsg, relayStatus );
  155.                 }
  156.             }
  157.         }
  158.  
  159.         // TODO
  160.         // ska status på relä och temperatur skickas periodiskt?
  161.         // tätare intervall om temperaturen kommer över en viss gräns?
  162.  
  163.         if( Timebase_PassedTimeMillis(timeStamp) >=5000){
  164.             timeStamp = Timebase_CurrentTime();
  165.             /* Get relay status (ON/OFF?, temperature) */
  166.  
  167.              sendRelayStatus( &txMsg, relayStatus );
  168.         }
  169.     }
  170.     return 0;
  171. }
  172.  
  173.