Hi! ich habe für meine IR-Fernbedienung mal ein Programm in Assembler für den PIC16F84A geschrieben, doch irgendwie will das nicht funktionieren, und ich finde nach dem x-ten mal durchgehen auch keinen Fehler mehr, sitz wohl schon zu lange davor! Könnte das mal einer von euch, bitte, durchschauen und überprüfen woran es liegen könnte, dass das ganze nicht funktioniert...! Schonmal Danke im Vorraus Grüße Max
Hallo Max, was macht das Programm, was macht es nicht, wird es fehlerfrei compiliert ? Otto
Hi! Sry hab ich ganz vergessen! @Schoaschi also als Protokoll wird das Nec-Protocol hergenommen! http://www.barchard.net/appleremote/protocol/files/page10-1000-full.jpg das ist mal ein Oszi Screenshot von dem IR-Code! HighSignal ~1.2ms LowSignal ~0,5ms @Otto Compilieren funktioniert einwandfrei keine Errors bzw Messages! Des einzige Problem ist, das ich nix raus bekomme!Sprich ich weis nicht wirklich in wie weit das Programm funktioniert, Simmulieren etc geht auch schlecht wegen dem Ir-Signal! Das einzige wo sicher ist, ist das ein Eingangs Signal anliegt...! Grüße Max
Hier noch ne kleine Programmbeschreibung(wie es eig. ablaufen sollte): Zuerst wird geprüft ob an PORTA,0 ein Low Signal(9ms lang) anliegt, wenn ja wird geprüft ob ein High Signal(4.5ms lang) anliegt, und zu gut erletzt ob wieder ein Low-Signal anliegt (0.6ms), dann springt er in das eigentliche Programm, sobald das Signal wieder High wird. Nun läuft er eine kleine Schleife durch, solange das Signal High ist, und erhöht bei jedem Durchlauf die Zahl "Counter1" um 1! Sobald das Signal wieder Low wird, wird es ausgewertet ob es eine Logische "1" oder "0" ist! Ich habe das so definiert das er die Schleife bei einer logischen "1" ~300 mal durchläuft und bei einer logischen "0" ~125 mal, sprich die Zahl "Counter" 1 wird von dem festen wert 175 abgezogen und je nachdem ob es einen Überlauf gibt ist das Signal als High oder Low definiert. Das ganze wird 16 mal durchlaufen und in Code1 reingeschrieben, wird aber nicht ausgewertet!(also 16 Bit´s gesetzt, da die ersten 2 Bytes nur Adressbytes sind und unwichtig zum erkennen der richtigen Taste). Nun springt er in die eigentliche Erkennungsschleife, welche wie oben abläuft. Nachdem die 8Bit´s dann in "Code2" reingeschrieben wurden werden diese verglichen mit den vordefinierten Werten, je nachdem ob das Zero-Flag null ausgibt oder nicht wurde die richtige Taste erkannt, und es wird am passenden PortB,Pin ein High ausgegeben. So ich hoffe das gibt einen kleinen Überblick! Danke im Vorraus für die Mühen. Grüße Max
Hi! So nun mal ein Nachtrag, bin heute mal alles durchgegangen und habe die einzelnen Schleifen durchgetestet(einfach Highsignal auf einen Port legen und dann mit einer LED nachgeprüft)Das Programm ist dann in diesen Zeilen hängen geblieben: Counter11 INCF Counter1,1 ;erhöhre Counter1 um 1 btfsc PORTA,0 ;wird das bit gecleart? goto Counter11 ;nicht gecleart springe zu Counter11 goto Abfrage ;gecleart springe zu Abfrage Abfrage movlw Counter1 ;Schreibe Zahl Counter1 in das Work Register sublw 0x43 ;Ziehe Zahl 0x43(175) von Counter1 ab BTFSC STATUS, C ;Überprüfe ob Carry Flag gesetzt oder nicht goto Low1 ;Wenn Carry Flag nicht gesetzt, keinen Überlauf gehe zu Low1 goto High1 ;Wenn Carry Flag gesetzt, also Überlauf gehe zu High High1 bsf Code1,7 ;Setze bit 7 in Code1 rrf Code1 ;Schiebe jedes Bit um 1 nach rechts in Code1 INCF Counter2,1 ;Erhöhe Zahl Counter2 um 1 movlw Counter2 ;Schreibe Zahl Counter2 in das WorkRegister sublw 16 ;Ziehe Zahl 16 von Counter2 ab, (Überprüfung ob 16 bit geschrieben wurden oder nicht, das dann zum CommandEmpfang über gegangen werden kann BTFSS STATUS, Z ;Überprüfe ob Zero-Flag gesetzt ist goto IREmpfang ; Nicht gesetzt gehe zu IREmpfang goto CommandEmpfang ;Gesetzt gehe zu Command Empfang ;selbe wie High1 nur wird das Bit gecleart Low1 bcf Code1,7 rrf Code1 INCF Counter2,1 movlw Counter2 sublw 16 BTFSS STATUS, Z goto IREmpfang goto CommandEmpfang Die LED für die Sprungmarke Low hat immer geleuchtet, wobei das erste Bit auch 0 ist nur macht er dann irgendwie nicht weiter..! Kann sich den kurzen Teil, bitte jemand einmal anschauen, ob es Logisch so richtig wäre wie es hier dargestellt ist?! Grüße Max
> movlw Counter1 ;Schreibe Zahl Counter1 in das Work Register
Dieser Befehl, also
movlw irgendwas
tritt mehrfach im Programm auf.
Ich vermute, dass da ein Verständnisfehler vorliegt denn es wird nicht
der Wert aus der Speicherstelle nach w kopiert sondern es wird die
Adresse der entsprechenden Speicherstelle in w geschrieben.
Richtig erscheint mir an diesen Stellen
movf irgendwas,w
Hi! Oh, ok das ist dann natürlich ein grober Fehler! Ich werde das gleich mal ausbessern und dann durchtesten melde mich dann nocheinmal! Vielen Dank schonmal! Grüße Max
Hi! So ich habe nun einmal den Fehler ausgebessert, bei den meißten Funktionen, und zusätzlich noch einige mehr gefunden! Funktioniert hat es bis jetzt, leider trozdem noch nicht. Deshalb habe ich etwas neues ausprobiert, und zwar nicht das Command Byte einzulesen, sondern das Adress Byte, das funktioniert wunderbar, nur gibt es folgendes Problem, und zwar ließt er zwar den Code ein nur das Vergleichen funktioniert nicht immer auf Anhieb, manchmal muss ich die Taste 2 mal manchmal gar 20 mal drücken das er den Code richtig erkennt, an was könnte das liegen, das er den Code nicht korrekt einliest, hat da jemand von euch eine spontane Idee? Kann sich ja eigentlich nur um etwas kleines Handeln, da es ja mal funktioniert mal nicht, bzw da das ganze Zeitabhängig ist, schätze ich das er es nicht richtig einliest..! Nur eigentlich mach ich ja beim einlesen nix falsch! Danke schonmal im Vorraus! Grüße Max Hier mal der Code:
1 | main |
2 | |
3 | bsf STATUS, RP0 ;Wechsel zu Bank 1 |
4 | movlw B'00000001' ;Schreibe Zahl in Work-Register 7Ausgänge 1 Eingänge |
5 | movwf TRISA ;Schreibe Zahl in das TRISA Register |
6 | movlw B'11000000' ;Schreibe Zahl in Work-Register 6Ausgänge 2 Eingänge |
7 | movwf TRISB ;Schreibe Zahl in das TRISB Register |
8 | bcf STATUS, RP0 ;Wechsel zurück zu Bank 0 |
9 | |
10 | movlw B'10001000' |
11 | movwf Taste11 |
12 | |
13 | movlw D'200' |
14 | movwf Zahl1 |
15 | |
16 | movlw D'8' ;wieviele bits gelesen werden |
17 | movwf Warte |
18 | |
19 | goto Empfangen ;Springe zu Empfangen |
20 | |
21 | Empfangen |
22 | |
23 | btfsc PORTA,0 |
24 | goto Empfangen |
25 | goto Empfangen2 |
26 | |
27 | Empfangen2 |
28 | |
29 | btfss PORTA,0 |
30 | goto Empfangen2 |
31 | goto Empfangen3 |
32 | |
33 | Empfangen3 |
34 | |
35 | btfsc PORTA,0 |
36 | goto Empfangen3 |
37 | goto IREmpfang |
38 | |
39 | IREmpfang |
40 | |
41 | BCF STATUS,Z |
42 | movf Counter2,0 |
43 | subWF Warte,0 |
44 | BTFSS STATUS, Z |
45 | goto pruf |
46 | goto Auswertung1 |
47 | |
48 | pruf |
49 | |
50 | btfss PORTA,0 |
51 | goto IREmpfang |
52 | goto Counter11 |
53 | |
54 | Counter11 |
55 | |
56 | INCF Counter1,1 |
57 | btfsc PORTA,0 |
58 | goto Counter11 |
59 | goto Abfrage |
60 | |
61 | Abfrage |
62 | |
63 | BCF STATUS,C |
64 | incf Counter2,1 |
65 | movf Counter1,0 |
66 | SUBWF Zahl1,0 |
67 | BTFSC STATUS, C |
68 | goto Low1 |
69 | goto High1 |
70 | |
71 | High1 |
72 | |
73 | bsf Code1,7 |
74 | rrf Code1 |
75 | goto IREmpfang |
76 | |
77 | Low1 |
78 | |
79 | bcf Code1,7 |
80 | rrf Code1 |
81 | goto IREmpfang |
82 | |
83 | Auswertung1 |
84 | |
85 | BCF STATUS,Z |
86 | bsf PORTA,1 |
87 | movf Code1,0 |
88 | subwf Taste11,0 |
89 | btfss STATUS, Z |
90 | goto Auswertung2 |
91 | goto Ausgang1 |
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.