Forum: Mikrocontroller und Digitale Elektronik PIC-IR-Empfänger HILFE!


von Max (Gast)


Angehängte Dateien:

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

von Otto (Gast)


Lesenswert?

Hallo Max,

was macht das Programm, was macht es nicht, wird es fehlerfrei 
compiliert ?

Otto

von Schoaschi (Gast)


Lesenswert?

Aja.. und du solltest dazu sagen, welches Protokoll verwendet wird.

von Max (Gast)


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

von Max (Gast)


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

von Max (Gast)


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

von Dieter W. (dds5)


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

von Max (Gast)


Lesenswert?

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

von Max (Gast)


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

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
Noch kein Account? Hier anmelden.