Guten morgen
So, nachdem ich mich nun sehr intensiv aber erfolglos mit der Fehlersuche beschäftigt habe, hoffe ich dass ihr mir helfen könnt.
Hier erstmal der Code:
Ich habe mit den Kommentaren nicht gegeizt, da ich noch in der Anfängerphase bin und ich damit besser zurecht komme.Code:; PIC auswaehlen list p=16f628a ; Include Datei fuer den PIC #include <p16f628a.inc> ; Config Word / Code protection off / Low voltage programming off ; Brown out off / Power up off / Watchdoc off / Oscilator XT / Pin RA5 digital __CONFIG B'11111110000001' ;3F09h ;------------------------------------------------------------------------------ Init ; Comperatorausgaenge als I/O nutzen BANKSEL CMCON ; In Bank wechseln MOVLW B'00000111' ; Wert 0x7h nach Register W MOVWF CMCON ; Register W nach CMCON ; Pins am PortA definieren (1=Eingang 0=Ausgang) BANKSEL TRISA ; In Bank wechseln MOVLW B'00100011' ; Wert 0x23h nach Register W MOVWF TRISA ; Register W nach TRISA ; Level an Pins PortA definieren BANKSEL PORTA ; In Bank wechseln MOVLW B'00000000' ; Wert 0x0h nach Register W MOVWF PORTA ; Register W nach PortA MOVLW B'01010101' MOVWF 0x21 ;------------------------------------------------------------------------------ S1 ; Pruefen ob DIP1 eingeschaltet BANKSEL PORTA ; In Bank wechseln BTFSS PORTA, 0 ; High Level an RA0 ? GOTO UP1 ; Sprung nach UP1 CALL UP2 ; Sprung nach UP2 ; Aufruf Unterprogramm Vergleich CALL Comp ; Schleife durchlaufen solange DIP1 = high GOTO S1 ; Schleife ;------------------------------------------------------------------------------ UP1 ; Anzeigen Status LED an Pin RA2 BCF PORTA, 2 ; Status LED aus GOTO S1 UP2 ; Loeschen Status LED an Pin RA2 BSF PORTA, 2 ; Status LED ein RETURN ;------------------------------------------------------------------------------ Comp ; Vergleich der Port-Level mit Register Hardwareadresse HwAdr (0x21) BANKSEL PORTB ; In Bank 0 wechseln MOVFW PORTB ; Wert aus PortB in Register W MOVWF 0x22 ; Register W nach 0x22 MOVFW 0x21 ; Register 0x22 einlesen SUBWF 0x22, 0 ; Register vergleichen durch Subtraktion BTFSC STATUS, 2 ; Pruefen ob Zero Flag gesetzt BSF PORTA, 4 ; Out schalten BTFSS Status, 2 ; Pruefen ob Zero-Flag gesetzt BCF PORTA, 4 ; Out ausschalten RETURN ; Ruecksprung ;------------------------------------------------------------------------------ ; Ende END
Zum Verständnis hier nochmal die Erklärung was der Code können soll:
Wenn PortA RA0 = low dann mache garnix
Wenn PortA RA0 = high dann schalte Ausgang PortA RA2 auf high
Dadurch wird eine LED eingeschaltet. Der Status der LED wird so lange erhalten wie PortA RA0 = high
Dann wird ein Wert in das Register 0x21h geschrieben. In diesem Beispiel der Wert 0x55h. Solange PortA RA0 auf high soll ein Vergleich zwischen den Pegel an PortB und dem Register 0x21h stattfinden. Dafür wird der Wert durch Subtraktion verglichen. Wenn der Wert gleich ist wird das Zero-Flag gesetzt. Dieses frage ich ab. Wenn high, dann schalte PortA RA4 auf high. Wenn Zero-Flag nicht gesetzt dann PortA RA4 = low.
Im Simulator funktioniert das ganze offensichtlich fehlerfrei.
jedoch in der Schaltung bekomme ich den PortA RA4 nicht auf high.
Jedoch macht mich etwas stutzig. Im Pic Simulator kann ich im Register PORTB keine Änderung feststellen. In der OPtion Controller View kann ich am PortB klicken wie ich will. Das Register zeigt keine Änderung. Bei PortA stellt sich das Register wie erwartet. Ist hier ein PIC Controller User der weiß was ich meine ??
Für jede Hilfe bin ich dankbar!!







Zitieren

Lesezeichen