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:
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
Ich habe mit den Kommentaren nicht gegeizt, da ich noch in der Anfängerphase bin und ich damit besser zurecht komme.
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!!
Lesezeichen