Die "großen" Programme aus dem Buch PIC-Microcontroller-Programmierung. ======================================================================= Die kürzen Programme sollten in jedem Fall selbst eingetippt werden, da dieser Arbeitsschritt für den Lernvorgang sehr wichtig ist. '******************************************************************** ' MUSIK1.BAS ' 08.04.2010 ' ' (c) Stefan Lehmann + Bettina Lehmann '******************************************************************** DEFINE DEVICE il_troll DEFINE ii = auto AS BYTE DEFINE jj = auto AS BYTE DEFINE Note = auto AS BYTE DEFINE Dauer = auto AS BYTE DEFINE Notex = auto AS BYTE DEFINE Playx = auto AS BYTE DEFINE Taste1 = RC,4 DEFINE Taste2 = RC,5 DEFINE Taste3 = RA,4 ' Notenumschaltung: TITEL3 = 1 == Lied3 = "Schlumpf" ' TITEL3 = 0 == Lied3 = "Always Refrain" DEFINE TITEL3=1 AS CONST cold: GOTO main play: IF Note <> 0 THEN GOTO play0 WAIT 100 playxx: RETURN play0: LET playx = 0 DEC Note play1: IF Note < 12 THEN ON Playx GOTO play0a,play0b,play0c,play0d,play0e,play0f,play0g,play0h LET Note = Note - 12 INC playx GOTO play1 ' ON Playx GOTO play0a,play0b,play0c,play0d,play0e,play0f,play0g,play0h play0a: ' ON Note GOTO play01,play02,play03,play04,play05,play06,play07,play08,play09,play10,play11,play12 play0b: ' ON Note GOTO play13,play14,play15,play16,play17,play18,play19,play20,play21,play22,play23,play24 play0c: ON Note GOTO play25,play26,play27,play28,play29,play30,play31,play32,play33,play34,play35,play36 play0d: ON Note GOTO play37,play38,play39,play40,play41,play42,play43,play44,play45,play46,play47,play48 play0e: ON Note GOTO play49,play50,play51,play52,play53,play54,play55,play56,play57,play58,play59,play60 play0f: ON Note GOTO play61,play62,play63,play64,play65,play66,play67,play68,play69,play70,play71,play72 play0g: ' ON Note GOTO play73,play74,play75,play76,play77,play78,play79,play80,play81,play82,play83,play84 play0h: ' ON Note GOTO play85,play86,play87,play88,play89,play90,play91,play92,play93,play94,play95,play96 'Hier werden die einzelnen Noten abgespielt. play01: ' LOFREQ rc,6,32,100 ' GOTO playxx play02: ' LOFREQ rc,6,35,100 ' GOTO playxx play03: ' LOFREQ rc,6,37,100 ' GOTO playxx play04: ' LOFREQ rc,6,39,100 ' GOTO playxx play05: ' LOFREQ rc,6,41,100 ' GOTO playxx play06: ' LOFREQ rc,6,44,100 ' GOTO playxx play07: ' LOFREQ rc,6,46,100 ' GOTO playxx play08: ' LOFREQ rc,6,49,100 ' GOTO playxx play09: ' LOFREQ rc,6,52,100 ' GOTO playxx play10: ' LOFREQ rc,6,55,100 ' GOTO playxx play11: ' LOFREQ rc,6,58,100 ' GOTO playxx play12: ' LOFREQ rc,6,62,100 ' GOTO playxx play13: ' LOFREQ rc,6,65,100 ' GOTO playxx play14: ' LOFREQ rc,6,69,100 ' GOTO playxx play15: ' LOFREQ rc,6,73,100 ' GOTO playxx play16: ' LOFREQ rc,6,78,100 ' GOTO playxx play17: ' LOFREQ rc,6,82,100 ' GOTO playxx play18: ' LOFREQ rc,6,87,100 ' GOTO playxx play19: ' LOFREQ rc,6,95,100 ' GOTO playxx play20: ' LOFREQ rc,6,98,100 ' GOTO playxx play21: ' LOFREQ rc,6,104,100 ' GOTO playxx play22: ' LOFREQ rc,6,110,100 ' GOTO playxx play23: ' LOFREQ rc,6,116,100 ' GOTO playxx play24: ' LOFREQ rc,6,123,100 ' GOTO playxx play25: 'Hier beginnt der Bereich der LOFREQ rc,6,131,175 'spielbaren Noten GOTO playxx play26: LOFREQ rc,6,139,175 GOTO playxx play27: LOFREQ rc,6,147,175 GOTO playxx play28: LOFREQ rc,6,157,175 GOTO playxx play29: LOFREQ rc,6,165,175 GOTO playxx play30: LOFREQ rc,6,175,175 GOTO playxx play31: LOFREQ rc,6,185,175 GOTO playxx play32: LOFREQ rc,6,196,175 GOTO playxx play33: LOFREQ rc,6,208,175 GOTO playxx play34: LOFREQ rc,6,220,175 GOTO playxx play35: LOFREQ rc,6,233,175 GOTO playxx play36: LOFREQ rc,6,247,175 GOTO playxx play37: LOFREQ rc,6,262,175 GOTO playxx play38: LOFREQ rc,6,277,175 GOTO playxx play39: LOFREQ rc,6,294,175 GOTO playxx play40: LOFREQ rc,6,311,175 GOTO playxx play41: LOFREQ rc,6,330,175 GOTO playxx play42: LOFREQ rc,6,349,175 GOTO playxx play43: LOFREQ rc,6,370,175 GOTO playxx play44: LOFREQ rc,6,392,175 GOTO playxx play45: LOFREQ rc,6,415,175 GOTO playxx play46: LOFREQ rc,6,440,175 GOTO playxx play47: LOFREQ rc,6,466,175 GOTO playxx play48: LOFREQ rc,6,494,175 GOTO playxx play49: LOFREQ rc,6,523,175 GOTO playxx play50: LOFREQ rc,6,554,175 GOTO playxx play51: LOFREQ rc,6,587,175 GOTO playxx play52: LOFREQ rc,6,622,175 GOTO playxx play53: LOFREQ rc,6,659,175 GOTO playxx play54: LOFREQ rc,6,698,175 GOTO playxx play55: LOFREQ rc,6,740,175 GOTO playxx play56: LOFREQ rc,6,784,175 GOTO playxx play57: LOFREQ rc,6,830,175 GOTO playxx play58: LOFREQ rc,6,880,175 GOTO playxx play59: LOFREQ rc,6,932,175 GOTO playxx play60: LOFREQ rc,6,988,175 GOTO playxx play61: LOFREQ rc,6,1047,175 GOTO playxx play62: LOFREQ rc,6,1109,175 GOTO playxx play63: LOFREQ rc,6,1175,175 GOTO playxx play64: LOFREQ rc,6,1245,175 GOTO playxx play65: LOFREQ rc,6,1319,175 GOTO playxx play66: LOFREQ rc,6,1397,175 GOTO playxx play67: LOFREQ rc,6,1480,175 GOTO playxx play68: LOFREQ rc,6,1568,175 GOTO playxx play69: LOFREQ rc,6,1661,175 GOTO playxx play70: LOFREQ rc,6,1760,175 GOTO playxx play71: LOFREQ rc,6,1865,175 GOTO playxx play72: LOFREQ rc,6,1976,175 'Hier endet der Bereich der GOTO playxx 'spielbaren Noten play73: ' LOFREQ rc,6,2093,100 ' GOTO playxx play74: ' LOFREQ rc,6,2217,100 ' GOTO playxx play75: ' LOFREQ rc,6,2349,100 ' GOTO playxx play76: ' LOFREQ rc,6,2489,100 ' GOTO playxx play77: ' LOFREQ rc,6,2637,100 ' GOTO playxx play78: ' LOFREQ rc,6,2794,100 ' GOTO playxx play79: ' LOFREQ rc,6,2960,100 ' GOTO playxx play80: ' LOFREQ rc,6,3136,100 ' GOTO playxx play81: ' LOFREQ rc,6,3322,100 ' GOTO playxx play82: ' LOFREQ rc,6,3520,100 ' GOTO playxx play83: ' LOFREQ rc,6,3729,100 ' GOTO playxx play84: ' LOFREQ rc,6,3951,100 ' GOTO playxx play85: ' LOFREQ rc,6,4186,100 ' GOTO playxx play86: ' LOFREQ rc,6,4435,100 ' GOTO playxx play87: ' LOFREQ rc,6,4699,100 ' GOTO playxx play88: ' LOFREQ rc,6,4978,100 ' GOTO playxx play89: ' LOFREQ rc,6,5274,100 ' GOTO playxx play90: ' LOFREQ rc,6,5588,100 ' GOTO playxx play91: ' LOFREQ rc,6,5920,100 ' GOTO playxx play92: ' LOFREQ rc,6,6272,100 ' GOTO playxx play93: ' LOFREQ rc,6,6645,100 ' GOTO playxx play94: ' LOFREQ rc,6,7040,100 ' GOTO playxx play95: ' LOFREQ rc,6,7459,100 ' GOTO playxx play96: ' LOFREQ rc,6,7902,100 ' GOTO playxx play99: ' LOFREQ rc,6,32,100 GOTO playxx '************* Hauptschleife ************* 'warte bis eine der 3 Tasten gedrückt wird main: TRIS rb,%00000000 TRIS rc,%00111111 RES RC,7 IF Taste1 = 1 THEN GOTO main1 SET RB,0 RES RB,1 RES RB,2 RESTORE Lied1 GOTO loop main1: IF Taste2 = 1 THEN GOTO main2 RES RB,0 SET RB,1 RES RB,2 RESTORE Lied2 GOTO loop main2: IF Taste3 = 1 THEN GOTO main 'warte bis Taste gedrückt RES RB,0 RES RB,1 SET RB,2 RESTORE Lied3 loop: READDATA Note,Dauer ' LET Dauer = Dauer * Tempo IF Note = 255 THEN GOTO loopw LET Notex = Note FOR jj = 1 TO dauer LET Note = Notex TOGGLE RC,7 GOSUB play NEXT jj GOTO loop loopw: WAIT 2500 ' INC liednr GOTO main 'Es folgen die Noten der einzelnen Stücke Lied1: ' Cucaracha: DATA 45,1, 0,1, 45,1, 0,1, 45,1, 0,1, 50,1, 0,5, 54,1, 0,3, 45,1, 0,1, 45,1, 0,1 DATA 45,1, 0,1, 50,1, 0,5, 54,1, 0,5, 33,1, 0,1, 33,1, 0,1, 38,1, 0,3, 50,1, 0,1 DATA 50,1, 0,1, 49,1, 0,1, 49,1, 0,1, 47,1, 0,1, 47,1, 0,1, 45,8, 0,2, 45,1, 0,1 DATA 45,1, 0,1, 45,1, 0,1, 49,1, 0,5, 52,1, 0,3, 45,1, 0,1, 45,1, 0,1, 45,1, 0,1 DATA 49,1, 0,5, 52,1, 0,5, 40,1, 0,1, 40,1, 0,1, 33,1, 0,3, 57,2, 59,2, 57,2, 55,2 DATA 54,2, 52,2, 50,8 DATA 255,255 Lied2: ' Donau: DATA 45,4, 49,4, 52,4, 52,4, 00,4, 64,2, 00,2, 64,2, 00,6, 61,2, 00,2, 61,2, 00,6 DATA 45,4, 45,4, 49,4, 52,4, 52,4, 00,4, 64,2, 00,2, 64,2, 00,6, 62,2, 00,2, 62,2 DATA 00,6, 44,4, 44,4, 47,4, 54,4, 54,4, 00,4, 66,2, 00,2, 66,2, 00,6, 62,2, 00,2 DATA 62,2, 00,6, 44,4, 44,4, 47,4, 54,4, 54,4, 00,4, 66,2, 00,2, 66,2, 00,6, 61,2 DATA 00,2, 61,2, 00,6, 45,4, 45,4, 49,4, 52,4, 57,4, 00,4, 69,2, 00,2, 69,2, 00,6 DATA 64,2, 00,2, 64,2, 00,6, 45,4, 45,4, 49,4, 52,4, 57,4, 00,4, 69,2, 00,2, 69,2 DATA 00,6, 66,2, 00,2, 66,2, 00,6, 47,4, 47,4, 50,4, 54,2, 00,2, 54,14, 00,2, 51,4 DATA 52,4,61,16, 57,4, 49,4, 49,8, 47,4, 54,8, 52,4, 45,4, 00,2, 45,2, 45,4, 00,8 DATA 52,2, 00,2, 50,2, 00,6, 52,2, 00,2, 50,2, 00,6, 52,4, 61,16, 59,4, 52,2, 00,2 DATA 49,2, 00,6, 52,2, 00,2, 49,2, 00,6, 52,4, 59,16,57,4, 52,2, 00,2, 50,2, 00,6 DATA 52,2, 00,2, 50,2, 00,6, 52,4, 61,16,59,4, 52,4, 57,4, 59,4, 61,4, 64,8, 62,4 DATA 61,2, 61,2, 61,4, 59,2, 00,2, 57,4, 00,8 DATA 255,255 Lied3: $IF TITEL3 ' Schlumpf: DATA 44,4, 44,2, 44,2, 44,4, 39,4, 41,4, 37,4, 39,4, 00,4, 48,4, 48,4, 48,4, 44,4 DATA 46,4, 43,4, 44,4, 00,4, 44,2, 44,2, 44,4, 44,2, 44,2, 39,4, 41,4, 37,4, 39,4 DATA 00,4, 48,4, 48,4, 48,2, 46,2, 44,4, 46,4, 43,4, 44,4, 00,4, 44,4, 44,4, 44,4 DATA 39,4, 41,4, 37,4, 39,4, 39,4, 48,4, 48,4, 48,4, 44,4, 46,4, 43,4, 44,4, 44,4 DATA 44,4, 44,2, 44,2, 44,4, 39,2, 39,2, 41,4, 37,4, 39,4, 00,4, 48,4, 48,2, 48,2 DATA 48,4, 44,4, 46,4, 43,4, 44,4, 00,4, 00,8, 44,4, 46,4, 48,2, 48,2, 48,2, 48,2 DATA 49,2, 48,4, 46,4, 44,5, 44,4, 46,4, 48,2, 48,2, 48,2, 48,2, 49,2, 48,4 DATA 46,4, 44,5, 44,4, 46,4, 48,2, 48,2, 48,2, 48,2, 49,2, 48,4, 46,4, 44,5, 43,4 DATA 44,4, 46,4, 00,4, 00,8 DATA 255,255 $ELSE ' Always: 'nur Refrain DATA 49,5, 44,4, 49,2, 44,2, 49,2, 51,4, 48,2, 44,4, 51,2, 48,2, 44,2, 51,4, 48,2 DATA 44,4, 51,2, 48,2, 44,2, 46,2, 48,2, 49,2, 49,2, 51,2, 53,2, 53,4, 51,2, 49,2 DATA 49,5, 44,4, 49,2, 44,2, 49,2, 51,4, 48,2, 44,4, 51,2, 48,2, 44,2, 51,4, 48,2 DATA 44,4, 51,2, 48,2, 44,2, 46,2, 48,2, 49,2, 49,2, 51,2, 53,2, 53,4, 51,2, 49,2 DATA 255,255 $ENDIF DATA 255,255 END ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ '******************************************************************* ' DCF3a.BAS ' 08.04.2010 'dekodiert das DCF-Signal aus und zeigt Zeit und Datum auf einer LCD ' '(c)Ing.Büro Lehmann, Fürstenbergstr.8a, 77756 Hausach, il-online.de '******************************************************************* ' 'Bitte lesen Sie die Bemerkungen........... ' 'Als Empfangsmodul wird das DCF-Modul von ELV verwendet. Es besitzt 'einen Open-Collector-Ausgang für das DCF-Signal. Deshalb muss ein 'Widerstand von 100k bis 470k zwischen +5V und Collector geschaltet 'werden. Die logischen Pegel sind invertiert, d.h. der Ruhepegel ist 'high, der aktive Pegel ein Low. Dadurch erscheinen die Impulse von 'high nach low. ' 'Falls eine falsche Uhrzeit, Datum oder Unsinn in der LCD angezeigt 'werden, bitte eine andere Position für das DCF-Empfangs-Modul suchen. ' 'Dieses Programm dient der Demonstration. Das Programm besitzt 'keine Fehlerkorrektur, deshalb ist ein stabiles, sauberes 'Empfangssignal nötig. Unter Umständen muss der optimale 'Platz und die Ausrichtung des DCF-Empfangsmodul öfters verändert 'werden, bis die optimale Position für das Empfangsmodul gefunden 'wird. 'Die Datenübertragung des DCF-Signals erfolgt über Langwelle. 'Falls Sie Schwierigkeiten beim Empfang des DCF-Signals feststellen, 'versuchen Sie es bitte in den Abendstunden erneut. '********************************************************************* '********************************************************************* 'Achtung, bitte besonders beachten!!!!! 'Es wird nicht, wie im Buch beschrieben als Eingang für das DCF-Modul 'der Pin RB,7 benutzt, sondern der Pin RC,5 '********************************************************************* DEFINE DEVICE iL_TROLL #b2 '$DEBUG $CCOFF 'schaltet den Carry-Check ab '***** Variablendefinitionen ****************** DEFINE Bws = auto AS BYTE 'Anzeigespeicher für LCD DEFINE Std_10 = Bws '0x xx xx xx xx DEFINE Std_1 = auto AS BYTE 'x0 xx xx xx xx DEFINE Dp1 = auto AS BYTE 'xx:xx xx xx xx DEFINE Min_10 = auto AS BYTE 'xx 0x xx xx xx DEFINE Min_1 = auto AS BYTE 'xx x0 xx xx xx DEFINE Blk1 = auto AS BYTE 'xx xx_ xx xx xx DEFINE Blk2 = auto AS BYTE 'xx xx | xx xx xx DEFINE Blk3 = auto AS BYTE 'xx xx _xx xx xx DEFINE Day_10 = auto AS BYTE 'xx xx 0x xx xx DEFINE Day_1 = auto AS BYTE 'xx xx x0 xx xx DEFINE Pkt1 = auto AS BYTE 'xx xx xx.xx xx DEFINE Mon_10 = auto AS BYTE 'xx xx xx 0x xx DEFINE Mon_1 = auto AS BYTE 'xx xx xx x0 xx DEFINE Pkt2 = auto AS BYTE 'xx xx xx xx.xx DEFINE Jar_10 = auto AS BYTE 'xx xx xx xx 0x DEFINE Jar_1 = auto AS BYTE 'xx xx xx xx x0 DEFINE Sek_10 = auto AS BYTE 'Sek. werden nicht angezeigt DEFINE Sek_1 = auto AS BYTE DEFINE Zaehler = auto AS BYTE 'Hilfszählvariable DEFINE Timeout = auto AS BYTE 'für Timeout-Erkennung DEFINE Error= auto AS BYTE 'Fehlervariable DEFINE Ergebnis= auto AS BYTE 'Empf. Bits hier kombinieren DEFINE Temp = auto AS BYTE 'Hilfsvar. für vers. Aufgaben DEFINE Cnt = auto AS BYTE 'Zählvariable in FOR-Schleifen DEFINE Wcnt = auto AS BYTE 'Zählvar. in Verzög.-schleifen DEFINE Wmax = auto AS BYTE 'Zählmaxwert Verzög.-schleifen '************************************************************************ 'Eingangspin geändert!! 'Es kann bei der Entwicklungsplatine TB1 Probleme mit 'dem Eingang RB,7 geben, da die parallel zum Pin RB,7 liegende 'LED evtl. verhindert, dass sich ein gültiger High-Pegel 'einstellt. Deshalb wurde ein anderer Eingangspin gewählt. 'DEFINE Recv = rb 'Empfangsport 'Es wurde als Eingangspin der Portpin RC,5 DEFINE Recv = rc 'Empfangsport '************************************************************************ '********** Konstantendefinitionen ********** DEFINE P350=333 AS CONST 'Software-Verz÷gerung bei 4MHz '********* Einsprung beim Kaltstart (Power-On) ******** 'Nach dem Einschalten wird zuerst eine Verz÷gerung ausgef³hrt 'um vorallem der LCD gen³gend Zeit f³r ihre eigene Initialisierung 'zu geben. 'Es folgt das Initialisieren des Ports RB und die Er÷ffnungstexte cold: GOSUB wait5x 'Einschaltverz÷gerung TRIS Rb,%10000000 'RB7 Eingang,Rest Ausgang inp rc,5 'neuer Eingangspin RC,5 LCDINIT rb,2,16 'LCD-Initialisieren 'LCDDELAY 4 'LCD langsamer beschreiben, falls die LCD unsinn ausgibt GOSUB wait3x LCDCLEAR 'Anzeige l÷schen GOSUB wait3x RESTORE text3 GOSUB txt2bws 'Titelzeile anzeigen GOSUB display GOSUB wait30x RESTORE text2 'Text DCF-Modul check GOSUB txt2bws GOSUB display 'Hier wird gepr³ft, ob ³berhaupt Signale anliegen. Nur wenn hier 'Signalwechsel anliegen, wird versucht, ein DCF-Signal zu lesen. cold1: IF Recv,5=0 THEN GOTO cold1 'warte auf Impuls cold2: IF Recv,5=1 THEN GOTO cold2 cold3: IF Recv,5=0 THEN GOTO cold3 'warte bis Ruhepegel GOTO start 'Verschiedene Verz÷gerungszeiten wait3x: LET Wmax=3 GOTO waitxx wait5x: LET Wmax=5 GOTO waitxx wait30x: LET Wmax=30 GOTO waitxx waitxx: FOR Wcnt=1 TO Wmax WAIT p350 NEXT Wcnt RETURN 'Ausgabe des Textes, der mit RESTORE selektiert wurde. Diese Methode 'der Textausgabe ist weitaus codesparender als die Texte mittels 'LCDWRITE auszugeben. Zuerst wird der Text in einen Anzeigepuffer 'BWS geschrieben und dann "en bloc" ausgegeben. txt2bws: FOR Cnt=0 TO 15 READDATA Temp LET Bws(Cnt)=Temp NEXT Cnt RETURN 'Diese Routine gibt den Inhalt von BWS "en bloc" aus display: LCDWRITE 1,1,Std_10,# FOR Cnt=1 TO 15 LET Temp=Bws(Cnt) 'Zeichen aus BWS lesen LCDWRITE 0,0,Temp,# 'auf LCD ausgeben NEXT Cnt RETURN blinken: LET Blk2 = Blk2 XOR $97 'blinke mit Funkturm LCDWRITE 1,7,Blk2,# RETURN 'SUCH59 sucht die fehlende 59. Sekunde im DCF-Protokoll. Dies 'erfolgt mittels Zeit³berschreitung. Nach einer steigenden Flanke 'muss spõtesten 1 Sekunde spõter wieder eine steigende Flanke 'erscheinen. Ist das nicht der Fall, ist entweder das DCF-Signal 'nicht vorhanden, oder aber die 59. Minute erreicht such59: GOSUB blinken such59v: IF Recv,5=0 THEN GOTO such59v 'suche fallende Flanke such59w: IF Recv,5=1 THEN GOTO such59w 'warte steigende Flanke such59a: LET Cnt=105 such59b: WAIT 10 'warte ca. 1,1 sec DEC Cnt IF Cnt=0 THEN GOTO such59c GOTO such59b such59c: IF Recv,5=0 THEN GOTO such59 'wenn Impuls fehlt,59.Min RETURN 'Hier wird ein einzelnes Bit eingelesen. Dazu wird Startflanke des 'Bits gesucht und anschlie¯end 125ms gewartet. Damit befindet man 'sich in etwa in der Mitte des Datenbits, das dann einfach gelesen 'und invertiert abgespeichert wird lesebit: GOSUB blinken 'blinke mit Funkturm lesebit0: IF Recv,5=1 THEN GOTO lesebit0 'warte auf Startflanke WAIT 125 'in Mitte des Datenbits IF Recv,5=0 THEN SET Ergebnis,7 ELSE RES Ergebnis,7 lesebw: IF Recv,5=0 THEN GOTO lesebw 'warte bis H = Ruhepegel RETURN 'Es werden bis zu 8-Datenbits nacheinander eingelesen und in ERGEBNIS 'dem Aufrufer zur³ckgegeben lesebits: 'Aufrufer sagt wieviel Bits er ben÷tigt LET Temp=8-Zaehler 'hier werden 8 ben÷tigt LET Ergebnis=$00 leseb1: ROTR Ergebnis 'Bit zum Byte zusammen setzen GOSUB lesebit 'nõchstes Bit lesen DEC Zaehler IF Zaehler<>0 THEN GOTO leseb1 'soviel wie verlangt leseb2: IF Temp=0 THEN RETURN DEC Temp SHR Ergebnis GOTO leseb2 'Es werden nicht alle Bits aus dem DCF-Protokoll ausgewertet, deshalb 'werden diese nur ³berlesen und nicht abgespeichert. ign_bits: GOSUB lesebit DEC Zaehler IF Zaehler<>0 THEN GOTO ign_bits RETURN 'liest ³ber 60 (genau 58) Sekunden die Information ein und speichert 'sie ab. Es werden immer nur die Anzahl der Bits gelesen, die f³r den 'aktuellen Eintrag notwendig sind. lesetime: LET Zaehler=21 'die ersten 20s. ³berspring. GOSUB ign_bits LET Zaehler=4 'Einerminuten lesen GOSUB lesebits LET Min_1=Ergebnis AND 15 OR $30 LET Zaehler=4 'Zehnerminuten + Pr³fbit lesen GOSUB lesebits LET Min_10=Ergebnis AND 7 OR $30 LET Zaehler=4 'Einerstunden GOSUB lesebits LET Std_1=Ergebnis AND 15 OR $30 LET Zaehler=3 'Zehnerstunden + Pr³fbit GOSUB lesebits LET Std_10=Ergebnis AND 3 OR $30 LET Zaehler=6 'Kalendertag GOSUB lesebits LET Day_1 = Ergebnis AND 15 OR $30 SWAP Ergebnis LET Day_10 = Ergebnis AND 3 OR $30 LET Zaehler=3 'Wochentag GOSUB lesebits LET Zaehler=5 'Monat GOSUB lesebits LET Mon_1 = Ergebnis AND 15 OR $30 SWAP Ergebnis LET Mon_10 = Ergebnis AND 1 OR $30 LET Zaehler=8 'Jahr GOSUB lesebits LET Jar_1 = Ergebnis AND 15 OR $30 SWAP Ergebnis LET Jar_10 = Ergebnis AND 15 OR $30 RETURN 'letztes Prüfbit nicht lesen 'Hauptprogramm beginnt hier. start: RESTORE text1 'Text Syncronisation GOSUB txt2bws '³ber den Anzeigepuffer GOSUB display 'auf LCD schreiben LET Error=0 'Variablen initalisieren LET Zaehler=0 LET Timeout=0 GOSUB such59 'warte auf Synch-Signal IF Error<>0 THEN GOTO start 'bis kein Fehler mehr vorliegt RESTORE text4 'Text "Uhrzeit einlesen" GOSUB txt2bws 'in Anzeigepuffer und GOSUB display 'auf LCD schreiben loop0: GOSUB lesetime 'Zeit lesen und in Puffer LET Dp1 = ":" 'Separator in Anzeigepuffer LET Pkt1 = "." 'schreiben LET Pkt2 = "." LET Blk1 = " " LET Blk2 = $b7 'ist ein Funkturmzeichen LET Blk3 = " " GOSUB display 'Anzeigepuffer mit Zeit und 'Datum anzeigen GOSUB such59 'auf nõchsten Synch warten GOTO loop0 'nõchste Zeiteinheit einlesen 'Nachfolgende Texte werden mittels RESTORE selektiert und mit Hilfe 'von READDATA ausgelesen und in den Anzeigepuffer (BWS) geschrieben. text1: DATA "Suche ",$b7," Signal " text2: DATA "DCF-Modul check " text3: DATA "DCF-Uhr 1.0 iL " text4: DATA "lese ",$b7," Signal " end 'Programmende ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ '****************************************************************************** ' BSP_IR.BAS ' 08.04.2010 ' ' (c) Stefan Lehmann '****************************************************************************** 'Der Ausgangspin des IR-Empfängers muss an den Pin RC,5 angeschlossen werden DEFINE device iL_TROLL 'Variablendeklaration DEFINE Verz = auto AS WORD DEFINE Zeiger = auto AS BYTE DEFINE Count= auto AS BYTE 'Zählvariable zum Einlesen der Bits DEFINE Dauer1= auto AS BYTE 'Zählwert für 1. Halbbit DEFINE Dauer2= auto AS BYTE 'Zählwert für 2. Halbbit DEFINE Bitzeit= auto AS BYTE 'Zähler für Timeout bei Empfangsproblemen DEFINE Oldbit= auto AS BYTE 'Vergleichsbit zur Flankenerkennung DEFINE Temp= auto AS BYTE DEFINE Adresse= auto AS BYTE DEFINE Befehl= auto AS BYTE DEFINE Vgladr= auto AS BYTE 'Vergleichsadresse, wird eingelesen DEFINE Daten = auto AS BYTE DEFINE Start2a = auto AS BYTE DEFINE Start2b = auto AS BYTE DEFINE Toggle_a = auto AS BYTE DEFINE Toggle_b = auto AS BYTE DEFINE Adr4a = auto AS BYTE 'Adressbits DEFINE Adr4b = auto AS BYTE DEFINE Adr3a = auto AS BYTE DEFINE Adr3b = auto AS BYTE DEFINE Adr2a = auto AS BYTE DEFINE Adr2b = auto AS BYTE DEFINE Adr1a = auto AS BYTE DEFINE Adr1b = auto AS BYTE DEFINE Adr0a = auto AS BYTE DEFINE Adr0b = auto AS BYTE DEFINE Cmd5a = auto AS BYTE 'Befehlbits DEFINE Cmd5b = auto AS BYTE DEFINE Cmd4a = auto AS BYTE DEFINE Cmd4b = auto AS BYTE DEFINE Cmd3a = auto AS BYTE DEFINE Cmd3b = auto AS BYTE DEFINE Cmd2a = auto AS BYTE DEFINE Cmd2b = auto AS BYTE DEFINE Cmd1a = auto AS BYTE DEFINE Cmd1b = auto AS BYTE DEFINE Cmd0a = auto AS BYTE DEFINE Cmd0b = auto AS BYTE DEFINE Reserv1 = auto AS BYTE 'hier nur Reserve DEFINE Reserv2 = auto AS BYTE DEFINE Reserv3 = auto AS BYTE DEFINE Reserv4 = auto AS BYTE DEFINE Reserv5 = auto AS BYTE DEFINE Reserv6 = auto AS BYTE 'Konstantendefinitionen DEFINE Bitzeiten=58 AS CONST DEFINE Bitmin=18 AS CONST 'ab 15 wird es als 1 gewertet 'Beim Einschalten erfolgt hier der Einsprung cold: WAIT 100 'Einschaltverzögerung TRIS Rb,$80 'RB7 Input, Rest Output für LCD inp rc,5 LCDINIT RB,2,16 LCDDELAY 3 LCDCLEAR LCDWRITE 1,1,"RC5-EMPAENGER" GOTO main lesebit: LET Zeiger = Count + Count 'weil 2 Variablen pro Bit benötigt werden LET Dauer1 = 0 '1. Zählvariable initalisieren LET Bitzeit = Bitzeiten 'Grenzwert ist als Konstante definiert INPUT Rc,Oldbit 'lese aktuellen Eingangspegel leseb1: INPUT Rc,Temp 'lese Eingangspegel LET Temp = Temp xor Oldbit 'Bei Flankenwechsel ist TEMP.7 = 1 IF Temp,5 = 1 THEN GOTO leseb1x 'GOTO, wenn Flankenwechsel gefunden IF Rc,5 = 1 THEN INC Dauer1 'wenn H-Pegel, dann zählen DEC Bitzeit 'prüfe Bitzeit IF Bitzeit <> 0 THEN GOTO leseb1 'Zeit liegt noch im erlaubten Rahmen ' GOTO fehler 'es müsste ein Flankenwechsel kommen leseb1x: INPUT Rc,Oldbit 'neuer Vergleichspegel LET Dauer2 = 0 '2. Zählvariable initalisieren LET Bitzeit = Bitzeiten 'auch hier Grenzwertüberwachung leseb2: INPUT Rc,Temp 'Eingangspegel lesen LET Temp = Temp XOR Oldbit 'prüfen, ob Flankenwechsel IF Temp,5 = 1 THEN GOTO lese2x 'wenn Flankenwechsel, nach lese2x IF Rc,5 = 1 THEN INC Dauer2 'wenn H-Pegel, dann zählen DEC Bitzeit 'Bitzeit überwachen IF Bitzeit <> 0 THEN GOTO leseb2 'ist alles im zeitlichen Rahmen? ' GOTO fehler 'nein, Flankenwechsel fehlt lese2x: LET Daten(Zeiger)=Dauer1 'speichere 1. Zählwert ab INC Zeiger 'ZEIGER auf nächste Variable LET Daten(Zeiger)=Dauer2 'speichere 2. Zählwert ab RETURN 'ein Bit fertig eingelesene 'Hier beginnt das Hauptprogramm main: ruhe: LET verz=300 ruhe1: IF rc,5=0 THEN GOTO ruhe 'Mindestzeit auf Ruhepegel warten DEC verz IF verz<>0 THEN GOTO ruhe1 loop: IF rc,5 = 1 THEN GOTO loop 'warte auf Startbit LET dauer2 = 0 loop1: INC dauer2 'Zähler die Highphase IF rc,5 = 0 THEN GOTO loop1 IF dauer2 > 200 THEN GOTO ruhe 'Fehler, Ruhepegel abwarten IF dauer2 < 10 THEN GOTO ruhe loop2: for Count=0 to 12 '0 bis 12 sind 13 Schritte gosub lesebit 'Bits lesen und im Feld DATEN ablegen next Count 'Auswertung: LET Adresse = %00000000 'Adresse auswerten LET Temp = Adr4a '1.Halbbit prüfen, ist es > 0 IF Temp > Bitmin THEN SET Adresse,4 'ist das Datenbit eine 1 LET Temp = Adr3a '1. Halbbit von Adressbit 3 IF Temp > Bitmin THEN SET Adresse,3 LET Temp = Adr2a 'Adressbit 2 auswerten IF Temp > Bitmin THEN SET Adresse,2 LET Temp = Adr1a 'Adressbit 1 auswerten IF Temp > Bitmin THEN SET Adresse,1 LET Temp = Adr0a 'Adressbit 0 auswerten IF Temp > Bitmin THEN SET Adresse,0 LET Befehl=0 'Befehl auswerten LET Temp = Cmd5a 'Befehlsbit 5 auswerten IF Temp > Bitmin THEN SET Befehl,5 LET Temp = Cmd4a 'Befehlsbit 4 auswerten IF Temp > Bitmin THEN SET Befehl,4 LET Temp = Cmd3a 'Befehlsbit 3 auswerten IF Temp > Bitmin THEN SET Befehl,3 LET Temp = Cmd2a 'Befehlsbit 2 auswerten IF Temp > Bitmin THEN SET Befehl,2 LET Temp = Cmd1a 'Befehlsbit 1 auserten IF Temp > Bitmin THEN SET Befehl,1 LET Temp = Cmd0a 'Befehlbits 0 auswerten IF Temp > Bitmin THEN SET Befehl,0 LET Temp = Toggle_a 'Togglebit auswerten ' IF temp > bitmin THEN SET befehl,6 ELSE RES befehl,6 'Ergebnisse anzeigen LCDWRITE 2,1,"Adr:",Adresse," Bef:",Befehl GOTO loop END ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++