www.mikrocontroller.net

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


Autor: Max (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Max,

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

Otto

Autor: Schoaschi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aja.. und du solltest dazu sagen, welches Protokoll verwendet wird.

Autor: Max (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!

Sry hab ich ganz vergessen!
@Schoaschi
also als Protokoll wird das Nec-Protocol hergenommen!
http://www.barchard.net/appleremote/protocol/files...
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

Autor: Max (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Max (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Dieter Werner (dds5)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Max (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Max (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
main
  
  bsf STATUS, RP0              ;Wechsel zu Bank 1
  movlw B'00000001'            ;Schreibe Zahl in Work-Register 7Ausgänge 1 Eingänge
  movwf TRISA                ;Schreibe Zahl in das TRISA Register
  movlw B'11000000'            ;Schreibe Zahl in Work-Register 6Ausgänge 2 Eingänge
  movwf TRISB                ;Schreibe Zahl in das TRISB Register
  bcf STATUS, RP0              ;Wechsel zurück zu Bank 0

  movlw B'10001000'  
  movwf Taste11

  movlw D'200'
  movwf Zahl1

  movlw D'8'                ;wieviele bits gelesen werden
  movwf Warte

  goto Empfangen              ;Springe zu Empfangen

Empfangen

  btfsc PORTA,0
  goto Empfangen
  goto Empfangen2

Empfangen2
  
  btfss PORTA,0
  goto Empfangen2
  goto Empfangen3
  
Empfangen3

  btfsc PORTA,0
  goto Empfangen3
  goto IREmpfang

IREmpfang

  BCF STATUS,Z
  movf Counter2,0
  subWF Warte,0
  BTFSS STATUS, Z
  goto pruf
  goto Auswertung1

pruf

  btfss PORTA,0
  goto IREmpfang
  goto Counter11

Counter11
  
  INCF Counter1,1
  btfsc PORTA,0
  goto Counter11
  goto Abfrage

Abfrage

  BCF STATUS,C
  incf Counter2,1
  movf Counter1,0
  SUBWF Zahl1,0
  BTFSC STATUS, C
  goto Low1
  goto High1

High1

  bsf Code1,7
  rrf Code1
  goto IREmpfang

Low1

  bcf Code1,7
  rrf Code1
  goto IREmpfang

Auswertung1

  BCF STATUS,Z
  bsf PORTA,1  
  movf Code1,0
  subwf Taste11,0
  btfss STATUS, Z
  goto Auswertung2
  goto Ausgang1


Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.