070914

Dependencies:   FreescaleIAP MODSERIAL mbed monitor timer0

Fork of 17_PT1000 by Temp27

Committer:
rs27
Date:
Sat Jul 26 07:29:23 2014 +0000
Revision:
0:e248310dfcdb
Child:
1:82c47e2d81f0
test

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rs27 0:e248310dfcdb 1 // Version 07 30.06.2013
rs27 0:e248310dfcdb 2 // die Ausgabe auf das Format #nr val umgestellt
rs27 0:e248310dfcdb 3
rs27 0:e248310dfcdb 4 #include "mbed.h"
rs27 0:e248310dfcdb 5 #include "DS2482.h"
rs27 0:e248310dfcdb 6 #include "timer0.h"
rs27 0:e248310dfcdb 7 #include "Buffer.h"
rs27 0:e248310dfcdb 8 #include "monitor.h"
rs27 0:e248310dfcdb 9
rs27 0:e248310dfcdb 10 #define CR 13
rs27 0:e248310dfcdb 11
rs27 0:e248310dfcdb 12 timer0 down_timer;
rs27 0:e248310dfcdb 13 Serial pc(PTC4, PTC3);
rs27 0:e248310dfcdb 14 Buffer <char> buf;
rs27 0:e248310dfcdb 15 monitor mon;
rs27 0:e248310dfcdb 16
rs27 0:e248310dfcdb 17 // sda, scl, adr
rs27 0:e248310dfcdb 18 DS2482 ow(PTE0,PTE1,0x30);
rs27 0:e248310dfcdb 19
rs27 0:e248310dfcdb 20 DigitalOut r(LED_RED);
rs27 0:e248310dfcdb 21 DigitalOut g(LED_GREEN);
rs27 0:e248310dfcdb 22 DigitalOut b(LED_BLUE);
rs27 0:e248310dfcdb 23
rs27 0:e248310dfcdb 24 DigitalOut led1(LED1);
rs27 0:e248310dfcdb 25 //DigitalOut LED2(PTA2);
rs27 0:e248310dfcdb 26 DigitalOut LED5(PTA5);
rs27 0:e248310dfcdb 27
rs27 0:e248310dfcdb 28 // Schalter 4051
rs27 0:e248310dfcdb 29 DigitalOut DC_A(PTE2);
rs27 0:e248310dfcdb 30 DigitalOut DC_B(PTE3);
rs27 0:e248310dfcdb 31 DigitalOut DC_C(PTE4);
rs27 0:e248310dfcdb 32 DigitalOut DC_EN(PTE5);
rs27 0:e248310dfcdb 33
rs27 0:e248310dfcdb 34 // PT1000 Karte 1
rs27 0:e248310dfcdb 35 AnalogIn an1(PTC0);
rs27 0:e248310dfcdb 36 AnalogIn an2(PTB1);
rs27 0:e248310dfcdb 37 AnalogIn an3(PTB2);
rs27 0:e248310dfcdb 38 AnalogIn an4(PTB3);
rs27 0:e248310dfcdb 39 AnalogIn an5(PTC2);
rs27 0:e248310dfcdb 40 AnalogIn an6(PTD5);
rs27 0:e248310dfcdb 41
rs27 0:e248310dfcdb 42 // 0 bis 5V
rs27 0:e248310dfcdb 43 AnalogIn an13(PTD6);
rs27 0:e248310dfcdb 44
rs27 0:e248310dfcdb 45 // Analog pins
rs27 0:e248310dfcdb 46 /*
rs27 0:e248310dfcdb 47 1 PTE20, ADC0_SE0, 0}, k2.2
rs27 0:e248310dfcdb 48 2 PTE22, ADC0_SE3, 0}, k2.3
rs27 0:e248310dfcdb 49 3 PTE21, ADC0_SE4a, 0},
rs27 0:e248310dfcdb 50 4 PTE29, ADC0_SE4b, 0}, k2,4
rs27 0:e248310dfcdb 51 5 PTE30, ADC0_SE23, 0}, k2.5
rs27 0:e248310dfcdb 52 6 PTE23, ADC0_SE7a, 0},
rs27 0:e248310dfcdb 53 7 PTB0, ADC0_SE8, 0}, k2.1
rs27 0:e248310dfcdb 54 8 PTB1, ADC0_SE9, 0}, k1.2
rs27 0:e248310dfcdb 55 9 PTB2, ADC0_SE12, 0}, k1.3
rs27 0:e248310dfcdb 56 10 PTB3, ADC0_SE13, 0}, k1.4
rs27 0:e248310dfcdb 57 11 PTC0, ADC0_SE14, 0}, k1.1
rs27 0:e248310dfcdb 58 12 PTC1, ADC0_SE15, 0}, k2.6
rs27 0:e248310dfcdb 59 13 PTC2, ADC0_SE11, 0}, k1.5
rs27 0:e248310dfcdb 60 14 PTD1, ADC0_SE5b, 0},
rs27 0:e248310dfcdb 61 15 PTD5, ADC0_SE6b, 0}, k1.6
rs27 0:e248310dfcdb 62 16 PTD6, ADC0_SE7b, 0}, k3.1
rs27 0:e248310dfcdb 63 */
rs27 0:e248310dfcdb 64
rs27 0:e248310dfcdb 65 float temp1, temp_neu;
rs27 0:e248310dfcdb 66 uint16_t temp_word;
rs27 0:e248310dfcdb 67 uint8_t n, y, status, ds1820_status;
rs27 0:e248310dfcdb 68
rs27 0:e248310dfcdb 69 //--------------------------------------------------------
rs27 0:e248310dfcdb 70 // Interruptroutine wird bei jedem ankommenden Zeichen aufgerufen
rs27 0:e248310dfcdb 71 void rx_handler(void)
rs27 0:e248310dfcdb 72 {
rs27 0:e248310dfcdb 73 // Note: you need to actually read from the serial to clear the RX interrupt
rs27 0:e248310dfcdb 74
rs27 0:e248310dfcdb 75 char ch;
rs27 0:e248310dfcdb 76
rs27 0:e248310dfcdb 77 while (pc.readable())
rs27 0:e248310dfcdb 78 {
rs27 0:e248310dfcdb 79 ch = pc.getc();
rs27 0:e248310dfcdb 80 buf.put(ch);
rs27 0:e248310dfcdb 81 }
rs27 0:e248310dfcdb 82 }
rs27 0:e248310dfcdb 83
rs27 0:e248310dfcdb 84
rs27 0:e248310dfcdb 85 int read_mw(uint8_t pos)
rs27 0:e248310dfcdb 86 {
rs27 0:e248310dfcdb 87 uint8_t n;
rs27 0:e248310dfcdb 88
rs27 0:e248310dfcdb 89 int val = 0;
rs27 0:e248310dfcdb 90 int mw = 0;
rs27 0:e248310dfcdb 91
rs27 0:e248310dfcdb 92 // 16 Messungen für eine bessere Mittelung durchführen
rs27 0:e248310dfcdb 93
rs27 0:e248310dfcdb 94 for (n = 0; n < 16; n++)
rs27 0:e248310dfcdb 95 {
rs27 0:e248310dfcdb 96 switch (pos)
rs27 0:e248310dfcdb 97 {
rs27 0:e248310dfcdb 98 // PT1000 Karte 1
rs27 0:e248310dfcdb 99 case 0: val = an1.read_u16(); break;
rs27 0:e248310dfcdb 100 case 1: val = an2.read_u16(); break;
rs27 0:e248310dfcdb 101 case 2: val = an3.read_u16(); break;
rs27 0:e248310dfcdb 102 case 3: val = an4.read_u16(); break;
rs27 0:e248310dfcdb 103 case 4: val = an5.read_u16(); break;
rs27 0:e248310dfcdb 104 case 5: val = an6.read_u16(); break;
rs27 0:e248310dfcdb 105 }
rs27 0:e248310dfcdb 106 mw += val;
rs27 0:e248310dfcdb 107 } // end for
rs27 0:e248310dfcdb 108
rs27 0:e248310dfcdb 109 // Temperatur berechnen
rs27 0:e248310dfcdb 110 // Wert durch 16 teilen
rs27 0:e248310dfcdb 111
rs27 0:e248310dfcdb 112 mw = mw >> 4;
rs27 0:e248310dfcdb 113 return mw;
rs27 0:e248310dfcdb 114 }
rs27 0:e248310dfcdb 115
rs27 0:e248310dfcdb 116
rs27 0:e248310dfcdb 117 int main()
rs27 0:e248310dfcdb 118 {
rs27 0:e248310dfcdb 119
rs27 0:e248310dfcdb 120 pc.baud(56700);
rs27 0:e248310dfcdb 121 pc.attach(&rx_handler, Serial::RxIrq);
rs27 0:e248310dfcdb 122 // pc.printf("\n V08 was compiled on %s %s \n", __DATE__,__TIME__);
rs27 0:e248310dfcdb 123
rs27 0:e248310dfcdb 124 down_timer.SetCountdownTimer(0,1,50); // Timer für die LED
rs27 0:e248310dfcdb 125 down_timer.SetCountdownTimer(1,1,500); // Timer für den one wire bus
rs27 0:e248310dfcdb 126 down_timer.SetCountdownTimer(2,1,1000);// Timer für die Ausgabe der Daten
rs27 0:e248310dfcdb 127
rs27 0:e248310dfcdb 128 r = g = b = 1; // RGB LED ausschalten
rs27 0:e248310dfcdb 129 //--------------------------------------------------------------------
rs27 0:e248310dfcdb 130 // one wire bus
rs27 0:e248310dfcdb 131
rs27 0:e248310dfcdb 132 // pc.printf("\n ++++ on wire search ++++\n");
rs27 0:e248310dfcdb 133 wait (0.1);
rs27 0:e248310dfcdb 134 ow.DS18XX_Read_Address();
rs27 0:e248310dfcdb 135
rs27 0:e248310dfcdb 136 n = ow.ow.devices;
rs27 0:e248310dfcdb 137
rs27 0:e248310dfcdb 138 // Anzahl der ow Bausteine ermitteln
rs27 0:e248310dfcdb 139 y = 0;
rs27 0:e248310dfcdb 140 for (n = 0; n < OW_MAX_DEVICES; n++)
rs27 0:e248310dfcdb 141 {
rs27 0:e248310dfcdb 142 if ((ow.ow.device_table[n].status & 0x0f) == 1) y++;
rs27 0:e248310dfcdb 143 } // end for(...
rs27 0:e248310dfcdb 144
rs27 0:e248310dfcdb 145 // pc.printf("\n %d devices FOUND \n",y);
rs27 0:e248310dfcdb 146
rs27 0:e248310dfcdb 147 // ow 64 bit Adressen ausgeben
rs27 0:e248310dfcdb 148 for (n = 0; n < OW_MAX_DEVICES; n++)
rs27 0:e248310dfcdb 149 {
rs27 0:e248310dfcdb 150 if ((ow.ow.device_table[n].status & 0x0f) == 1)
rs27 0:e248310dfcdb 151 {
rs27 0:e248310dfcdb 152 //pc.printf("\n device #%2d ",n);
rs27 0:e248310dfcdb 153 //pc.printf(": adr: %2d: ",ow.ow.device_table[n].adr );
rs27 0:e248310dfcdb 154 for (y = 0; y < 8; y++)
rs27 0:e248310dfcdb 155 {
rs27 0:e248310dfcdb 156 // pc.printf(" %02x",ow.ow.device_table[n].rom[y]);
rs27 0:e248310dfcdb 157 }
rs27 0:e248310dfcdb 158 }
rs27 0:e248310dfcdb 159
rs27 0:e248310dfcdb 160 } // end for(...
rs27 0:e248310dfcdb 161
rs27 0:e248310dfcdb 162 //pc.printf("\n");
rs27 0:e248310dfcdb 163
rs27 0:e248310dfcdb 164 //--------------------------------------------------------------------
rs27 0:e248310dfcdb 165 // Anfangswert bestimmen
rs27 0:e248310dfcdb 166
rs27 0:e248310dfcdb 167 temp_neu = read_mw(0);
rs27 0:e248310dfcdb 168
rs27 0:e248310dfcdb 169 //pc.printf("\nPT1000; DS18B20");
rs27 0:e248310dfcdb 170 status = 0;
rs27 0:e248310dfcdb 171 ds1820_status = 0;
rs27 0:e248310dfcdb 172
rs27 0:e248310dfcdb 173 //--------------------------------------------------------------------
rs27 0:e248310dfcdb 174 // Schleife fuer die Datenerfassung
rs27 0:e248310dfcdb 175
rs27 0:e248310dfcdb 176 while(1)
rs27 0:e248310dfcdb 177 {
rs27 0:e248310dfcdb 178 mon.get_line();
rs27 0:e248310dfcdb 179
rs27 0:e248310dfcdb 180 //-------------------------------------------
rs27 0:e248310dfcdb 181 // timer 0 steuert die LED
rs27 0:e248310dfcdb 182
rs27 0:e248310dfcdb 183 if (down_timer.GetTimerStatus(0) == 0)
rs27 0:e248310dfcdb 184 {
rs27 0:e248310dfcdb 185 down_timer.SetCountdownTimer(0,1,500);
rs27 0:e248310dfcdb 186 LED5 = !LED5;
rs27 0:e248310dfcdb 187 }
rs27 0:e248310dfcdb 188
rs27 0:e248310dfcdb 189 //-------------------------------------------
rs27 0:e248310dfcdb 190 // timer 1 steuert den one wire bus
rs27 0:e248310dfcdb 191
rs27 0:e248310dfcdb 192 if (down_timer.GetTimerStatus(1) == 0)
rs27 0:e248310dfcdb 193 {
rs27 0:e248310dfcdb 194 switch (ds1820_status)
rs27 0:e248310dfcdb 195 {
rs27 0:e248310dfcdb 196 case 0 :
rs27 0:e248310dfcdb 197 // Temperaturwandler starten und 0,8 sek. warten
rs27 0:e248310dfcdb 198 // Start conversion for all DS1820 sensors
rs27 0:e248310dfcdb 199 // pc.printf("\ntrigger one wire bus");
rs27 0:e248310dfcdb 200
rs27 0:e248310dfcdb 201 ow.ds1820_start_conversion(0xFF); // alle Bausteine am Bus triggern
rs27 0:e248310dfcdb 202
rs27 0:e248310dfcdb 203 // Delay until conversion is completed
rs27 0:e248310dfcdb 204 down_timer.SetCountdownTimer(1,1,750); // Timer = 750ms
rs27 0:e248310dfcdb 205
rs27 0:e248310dfcdb 206 // beim nächsten Auruf die Temperatur lesen
rs27 0:e248310dfcdb 207 ds1820_status = 1;
rs27 0:e248310dfcdb 208
rs27 0:e248310dfcdb 209 break;
rs27 0:e248310dfcdb 210
rs27 0:e248310dfcdb 211 case 1 : // Temperatur von Temperaturfühler 1 lesen und 0,05 sek. warten
rs27 0:e248310dfcdb 212 case 2 : // Temperatur von Temperaturfühler 2 lesen und 0,05 sek. warten
rs27 0:e248310dfcdb 213 case 3 : // Temperatur von Temperaturfühler 3 lesen und 0,05 sek. warten
rs27 0:e248310dfcdb 214 case 4 : // Temperatur von Temperaturfühler 4 lesen und 0,05 sek. warten
rs27 0:e248310dfcdb 215 case 5 : // Temperatur von Temperaturfühler 5 lesen und 0,05 sek. warten
rs27 0:e248310dfcdb 216 case 6 : // Temperatur von Temperaturfühler 6 lesen und 0,05 sek. warten
rs27 0:e248310dfcdb 217 case 7 : // Temperatur von Temperaturfühler 7 lesen und 0,05 sek. warten
rs27 0:e248310dfcdb 218 case 8 : // Temperatur von Temperaturfühler 8 lesen und 0,05 sek. warten
rs27 0:e248310dfcdb 219 case 9 : // Temperatur von Temperaturfühler 9 lesen und 0,05 sek. warten
rs27 0:e248310dfcdb 220 case 10 : // Temperatur von Temperaturfühler 10 lesen und 0,05 sek. warten
rs27 0:e248310dfcdb 221 case 11 : // Temperatur von Temperaturfühler 11 lesen und 0,05 sek. warten
rs27 0:e248310dfcdb 222 case 12 : // Temperatur von Temperaturfühler 12 lesen und 0,05 sek. warten
rs27 0:e248310dfcdb 223 case 13 : // Temperatur von Temperaturfühler 13 lesen und 0,05 sek. warten
rs27 0:e248310dfcdb 224 case 14 : // Temperatur von Temperaturfühler 14 lesen und 0,05 sek. warten
rs27 0:e248310dfcdb 225 case 15 : // Temperatur von Temperaturfühler 15 lesen und 0,05 sek. warten
rs27 0:e248310dfcdb 226 case 16 : // Temperatur von Temperaturfühler 16 lesen und 0,05 sek. warten
rs27 0:e248310dfcdb 227
rs27 0:e248310dfcdb 228 // Write temperature of all registered sensors
rs27 0:e248310dfcdb 229 uint8_t pos = ds1820_status - 1;
rs27 0:e248310dfcdb 230 if ((ow.ow.device_table[pos].status & 0x0f) != 0)
rs27 0:e248310dfcdb 231 {
rs27 0:e248310dfcdb 232 ow.ow.device_table_index = pos;
rs27 0:e248310dfcdb 233 ow.ds18B20_read_hrtemp();
rs27 0:e248310dfcdb 234 // pc.printf(" %2.2f; ",ow.ow.device_table[pos].value);
rs27 0:e248310dfcdb 235 }
rs27 0:e248310dfcdb 236
rs27 0:e248310dfcdb 237 ds1820_status++;
rs27 0:e248310dfcdb 238 if (ds1820_status > OW_MAX_DEVICES)
rs27 0:e248310dfcdb 239 {
rs27 0:e248310dfcdb 240 ds1820_status = 0;
rs27 0:e248310dfcdb 241 down_timer.SetCountdownTimer(1,2,10); // Timer deakivieren
rs27 0:e248310dfcdb 242 // pc.printf("\nexit one wire bus");
rs27 0:e248310dfcdb 243 }
rs27 0:e248310dfcdb 244 else
rs27 0:e248310dfcdb 245 down_timer.SetCountdownTimer(1,1,10); // 10 ms Timer
rs27 0:e248310dfcdb 246
rs27 0:e248310dfcdb 247 break;
rs27 0:e248310dfcdb 248
rs27 0:e248310dfcdb 249 } // end switch
rs27 0:e248310dfcdb 250 } // if (down_timer
rs27 0:e248310dfcdb 251
rs27 0:e248310dfcdb 252
rs27 0:e248310dfcdb 253 //-------------------------------------------
rs27 0:e248310dfcdb 254 // timer 2 steuert die Datenausgabe
rs27 0:e248310dfcdb 255
rs27 0:e248310dfcdb 256 if (down_timer.GetTimerStatus(2) == 0)
rs27 0:e248310dfcdb 257 {
rs27 0:e248310dfcdb 258 down_timer.SetCountdownTimer(2,1,1000);
rs27 0:e248310dfcdb 259
rs27 0:e248310dfcdb 260 //------------------------------------------------------
rs27 0:e248310dfcdb 261 // PT1000 lesen und berechnen und ausgeben
rs27 0:e248310dfcdb 262 // 16 mal den Eingang fuer eine bessere Mittelung lesen
rs27 0:e248310dfcdb 263 //
rs27 0:e248310dfcdb 264
rs27 0:e248310dfcdb 265 temp_word = read_mw(0);
rs27 0:e248310dfcdb 266 pc.printf("#0 %d\n",temp_word); // Rohdaten ausgeben
rs27 0:e248310dfcdb 267
rs27 0:e248310dfcdb 268 temp_word = read_mw(1);
rs27 0:e248310dfcdb 269 pc.printf("#1 %d\n",temp_word); // Rohdaten ausgeben
rs27 0:e248310dfcdb 270
rs27 0:e248310dfcdb 271 temp_word = read_mw(2);
rs27 0:e248310dfcdb 272 pc.printf("#2 %d\n",temp_word); // Rohdaten ausgeben
rs27 0:e248310dfcdb 273
rs27 0:e248310dfcdb 274 temp_word = read_mw(3);
rs27 0:e248310dfcdb 275 pc.printf("#3 %d\n",temp_word); // Rohdaten ausgeben
rs27 0:e248310dfcdb 276
rs27 0:e248310dfcdb 277
rs27 0:e248310dfcdb 278 //------------------------------------------------------
rs27 0:e248310dfcdb 279 // one wire Daten lesen und ausgeben
rs27 0:e248310dfcdb 280
rs27 0:e248310dfcdb 281 for (n = 0; n < OW_MAX_DEVICES; n++) // Ausgabe der Daten
rs27 0:e248310dfcdb 282 {
rs27 0:e248310dfcdb 283 if ((ow.ow.device_table[n].status & 0x0f) == 3) // Daten wurden gelesen
rs27 0:e248310dfcdb 284 {
rs27 0:e248310dfcdb 285 pc.printf("#%d %d\n",(n+20), ow.ow.device_table[n].result);
rs27 0:e248310dfcdb 286 ow.ow.device_table[n].status = 2;
rs27 0:e248310dfcdb 287 }
rs27 0:e248310dfcdb 288 }
rs27 0:e248310dfcdb 289
rs27 0:e248310dfcdb 290 down_timer.SetCountdownTimer(1,1,10); // Messung neu starten
rs27 0:e248310dfcdb 291
rs27 0:e248310dfcdb 292 } // end if(down_timer ...
rs27 0:e248310dfcdb 293
rs27 0:e248310dfcdb 294 } // end while
rs27 0:e248310dfcdb 295 }
rs27 0:e248310dfcdb 296