070914

Dependencies:   FreescaleIAP MODSERIAL mbed monitor timer0

Fork of 17_PT1000 by Temp27

Revision:
0:e248310dfcdb
Child:
1:82c47e2d81f0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sat Jul 26 07:29:23 2014 +0000
@@ -0,0 +1,296 @@
+// Version 07 30.06.2013
+// die Ausgabe auf das Format #nr val umgestellt
+
+#include "mbed.h"
+#include "DS2482.h"
+#include "timer0.h"
+#include "Buffer.h"
+#include "monitor.h"
+
+#define CR 13
+
+timer0 down_timer;
+Serial pc(PTC4, PTC3);
+Buffer <char> buf;
+monitor mon;
+
+//        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);
+
+// 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;
+
+//--------------------------------------------------------
+// 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);
+    }
+}
+
+
+int read_mw(uint8_t pos)
+{
+    uint8_t n;
+    
+    int val = 0;
+    int mw = 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;
+    return mw;
+}
+
+
+int main() 
+{
+    
+    pc.baud(56700);
+    pc.attach(&rx_handler, Serial::RxIrq);
+    // pc.printf("\n V08 was compiled on %s  %s \n", __DATE__,__TIME__);
+
+    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
+    //--------------------------------------------------------------------
+    // 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) 
+    {
+       mon.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);
+            pc.printf("#0 %d\n",temp_word);                     // Rohdaten ausgeben
+
+            temp_word = read_mw(1);
+            pc.printf("#1 %d\n",temp_word);                     // Rohdaten ausgeben
+            
+            temp_word = read_mw(2);
+            pc.printf("#2 %d\n",temp_word);                     // Rohdaten ausgeben
+            
+            temp_word = read_mw(3);
+            pc.printf("#3 %d\n",temp_word);                     // 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
+}
+