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
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