PIC-IR-Empfänger HILFE!

Gast #817285
Lesenswert?

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
Angehängte Dateien:
Gast #817536
Lesenswert?

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
Gast #817556
Lesenswert?

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
Gast #818517
Lesenswert?

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
#818531
Lesenswert?

> 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
Gast #820729
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren