Details | Last modification | View Log | SVN | RSS feed
| Rev | Author | Line No. | Line |
|---|---|---|---|
| 171 | eqlazer | 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 |
||
| 175 | eqlazer | 10 | * ADC=Vin*1024/Vref |
| 176 | eqlazer | 11 | * Vout=( 10 mV/C )( Temperature C ) + 500 mV |
| 175 | eqlazer | 12 | * |
| 176 | eqlazer | 13 | * Transmitts: DATA: <temperature high byte> <temperature low byte> <relay status> |
| 14 | * |
||
| 171 | eqlazer | 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 |
||
| 176 | eqlazer | 32 | #define Vref 5 |
| 171 | eqlazer | 33 | |
| 175 | eqlazer | 34 | /*------------------------------------------------------------------------------ |
| 35 | * Read relay state (OPEN/CLOSED) and temperature |
||
| 36 | * ---------------------------------------------------------------------------*/ |
||
| 176 | eqlazer | 37 | void sendRelayStatus( Can_Message_t* msg, uint8_t state ) |
| 175 | eqlazer | 38 | { |
| 176 | eqlazer | 39 | int16_t temp; |
| 175 | eqlazer | 40 | |
| 176 | eqlazer | 41 | /* Start measureing */ |
| 42 | ADCSRA |= (1<<ADSC); |
||
| 175 | eqlazer | 43 | |
| 176 | eqlazer | 44 | /* Wait for conversion to complete */ |
| 45 | while( ADCSRA & (1<<ADSC) ){} |
||
| 175 | eqlazer | 46 | |
| 176 | eqlazer | 47 | msg->Id = 0x1201; // temporary ID |
| 175 | eqlazer | 48 | |
| 176 | eqlazer | 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 ); |
||
| 175 | eqlazer | 61 | } |
| 62 | |||
| 171 | eqlazer | 63 | /*----------------------------------------------------------------------------- |
| 64 | * Main Program |
||
| 65 | *---------------------------------------------------------------------------*/ |
||
| 66 | int main(void) { |
||
| 67 | |||
| 68 | uint8_t relayStatus; |
||
| 69 | |||
| 176 | eqlazer | 70 | Timebase_Init(); |
| 71 | Serial_Init(); |
||
| 72 | sei(); |
||
| 171 | eqlazer | 73 | |
| 176 | eqlazer | 74 | /* Turn relay off */ |
| 75 | PORTC &= ~(1<<PC1); |
||
| 171 | eqlazer | 76 | DDRC |= (1<<DDC1); |
| 175 | eqlazer | 77 | |
| 171 | eqlazer | 78 | relayStatus = OFF; |
| 79 | |||
| 175 | eqlazer | 80 | /* Initiate ADC for reading temperature sensor */ |
| 171 | eqlazer | 81 | |
| 175 | eqlazer | 82 | /* Wake up ADC */ |
| 83 | PRR &= ~(1<<PRADC); |
||
| 84 | /* Enable AREF and ADC7 */ |
||
| 85 | ADMUX = 0x07; |
||
| 86 | ADCSRA |= (1<<ADEN); |
||
| 87 | |||
| 176 | eqlazer | 88 | printf("\n------------------------------------------------------------\n"); |
| 89 | printf( " CAN: Relay\n"); |
||
| 90 | printf( "------------------------------------------------------------\n"); |
||
| 171 | eqlazer | 91 | |
| 92 | |||
| 176 | eqlazer | 93 | printf("CanInit..."); |
| 94 | if (Can_Init() != CAN_OK) { |
||
| 95 | printf("FAILED!\n"); |
||
| 175 | eqlazer | 96 | }else{ |
| 97 | printf("OK!\n"); |
||
| 98 | } |
||
| 171 | eqlazer | 99 | |
| 175 | eqlazer | 100 | uint32_t timeStamp = 0; |
| 171 | eqlazer | 101 | |
| 175 | eqlazer | 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) { |
||
| 171 | eqlazer | 116 | /* This relay is adressed*/ |
| 117 | if( rxMsg.Id == 0x1200 ){ |
||
| 118 | |||
| 119 | if( rxMsg.Data.bytes[0] == 0x01 ){ |
||
| 120 | /* Turn relay on */ |
||
| 121 | |||
| 175 | eqlazer | 122 | /* Set as input and enable pull-up */ |
| 123 | DDRC &= ~(1<<DDC1); |
||
| 124 | PORTC |= (1<<PC1); |
||
| 125 | |||
| 171 | eqlazer | 126 | relayStatus = ON; |
| 127 | |||
| 128 | }else if(rxMsg.Data.bytes[0] == 0x02){ |
||
| 129 | /* Turn relay off */ |
||
| 130 | |||
| 176 | eqlazer | 131 | PORTC &= ~(1<<PC1); |
| 175 | eqlazer | 132 | DDRC |= (1<<DDC1); |
| 133 | |||
| 171 | eqlazer | 134 | relayStatus = OFF; |
| 135 | |||
| 136 | }else if(rxMsg.Data.bytes[0] == 0x03){ |
||
| 137 | /* Toggle relay */ |
||
| 138 | |||
| 139 | if(relayStatus == ON){ |
||
| 176 | eqlazer | 140 | PORTC &= ~(1<<PC1); |
| 175 | eqlazer | 141 | DDRC |= (1<<DDC1); |
| 176 | eqlazer | 142 | |
| 171 | eqlazer | 143 | relayStatus = OFF; |
| 175 | eqlazer | 144 | |
| 171 | eqlazer | 145 | }else{ |
| 175 | eqlazer | 146 | DDRC &= ~(1<<DDC1); |
| 147 | PORTC |= (1<<PC1); |
||
| 176 | eqlazer | 148 | |
| 171 | eqlazer | 149 | relayStatus = ON; |
| 150 | } |
||
| 151 | |||
| 152 | }else if(rxMsg.Data.bytes[0] == 0x04){ |
||
| 153 | /* Get relay status (ON/OFF?, temperature) */ |
||
| 176 | eqlazer | 154 | sendRelayStatus( &txMsg, relayStatus ); |
| 171 | eqlazer | 155 | } |
| 156 | } |
||
| 157 | } |
||
| 158 | |||
| 175 | eqlazer | 159 | // TODO |
| 160 | // ska status på relä och temperatur skickas periodiskt? |
||
| 161 | // tätare intervall om temperaturen kommer över en viss gräns? |
||
| 162 | |||
| 171 | eqlazer | 163 | if( Timebase_PassedTimeMillis(timeStamp) >=5000){ |
| 164 | timeStamp = Timebase_CurrentTime(); |
||
| 175 | eqlazer | 165 | /* Get relay status (ON/OFF?, temperature) */ |
| 171 | eqlazer | 166 | |
| 176 | eqlazer | 167 | sendRelayStatus( &txMsg, relayStatus ); |
| 171 | eqlazer | 168 | } |
| 169 | } |
||
| 170 | return 0; |
||
| 171 | } |
||
| 175 | eqlazer | 172 |