03082014
Dependencies: Buffer ConfigFile SDFileSystem mbed mon timer0
Fork of 15_PT1000 by
main.cpp
- Committer:
- rs27
- Date:
- 2014-07-28
- Revision:
- 2:f48d2eb0cc55
- Parent:
- 1:82c47e2d81f0
- Child:
- 3:72a65324d50d
File content as of revision 2:f48d2eb0cc55:
// Version 10 27.07.2014 // die Ausgabe auf das Format #nr val umgestellt #include "mbed.h" #include "ConfigFile.h" #include "SDFileSystem.h" #include "DS2482.h" #include "timer0.h" #include "Buffer.h" #include "monitor.h" #define CR 13 SDFileSystem sd(PTD2, PTD3, PTC5, PTD0, "sd"); // The pinout (MOSI, MISO, SCLK, CS) timer0 down_timer; // Zeitsteuerung Serial pc(USBTX, USBRX); // tx, rx Buffer <char> buf; // Ringbuffer für ankommende Zeichen // sda, scl, adr DS2482 ow(PTE0,PTE1,0x30); DigitalOut r(LED_RED); DigitalOut g(LED_GREEN); DigitalOut b(LED_BLUE); DigitalOut led1(LED1); //DigitalOut LED2(PTA2); DigitalOut LED5(PTA5); DigitalOut LED_4(PTA12); // Schalter 4051 DigitalOut DC_A(PTE2); DigitalOut DC_B(PTE3); DigitalOut DC_C(PTE4); DigitalOut DC_EN(PTE5); // PT1000 Karte 1 AnalogIn an1(PTC0); AnalogIn an2(PTB1); AnalogIn an3(PTB2); AnalogIn an4(PTB3); AnalogIn an5(PTC2); AnalogIn an6(PTD5); // 0 bis 5V AnalogIn an13(PTD6); // Analog pins /* 1 PTE20, ADC0_SE0, 0}, k2.2 2 PTE22, ADC0_SE3, 0}, k2.3 3 PTE21, ADC0_SE4a, 0}, 4 PTE29, ADC0_SE4b, 0}, k2,4 5 PTE30, ADC0_SE23, 0}, k2.5 6 PTE23, ADC0_SE7a, 0}, 7 PTB0, ADC0_SE8, 0}, k2.1 8 PTB1, ADC0_SE9, 0}, k1.2 9 PTB2, ADC0_SE12, 0}, k1.3 10 PTB3, ADC0_SE13, 0}, k1.4 11 PTC0, ADC0_SE14, 0}, k1.1 12 PTC1, ADC0_SE15, 0}, k2.6 13 PTC2, ADC0_SE11, 0}, k1.5 14 PTD1, ADC0_SE5b, 0}, 15 PTD5, ADC0_SE6b, 0}, k1.6 16 PTD6, ADC0_SE7b, 0}, k3.1 */ float temp1, temp_neu; uint16_t temp_word; uint8_t n, y, status, ds1820_status; float temp_float; ConfigFile cfg; char value[BUFSIZ]; //------------------------------------------------------------------------------ // Werte die auch über das config file gesetzt werden können float offset = 0.0; //------------------------------------------------------------------------------ // Interruptroutine wird bei jedem ankommenden Zeichen aufgerufen void rx_handler(void) { // Note: you need to actually read from the serial to clear the RX interrupt char ch; while (pc.readable()) { ch = pc.getc(); buf.put(ch); } } //------------------------------------------------------------------------------ // lesen der PT1000 AD-Werte // // Um Störungen zu reduzieren werden 16 Werte gelesen und daraus wird der // Mittelwert berechnet. Eine Messung dauert ca. 30µs. Somit wird für eine Messung // ca. eine Zeit von 0,5ms benötigt. // int read_mw(uint8_t pos) { uint8_t n; int val = 0; int mw = 0; LED_4 = 0; // 16 Messungen für eine bessere Mittelung durchführen for (n = 0; n < 16; n++) { switch (pos) { // PT1000 Karte 1 case 0: val = an1.read_u16(); break; case 1: val = an2.read_u16(); break; case 2: val = an3.read_u16(); break; case 3: val = an4.read_u16(); break; case 4: val = an5.read_u16(); break; case 5: val = an6.read_u16(); break; } mw += val; } // end for // Temperatur berechnen // Wert durch 16 teilen mw = mw >> 4; LED_4 = 1; return mw; } //------------------------------------------------------------------------------ // int main() { //------------------------------------------------------------------------------ // RS232 Schnittstellt welche auf den CMSIS-DAP (USB Port) weitergeleitet wird // pc.baud(9600); pc.attach(&rx_handler, Serial::RxIrq); pc.printf("\n V08 was compiled on %s %s \n", __DATE__,__TIME__); mon_init(); //------------------------------------------------------------------------------ // Timer für die Zeitsteuerung // down_timer.SetCountdownTimer(0,1,50); // Timer für die LED down_timer.SetCountdownTimer(1,1,500); // Timer für den one wire bus down_timer.SetCountdownTimer(2,1,1000);// Timer für die Ausgabe der Daten r = g = b = 1; // RGB LED ausschalten //-------------------------------------------------------------------- // Variablen von der SD Karte initialisieren cfg.read("/sd/input.cfg"); if (cfg.getValue("offset", &value[0], sizeof(value))) { offset = atof(value); pc.printf("\noffset = %f", offset); } //-------------------------------------------------------------------- // one wire bus /* // pc.printf("\n ++++ on wire search ++++\n"); wait (0.1); ow.DS18XX_Read_Address(); n = ow.ow.devices; // Anzahl der ow Bausteine ermitteln y = 0; for (n = 0; n < OW_MAX_DEVICES; n++) { if ((ow.ow.device_table[n].status & 0x0f) == 1) y++; } // end for(... // pc.printf("\n %d devices FOUND \n",y); // ow 64 bit Adressen ausgeben for (n = 0; n < OW_MAX_DEVICES; n++) { if ((ow.ow.device_table[n].status & 0x0f) == 1) { //pc.printf("\n device #%2d ",n); //pc.printf(": adr: %2d: ",ow.ow.device_table[n].adr ); for (y = 0; y < 8; y++) { // pc.printf(" %02x",ow.ow.device_table[n].rom[y]); } } } // end for(... //pc.printf("\n"); //-------------------------------------------------------------------- // Anfangswert bestimmen temp_neu = read_mw(0); //pc.printf("\nPT1000; DS18B20"); status = 0; ds1820_status = 0; */ //-------------------------------------------------------------------- // Schleife fuer die Datenerfassung while(1) { //------------------------------------------- // Prüfen ob Zeichen eingegeben wurden get_line(); //------------------------------------------- // timer 0 steuert die LED if (down_timer.GetTimerStatus(0) == 0) { down_timer.SetCountdownTimer(0,1,500); LED5 = !LED5; } //------------------------------------------- // timer 1 steuert den one wire bus /* if (down_timer.GetTimerStatus(1) == 0) { switch (ds1820_status) { case 0 : // Temperaturwandler starten und 0,8 sek. warten // Start conversion for all DS1820 sensors // pc.printf("\ntrigger one wire bus"); ow.ds1820_start_conversion(0xFF); // alle Bausteine am Bus triggern // Delay until conversion is completed down_timer.SetCountdownTimer(1,1,750); // Timer = 750ms // beim nächsten Auruf die Temperatur lesen ds1820_status = 1; break; case 1 : // Temperatur von Temperaturfühler 1 lesen und 0,05 sek. warten case 2 : // Temperatur von Temperaturfühler 2 lesen und 0,05 sek. warten case 3 : // Temperatur von Temperaturfühler 3 lesen und 0,05 sek. warten case 4 : // Temperatur von Temperaturfühler 4 lesen und 0,05 sek. warten case 5 : // Temperatur von Temperaturfühler 5 lesen und 0,05 sek. warten case 6 : // Temperatur von Temperaturfühler 6 lesen und 0,05 sek. warten case 7 : // Temperatur von Temperaturfühler 7 lesen und 0,05 sek. warten case 8 : // Temperatur von Temperaturfühler 8 lesen und 0,05 sek. warten case 9 : // Temperatur von Temperaturfühler 9 lesen und 0,05 sek. warten case 10 : // Temperatur von Temperaturfühler 10 lesen und 0,05 sek. warten case 11 : // Temperatur von Temperaturfühler 11 lesen und 0,05 sek. warten case 12 : // Temperatur von Temperaturfühler 12 lesen und 0,05 sek. warten case 13 : // Temperatur von Temperaturfühler 13 lesen und 0,05 sek. warten case 14 : // Temperatur von Temperaturfühler 14 lesen und 0,05 sek. warten case 15 : // Temperatur von Temperaturfühler 15 lesen und 0,05 sek. warten case 16 : // Temperatur von Temperaturfühler 16 lesen und 0,05 sek. warten // Write temperature of all registered sensors uint8_t pos = ds1820_status - 1; if ((ow.ow.device_table[pos].status & 0x0f) != 0) { ow.ow.device_table_index = pos; ow.ds18B20_read_hrtemp(); // pc.printf(" %2.2f; ",ow.ow.device_table[pos].value); } ds1820_status++; if (ds1820_status > OW_MAX_DEVICES) { ds1820_status = 0; down_timer.SetCountdownTimer(1,2,10); // Timer deakivieren // pc.printf("\nexit one wire bus"); } else down_timer.SetCountdownTimer(1,1,10); // 10 ms Timer break; } // end switch } // if (down_timer */ //------------------------------------------- // timer 2 steuert die Datenausgabe if (down_timer.GetTimerStatus(2) == 0) { down_timer.SetCountdownTimer(2,1,1000); //------------------------------------------------------ // PT1000 lesen und berechnen und ausgeben // 16 mal den Eingang fuer eine bessere Mittelung lesen // temp_word = read_mw(0); temp_float = (temp_word - 17210); temp_float /= 70; // pc.printf("%0.2f; ",temp_float); // Rohdaten ausgeben temp_word = read_mw(1); temp_float = (temp_word - 17210); temp_float /= 70; // pc.printf("%0.2f\n",temp_float); // Rohdaten ausgeben //------------------------------------------------------ // one wire Daten lesen und ausgeben /* for (n = 0; n < OW_MAX_DEVICES; n++) // Ausgabe der Daten { if ((ow.ow.device_table[n].status & 0x0f) == 3) // Daten wurden gelesen { pc.printf("#%d %d\n",(n+20), ow.ow.device_table[n].result); ow.ow.device_table[n].status = 2; } } down_timer.SetCountdownTimer(1,1,10); // Messung neu starten */ } // end if(down_timer ... } // end while }