
|
INFO - FAQ - CC2-Forum - CCPro-Forum |
|
> Hallo allerseits, > > ich möchte eine Anlage per SMS AN- und AUS- schalten. Nach vielem testen habe ich es geschafft. Mein unten angefügtes Programm lief über 24 Stunden stabil durch... > ABER meine Lösung wirf viele Fragen bezüglich des Timings auf. > > Nur in der Konstellation des unten angefügten Programms ist mir das Einzulesen und Auszuwerten der SMS möglich. .... leider zu früh abgeschickt. Ich kann nicht einmal mit RXD prüfen ob etwas einzulesen ist, da diese Abfrage schon zu lange dauert, geschweige denn andere Routinen wie z.B. "I2C" oder "Extended Ports" mit einbinden, da dann das PRG die Bytes der SMS nicht mehr korrekt einliest. Dann habe ich die 8MHZ-Routinen von Dietmar eingebunden, aber erst bekam ich Probleme mit dem LCD-Display und als ich die im Griff hatte wurden die Bytes falsch gelesen. Ich habe auch andere Kontroller (Open MIDI + Open MACRO) probiert, da ich ein größeres Programm benötige. Die Open Midi funktioniert mit den o.g. Einschränkungen. Die Open Macro scheint für diese zeitkritische Angelegenheit zu langsam zu sein. Bitte schaut euch das PRG mal an. Ich bin für konstruktive Kritik dankbar. Viele Grüße Volker ps. Leider verfüge ich über keine Assembler-Kenntnisse '------------------------------------------------------------------------------- ' INCLUDE '------------------------------------------------------------------------------- INCLUDE "om.def" 'Definitionen fuer Open-Micro und Open-Mini '------------------------------------------------------------------------------- ' DEFINITIONEN '------------------------------------------------------------------------------- define LED_AN port[6] define LED_AUS port[5] define LCD_Port byteport[2] define LCD_RS port[14] define LCD_RW port[13] define LCD_e port[15] define z0 byte[1] define z1 byte[2] define z2 byte[3] define n byte[4] define pos byte[5] define anz byte[6] define zeile byte[7] define temp byte[8] Define Line1 &H80 : Define Line2 &HC0 'Für 2x16 LCD '------------------------------------------------------------------------------- ' INITIALISIERUNGEN '------------------------------------------------------------------------------- #main lcd_init 'LCD Initialisieren pause 25 lcd_cls print "ATE" 'Das Echo des M20-Terminals ausstellen pause 50 print "AT+CPIN=2684" 'Den Pin eingeben, damit sich das M2-Terminal einloggen kann for n = 1 to 4 pause 200 'Zeit zum einloggen next n '------------------------------------------------------------------------------- ' HAUPTPROGRAMM '------------------------------------------------------------------------------- #loop 'Hauptschleife for n = 0 to 4 'Die Zugriffshäufigkeit auf das M20-Terminal einstellen pause 250 next n goto sms_auswerten 'zur SMS-Auswertung springen goto loop #sms_auswerten 'SMS-Auswertung Erst schauen ob eine SMS vorhanden ist, wenn nicht >Rüchgabe "OK" gosub rxdleeren 'SERIAL-Puffer leeren print "AT+CMGR=2" 'SMS in Speicher 1 des M20-Terminals lesen get z0 'Die 2 ersten Bytes reichen um das "OK" vom Terminal zu erkennen get z1 if z0 = 79 and z1 = 75 then 'Prüfen auf "OK" goto loop LED_AN = on Pause 50 LED_AN = off '"OK" erkannt. Keinen SMS an Speicherstelle 1 des M20-Terminals. Zurück zur Hauptschleife else goto weiter '"OK" nicht erkannt also weiter, da SMS eine SMS im Speicher ist end if #weiter pause 50 'Vor dem erneuten einlesen eine kurze Pause DBNZCTR=61 'Zähler für DBENZ 'Eine FOR - NEXT Schleife zum Empfang hat sich als zu langsam erwiesen, 'deshalb nutze ich DBENZ. Damit habe ich die empangenen Bytes schnell genug einlesen können. gosub rxdleeren 'SERIAL-Puffer leeren print "AT+CMGR=1" 'SMS an Speicherstelle 1 des M20-Terminals lesen #schleife 'DBENZ-Schleife get z0 'liest die ersten 61 Bytes der vom M20-Terminal gesendeten SMS ein. Die werden nicht gebraucht, DBNZ schleife 'da es der Header der SMS ist. get z0 'Ab Byte 62 fängt der Text der SMS an (ich habe nur 2 Standardtexte "AN oder AUS") get z1 'Deshalb speichere ich nur die 3 Bytes get z2 if z0 = 65 and z1 = 78 then goto angeschaltet 'SMS-Text "AN" erkannt if z0 = 65 and z1 = 85 and z2 = 83 then goto ausgeschaltet 'SMS-Text "AUS" erkannt goto loop #angeschaltet 'Ausgewertete SMS Anzeigen ( Anlage AN ) LED_AN=on 'SMS-Auswertung per LED anzeigen zeile =1 : pos=32 : anz=15 'positionieren auf die Tabellen Texte gosub ausgabe 'und ausgeben zeile =2 : pos=0 : anz=15 'positionieren auf die Tabellen Texte gosub ausgabe 'und auf LCD-Display ausgeben pause 150 '3 Sekunden warten lcd_cls 'und das Display wieder löschen 'print "AT+CMGD=1" 'Die augewertete SMS an Speicherstelle 1 des M20 Terminals löschen LED_AN= off 'LED wieder ausschalten goto loop #ausgeschaltet 'Ausgewertete SMS Anzeigen ( Anlage AUS ) LED_AUS = on 'SMS-Auswertung per LED anzeigen zeile =1 : pos=32 : anz=15 'positionieren auf die Tabellen Texte gosub ausgabe 'und ausgeben zeile =2 : pos=16 : anz=15 'positionieren auf die Tabellen Texte gosub ausgabe 'und auf LCD-Display ausgeben pause 150 '3 Sekunden warten lcd_cls 'und das Display wieder löschen 'print "AT+CMGD=1" 'Die augewertete SMS an Speicherstelle 1 des M20 Terminals löschen LED_AUS = off 'LED wieder ausschalten goto loop #rxdleeren 'Serial-Puffer leeren IF not RXD THEN GET z0 IF RXD THEN return GOTO rxdleeren #ausgabe if zeile = 1 then lcd_writecmd &h80 'Ausgabe in Zeile 1 des Display´s if zeile = 2 then lcd_writecmd &hc0 'Ausgabe in Zeile 2 des Display´s for n =pos to pos + anz 'Zeichen der Tabelle auslesen und lcd_writechar LOOKTAB(de, n ) 'auf dem Display anzeigen next n return END '------------------------------------------------------------------------------- ' LCD-Routinen '------------------------------------------------------------------------------- PROCEDURE lcd_init 'Vorgeschriebene Verzoegerung fuer das LCD PAUSE 5 '8-Bit-Modus aktivieren lcd_writecmd &h38 'mit 8-Bit-Command in 4-Bit-Modus umschalten lcd_port=&b01000010 'EN auf high lcd_e=OFF pause 5 'ab jetzt 4-Bit-Modus lcd_writecmd &h28 lcd_writecmd &h0c 'LCD loeschen lcd_cls RETURN END PROCEDURE PROCEDURE lcd_cls lcd_writecmd &h02 pause 5 lcd_writecmd &h01 RETURN END PROCEDURE PROCEDURE lcd_writecmd(temp) lcd_port=temp shr 4 or &b01000000 'High-Nibble, EN auf high lcd_e=OFF lcd_port=temp and &h0f or &b01000000 ' Low-Nibble, EN auf high lcd_e=OFF RETURN END PROCEDURE PROCEDURE lcd_writechar(temp) lcd_port=temp shr 4 or &b01100000 'High-Nibble, EN auf high lcd_e=OFF lcd_port=temp and &h0f or &b01100000 ' Low-Nibble, EN auf high lcd_e=OFF RETURN END PROCEDURE ' --------------------------------------------------------------------------- ' Tabellen ' --------------------------------------------------------------------------- table de byte "** ANLAGE EIN **" "** ANLAGE AUS **" " SMS-MITTEILUNG " tabend |
| Antwort schreiben |