Details | Last modification | View Log | SVN | RSS feed
| Rev | Author | Line No. | Line |
|---|---|---|---|
| 153 | arune | 1 | /** |
| 2 | * DS18S20 over CAN program. |
||
| 3 | * |
||
| 4 | * @target AVR |
||
| 5 | * @date 2006-12-09 |
||
| 6 | * @author Jimmy Myhrman, Anders Runeson |
||
| 7 | * |
||
| 8 | * Högst experimentell, decimaldel fel vid negativ temperatur? |
||
| 9 | * negativ temperatur helt otestad! |
||
| 10 | * |
||
| 11 | */ |
||
| 12 | |||
| 13 | /*----------------------------------------------------------------------------- |
||
| 14 | * Includes |
||
| 15 | *---------------------------------------------------------------------------*/ |
||
| 16 | /* system files */ |
||
| 17 | #include <avr/io.h> |
||
| 18 | #include <avr/interrupt.h> |
||
| 19 | #include <avr/wdt.h> |
||
| 20 | #include <stdio.h> |
||
| 21 | /* lib files */ |
||
| 22 | #include <can.h> |
||
| 23 | #include <uart.h> |
||
| 24 | #include <timebase.h> |
||
| 25 | |||
| 26 | #include <onewire.h> |
||
| 27 | #include <ds18x20.h> |
||
| 28 | |||
| 29 | #include <delay.h> |
||
| 30 | |||
| 31 | |||
| 169 | arune | 32 | |
| 153 | arune | 33 | #define MAXSENSORS 4 |
| 34 | |||
| 35 | uint8_t gSensorIDs[MAXSENSORS][OW_ROMCODE_SIZE]; |
||
| 36 | |||
| 37 | uint8_t search_sensors(void) |
||
| 38 | { |
||
| 39 | uint8_t i; |
||
| 40 | uint8_t id[OW_ROMCODE_SIZE]; |
||
| 41 | uint8_t diff, nSensors; |
||
| 42 | |||
| 43 | printf( "\nScanning Bus for DS18X20\n" ); |
||
| 44 | |||
| 45 | nSensors = 0; |
||
| 46 | |||
| 47 | for( diff = OW_SEARCH_FIRST; |
||
| 48 | diff != OW_LAST_DEVICE && nSensors < MAXSENSORS ; ) |
||
| 49 | { |
||
| 50 | DS18X20_find_sensor( &diff, &id[0] ); |
||
| 51 | |||
| 52 | if( diff == OW_PRESENCE_ERR ) { |
||
| 53 | printf( "No Sensor found\n" ); |
||
| 54 | break; |
||
| 55 | } |
||
| 56 | |||
| 57 | if( diff == OW_DATA_ERR ) { |
||
| 58 | printf( "Bus Error\n" ); |
||
| 59 | break; |
||
| 60 | } |
||
| 61 | |||
| 62 | for (i=0;i<OW_ROMCODE_SIZE;i++) |
||
| 63 | gSensorIDs[nSensors][i]=id[i]; |
||
| 64 | |||
| 65 | nSensors++; |
||
| 66 | } |
||
| 67 | |||
| 68 | return nSensors; |
||
| 69 | } |
||
| 70 | |||
| 71 | |||
| 169 | arune | 72 | |
| 153 | arune | 73 | /*----------------------------------------------------------------------------- |
| 74 | * Main Program |
||
| 75 | *---------------------------------------------------------------------------*/ |
||
| 76 | int main(void) { |
||
| 77 | uint8_t nSensors, i; |
||
| 78 | uint8_t subzero, cel, cel_frac_bits; |
||
| 79 | |||
| 221 | arune | 80 | Mcu_Init(); |
| 153 | arune | 81 | Timebase_Init(); |
| 82 | Serial_Init(); |
||
| 83 | |||
| 202 | arune | 84 | sei(); |
| 85 | |||
| 153 | arune | 86 | printf( "\nDS18X20 1-Wire-Reader\n" ); |
| 87 | printf( "-----------------------" ); |
||
| 88 | nSensors = search_sensors(); |
||
| 89 | printf( "%i DS18X20 Sensor(s) available:\n", (int) nSensors ); |
||
| 90 | |||
| 91 | for (i=0; i<nSensors; i++) { |
||
| 92 | printf("Sensor# %i is a ", (int) i+1); |
||
| 93 | if ( gSensorIDs[i][0] == DS18S20_ID) |
||
| 94 | printf("DS18S20/DS1820"); |
||
| 95 | else printf("DS18B20"); |
||
| 96 | printf(" which is "); |
||
| 97 | if ( DS18X20_get_power_status( &gSensorIDs[i][0] ) == |
||
| 98 | DS18X20_POWER_PARASITE ) |
||
| 99 | printf( "parasite" ); |
||
| 100 | else printf( "externally" ); |
||
| 101 | printf( " powered\n" ); |
||
| 102 | } |
||
| 103 | |||
| 104 | printf("CanInit...\n"); |
||
| 105 | if (Can_Init() != CAN_OK) { |
||
| 106 | printf("FAILED!\n"); |
||
| 107 | } |
||
| 108 | else { |
||
| 109 | printf("OK!\n"); |
||
| 110 | } |
||
| 111 | |||
| 169 | arune | 112 | uint32_t timeStamp = 0; |
| 113 | |||
| 153 | arune | 114 | Can_Message_t txMsg; |
| 115 | Can_Message_t rxMsg; |
||
| 116 | |||
| 117 | txMsg.DataLength = 2; |
||
| 167 | eqlazer | 118 | txMsg.Id = 0; |
| 153 | arune | 119 | txMsg.RemoteFlag = 0; |
| 120 | txMsg.ExtendedFlag = 1; |
||
| 169 | arune | 121 | |
| 122 | /* main loop */ |
||
| 153 | arune | 123 | while (1) { |
| 124 | /* service the CAN routines */ |
||
| 125 | Can_Service(); |
||
| 126 | |||
| 127 | /* check if any messages have been received */ |
||
| 128 | while (Can_Receive(&rxMsg) == CAN_OK) { |
||
| 169 | arune | 129 | |
| 130 | } |
||
| 153 | arune | 131 | |
| 132 | /* check temperature and send on CAN once every other second */ |
||
| 133 | if (Timebase_PassedTimeMillis(timeStamp) >= 2000) { |
||
| 134 | timeStamp = Timebase_CurrentTime(); |
||
| 135 | |||
| 136 | if ( DS18X20_start_meas( DS18X20_POWER_PARASITE, NULL ) == DS18X20_OK) { |
||
| 169 | arune | 137 | printf("Measuring temperature... "); |
| 153 | arune | 138 | delay_ms(DS18B20_TCONV_12BIT); |
| 139 | for ( i=0; i<nSensors; i++ ) { |
||
| 140 | if ( DS18X20_read_meas( &gSensorIDs[i][0], &subzero, |
||
| 141 | &cel, &cel_frac_bits) == DS18X20_OK ) { |
||
| 142 | |||
| 143 | //txMsg.Data.bytes[0] = subzero; |
||
| 144 | if (subzero) { |
||
| 145 | txMsg.Data.bytes[i*2] = -cel; |
||
| 169 | arune | 146 | txMsg.Data.bytes[i*2+1] = ~(cel_frac_bits<<4); |
| 153 | arune | 147 | } else { |
| 148 | txMsg.Data.bytes[i*2] = cel; |
||
| 169 | arune | 149 | txMsg.Data.bytes[i*2+1] = (cel_frac_bits<<4); |
| 153 | arune | 150 | } |
| 169 | arune | 151 | |
| 153 | arune | 152 | } |
| 154 | arune | 153 | else printf("CRC Error (lost connection?)\n"); |
| 153 | arune | 154 | } |
| 169 | arune | 155 | |
| 156 | txMsg.DataLength = nSensors*2; |
||
| 157 | printf("sending...\n"); |
||
| 158 | /* send txMsg */ |
||
| 159 | Can_Send(&txMsg); |
||
| 153 | arune | 160 | } |
| 154 | arune | 161 | else printf("Start meas. failed (short circuit?)\n"); |
| 153 | arune | 162 | |
| 163 | } |
||
| 164 | } |
||
| 165 | |||
| 166 | return 0; |
||
| 167 | } |