
|
INFO - FAQ - CC2-Forum - CCPro-Forum |
|
||
|
> es fehlt leider allerhand von quelltext, so dass eine simulation nicht möglich ist. > ohne aber weiteres zu sehen, vermute ich eiskalt einen überlauf des gosub-stacks. > konkret: du springst in zuviele unterprogramme, ohne sie durch return korrekt zu beenden. > prüfe das von ablauf her mal genauer > Hallo Kay Hier ist mein kompletter Quelltext. ' *** Definition LCD-Ports *** define lcd_port byteport[2] 'spezifiziert einen 8 Bit Digitalport bei Define define lcd_rs port[14] define lcd_rw port[13] define lcd_e port[15] '---Digitale I/Os---- define Fuellstandssensor1 port[1] define Fuellstandssensor2 port[2] define LED1 port[3] define LED2 port[4] define LED3 port[7] define Fuellstandsschalter1 port[5] define Fuellstandsschalter2 port[6] define Temperaturschalter port[8] '----A/D - Eingänge---- define sensor ad[1] '---LC - Display--- define lcd_buf byte '8 Bits (0-255) define lcd_param byte '8 Bits (0-255) '---User Data--- define response byte 'Variable um den Ringpufferspeicher 8 Bits (0 - 255) 'der C-Control leerzumachen. define output word '16 Bits (-32768 - 32767) define temp word '16 Bits (-32768 - 32767) '*** ASCII-Codes *** define gf_ &H22 'Entspricht " define sp_ &H20 'Entspricht Leerzeichen define A_ &H41 define B_ &H42 define C_ &H43 define D_ &H44 define E_ &H45 define F_ &H46 define G_ &H47 define H_ &H48 define I_ &H49 define J_ &H4A define K_ &H4B define L_ &H4C define M_ &H4D define N_ &H4E define O_ &H4F define P_ &H50 define Q_ &H51 define R_ &H52 define S_ &H53 define T_ &H54 define U_ &H55 define V_ &H56 define W_ &H57 define X_ &H58 define Y_ &H59 define Z_ &H5A define PUNKT &H2E define MINUS &H2D define NULL &H30 define GLEICH &H3D '*** Hauptprgramm *** gosub LCD_INIT BAUD R2400 '---------------------------------------------------------------------------------------------------------------------------------- response = 0 GOSUB rxdleeren PRINT"AT+CMGF=1"; PUT 13 PUT 10 Pause 150 PRINT"AT+CPIN="; PUT 34 PRINT"xxxx"; PUT 34 PUT 13 PUT 10 Pause 600 GOSUB rxdleeren GOSUB Pin PRINT"AT+CMGF=1"; PUT 13 PUT 10 Pause 150 PRINT"AT+CSCA="; PUT 34 PRINT"+491710760000"; PUT 34 PUT 13 PUT 10 Pause 50 gosub rxdleeren gosub LCD_CLS #mainloop 'Hauptschleife temp = 0 output = 0 response = 0 PRINT"AT"; PUT 13 PUT 10 Pause 15 IF RXD THEN GOSUB modemok ELSE GOSUB modemfehler GOSUB rxdleeren GOSUB Temperatur GOSUB Wasserstand1 GOSUB Wasserstand2 GOTO mainloop END '----------------------------------------------------------------------------------------------------------------------- #Wasserstand1 IF Fuellstandssensor1 = 0 THEN GOTO SMS1 RETURN '----------------------------------------------------------------------------------------------------------------------- #Wasserstand2 IF Fuellstandssensor2 = 0 THEN GOTO SMS2 RETURN '----------------------------------------------------------------------------------------------------------------------- #SMS1 PRINT "AT+CMGF=1"; PUT 13 PUT 10 PAUSE 50 PRINT "AT+CMGS="; PUT 34 PRINT "+49xxxxxxxxxx"; PUT 34 PUT 13 PAUSE 50 PRINT "Flüssigkeitsstand zu NIEDRIG!"; PAUSE 10 PUT 26 PAUSE 200 GOSUB rxdleeren beep 300,100,0 PAUSE 10 GOSUB SMSgesendet LED1 = 1 GOSUB Schalter1 DEACT LED1 gosub LCD_CLS GOTO mainloop '------------------------------------------------------------------------------------------------------------------------ 'Hier läuft die Steuerung solange in einer Schleife bis ein Taster den Port 3 gegen GND geschalten hat. #Schalter1 IF Fuellstandsschalter1 = 0 THEN RETURN GOTO Schalter1 '------------------------------------------------------------------------------------------------------------------------ #SMS2 PRINT "AT+CMGF=1"; PUT 13 PUT 10 PAUSE 50 PRINT "AT+CMGS="; PUT 34 PRINT "+49xxxxxxxxxx"; PUT 34 PUT 13 PAUSE 50 PRINT "Flüssigkeitsstand zu HOCH!"; PAUSE 10 PUT 26 PAUSE 200 GOSUB rxdleeren beep 300,100,0 PAUSE 10 GOSUB SMSgesendet LED2 = 1 GOSUB Schalter2 DEACT LED2 gosub LCD_CLS GOTO mainloop '------------------------------------------------------------------------------------------------------------------------ 'Hier läuft die Steuerung solange in einer Schleife bis ein Taster den Port 3 gegen GND geschalten hat. #Schalter2 IF Fuellstandsschalter2 = 0 THEN RETURN GOTO Schalter2 '------------------------------------------------------------------------------------------------------------------------ #SMS3 PRINT "AT+CMGF=1"; PUT 13 PUT 10 PAUSE 50 PRINT "AT+CMGS="; PUT 34 PRINT "+49xxxxxxxxxx"; PUT 34 PUT 13 PAUSE 50 PRINT "Temperatur zu HOCH! ";temp;" Grad Celsius erreicht."; PAUSE 10 PUT 26 PAUSE 200 GOSUB rxdleeren beep 300,100,0 PAUSE 10 GOSUB SMSgesendet LED3 = 1 GOSUB Schalter3 DEACT LED3 gosub LCD_CLS GOTO mainloop '------------------------------------------------------------------------------------------------------------------------ 'Hier läuft die Steuerung solange in einer Schleife bis ein Taster den Port 8 gegen GND geschalten hat. #Schalter3 IF Temperaturschalter = 0 THEN RETURN GOTO Schalter3 '------------------------------------------------------------------------------------------------------------------------ #Pin gosub LCD_CLS lcd_param = 1 : gosub LCD_GOTOLINE lcd_param = P_ : gosub LCD_WRITECHAR lcd_param = I_ : gosub LCD_WRITECHAR lcd_param = N_ : gosub LCD_WRITECHAR lcd_param = sp_ : gosub LCD_WRITECHAR lcd_param = O_ : gosub LCD_WRITECHAR lcd_param = K_ : gosub LCD_WRITECHAR lcd_param = 2 : gosub LCD_GOTOLINE lcd_param = M_ : gosub LCD_WRITECHAR lcd_param = O_ : gosub LCD_WRITECHAR lcd_param = D_ : gosub LCD_WRITECHAR lcd_param = E_ : gosub LCD_WRITECHAR lcd_param = M_ : gosub LCD_WRITECHAR lcd_param = sp_ : gosub LCD_WRITECHAR lcd_param = O_ : gosub LCD_WRITECHAR lcd_param = N_ : gosub LCD_WRITECHAR lcd_param = L_ : gosub LCD_WRITECHAR lcd_param = I_ : gosub LCD_WRITECHAR lcd_param = N_ : gosub LCD_WRITECHAR lcd_param = E_ : gosub LCD_WRITECHAR RETURN #modemok lcd_param = 1 : gosub LCD_GOTOLINE lcd_param = M_ : gosub LCD_WRITECHAR lcd_param = O_ : gosub LCD_WRITECHAR lcd_param = D_ : gosub LCD_WRITECHAR lcd_param = E_ : gosub LCD_WRITECHAR lcd_param = M_ : gosub LCD_WRITECHAR lcd_param = sp_ : gosub LCD_WRITECHAR lcd_param = O_ : gosub LCD_WRITECHAR lcd_param = K_ : gosub LCD_WRITECHAR RETURN #modemfehler lcd_param = 1 : gosub LCD_GOTOLINE lcd_param = M_ : gosub LCD_WRITECHAR lcd_param = O_ : gosub LCD_WRITECHAR lcd_param = D_ : gosub LCD_WRITECHAR lcd_param = E_ : gosub LCD_WRITECHAR lcd_param = M_ : gosub LCD_WRITECHAR lcd_param = sp_ : gosub LCD_WRITECHAR lcd_param = N_ : gosub LCD_WRITECHAR lcd_param = I_ : gosub LCD_WRITECHAR lcd_param = C_ : gosub LCD_WRITECHAR lcd_param = H_ : gosub LCD_WRITECHAR lcd_param = T_ : gosub LCD_WRITECHAR lcd_param = sp_ : gosub LCD_WRITECHAR lcd_param = O_ : gosub LCD_WRITECHAR lcd_param = K_ : gosub LCD_WRITECHAR RETURN #SMSgesendet gosub LCD_CLS lcd_param = 1 : gosub LCD_GOTOLINE lcd_param = S_ : gosub LCD_WRITECHAR lcd_param = M_ : gosub LCD_WRITECHAR lcd_param = S_ : gosub LCD_WRITECHAR lcd_param = sp_ : gosub LCD_WRITECHAR lcd_param = G_ : gosub LCD_WRITECHAR lcd_param = E_ : gosub LCD_WRITECHAR lcd_param = S_ : gosub LCD_WRITECHAR lcd_param = E_ : gosub LCD_WRITECHAR lcd_param = N_ : gosub LCD_WRITECHAR lcd_param = D_ : gosub LCD_WRITECHAR lcd_param = E_ : gosub LCD_WRITECHAR lcd_param = T_ : gosub LCD_WRITECHAR lcd_param = 2 : gosub LCD_GOTOLINE lcd_param = F_ : gosub LCD_WRITECHAR lcd_param = E_ : gosub LCD_WRITECHAR lcd_param = H_ : gosub LCD_WRITECHAR lcd_param = L_ : gosub LCD_WRITECHAR lcd_param = E_ : gosub LCD_WRITECHAR lcd_param = R_ : gosub LCD_WRITECHAR lcd_param = sp_ : gosub LCD_WRITECHAR lcd_param = A_ : gosub LCD_WRITECHAR lcd_param = N_ : gosub LCD_WRITECHAR lcd_param = L_ : gosub LCD_WRITECHAR lcd_param = A_ : gosub LCD_WRITECHAR lcd_param = G_ : gosub LCD_WRITECHAR lcd_param = E_ : gosub LCD_WRITECHAR RETURN '------------------------------------------------------------------------------------------------------------------------ #Temperatur lcd_param = 2 : gosub LCD_GOTOLINE lcd_param = T_ : gosub LCD_WRITECHAR lcd_param = E_ : gosub LCD_WRITECHAR lcd_param = M_ : gosub LCD_WRITECHAR lcd_param = P_ : gosub LCD_WRITECHAR lcd_param = PUNKT : gosub LCD_WRITECHAR lcd_param = GLEICH : gosub LCD_WRITECHAR lcd_param = sp_ : gosub LCD_WRITECHAR temp = sensor * 2 - 273 gosub WRITEVALUE lcd_param = sp_ : gosub LCD_WRITECHAR lcd_param = C_ : gosub LCD_WRITECHAR lcd_param = E_ : gosub LCD_WRITECHAR lcd_param = L_ : gosub LCD_WRITECHAR lcd_param = PUNKT : gosub LCD_WRITECHAR IF temp >= 42 THEN GOTO SMS3 RETURN '------------------------------------------------------------------------------------------------------------------------ #WRITEVALUE if temp < 0 then lcd_param = MINUS else lcd_param = sp_ gosub LCD_WRITECHAR output = abs(temp) 'Absolutwert von temp if temp >= 100 then lcd_param = temp mod 1000 / 100 + NULL else lcd_param = sp_ gosub LCD_WRITECHAR if temp >= 10 then lcd_param = temp mod 100 / 10 + NULL else lcd_param = sp_ gosub LCD_WRITECHAR lcd_param = temp mod 10 + NULL gosub LCD_WRITECHAR RETURN '------------------------------------------------------------------------------------------------------------------------ #rxdleeren 'leert den Buffer der seriellen Schnittstelle PAUSE 5 IF RXD THEN GET response IF NOT RXD THEN RETURN GOTO rxdleeren 'Serial Communications Interface Interrupt (SCI) ' Dieser Interrupt wird immer dann ausgeloest, wenn ein Zeichen von der ' seriellen Schnittstelle (RS232) empfangen wurde. Das Betriebssystem fuegt ' dieses Zeichen in seinen acht Byte grossen Ringbuffer ein, vorausgesetzt ' beim Empfangen wurden keine Fehler detektiert und im Buffer ist noch ' genuegend Freiraum. '------------------------------------------------------------------------------------------------------------------------ '*** LCD_Interface *** '( muss in jedes Programm mit LCD-Ausgabe eingefuegt werden) #LCD_INIT ' alle ports 0 lcd_port = OFF ' 8-Bit-Modus aktivieren lcd_param=&H38 : gosub LCD_WRITECMD ' mit 8-Bit-Command in 4-Bit-Modus umschalten lcd_port=&B00000010 tog lcd_e tog lcd_e ' ab jetzt 4-Bit-Modus lcd_param = &H28 : gosub LCD_WRITECMD lcd_param = &H0C : gosub LCD_WRITECMD ' Display loeschen komplett #LCD_CLS lcd_param = &H02 : gosub LCD_WRITECMD lcd_param = &H01 : gosub LCD_WRITECMD return ' Zeilenwechsel #LCD_GOTOLINE if lcd_param = 1 then lcd_param = &H80 if lcd_param = 2 then lcd_param = &HC0 goto LCD_WRITECMD ' LCD-Kommando #LCD_WRITECMD lcd_buf = OFF goto LCD_WRITE ' Zeichenausgabe #LCD_WRITECHAR lcd_buf = &B00100000 ' Kommando oder Zeichen an Display senden #LCD_WRITE lcd_port = lcd_buf or (lcd_param shr 4) ' Hi-Nibble tog lcd_e tog lcd_e lcd_port = lcd_buf or (lcd_param and &H0F) ' Lo-Nibble tog lcd_e tog lcd_e return Ich hoffe du kannst damit was anfangen ;-) Kann ich eigentlich von einer Schleife aus in eine Subroutine und in dieser Subroutine wieder in eine Subroutine hupfen?? MfG Andreas |
| Antwort schreiben |