Ausbilder 'Durchdrücker'
27.03.2005, 22:26
Hallo. Ich habe ein Programm für den 16f628 geschrieben, das die Dioden abhängig von einem Schalter an RB0 schaltet oder eben nicht. Jetzt brennen keine LEDs am Anfang. Drücke ich ein bißchen auf dem PIC rum brennen alle oder ein paar nur - aber nicht entsprechend dem Muster. Woran kann das liegen ?
P.S.: Die Diodenbeschaltung ist im Code integriert....
list p=16F628
include "P16F628.INC"
__CONFIG _PWRTE_ON & _WDT_OFF & _XT_OSC
Hundert1 EQU 0x22
Hundert2 EQU 0x23
Zehn EQU 0x24
org 0x00 ;Hier startet der PIC
goto Beginn ;Zum Hauptprogramm
org 0x04 ;Interruptadresse
BCF INTCON,INTE
BCF INTCON,INTF ;An RB0 gab es keinen Interrupt
BCF INTCON, GIE
GOTO Entscheiden ;Fragen, ob der Schalter eingeschaltet
;oder ausgeschaltet ist
Ein
BCF STATUS, RP0 ;Bank0 aktivieren
BCF STATUS,RP0
BCF PORTB,7 ;Gruene Diode deaktivieren
BSF PORTA,2 ;Gelbe Diode aktivieren
;Record ein
CALL EineSekunde ;Warten drei Sekunden
CALL EineSekunde
CALL EineSekunde
;Record aus
CALL EineSekunde ;Warten eine Sekunde
;Pause ein
CALL EineSekunde ;Warten eine Sekunde
;Pause aus
BCF PORTA,2 ;Gelbe Diode deaktivieren
BSF PORTA,4 ;Rote Diode aktivieren
CALL EineSekunde ;Warten eine Sekunde
;Kanal ein
CALL EineSekunde ;Warten eine Sekunde
;Kanal aus
CALL EineSekunde ;Warten eine Sekunde
;Pause ein
CALL EineSekunde ;Warten eine Sekunde
;Pause aus
BSF INTCON,RBIE ;Portaenderungsinterrupt für RB0 aktivieren
BSF INTCON,INTE ;Externen RB0 Interrupt aktivieren
BSF INTCON, GIE ;Alle Interrupts aktivieren
SLEEP ;Schlafen
Aus
;Stop ein
BCF STATUS, RP0 ;Bank0 aktivieren
BCF STATUS,RP0
BCF PORTA,4 ;Rote Diode deaktivieren
BSF PORTB,7 ;Gruene Diode aktivieren
CALL EineSekunde
CALL EineSekunde
;Stop aus
BSF INTCON,RBIE ;Portaenderungsinterrupt für RB0 aktivieren
BSF INTCON,INTE ;Externen RB0 Interrupt aktivieren
BSF INTCON, GIE ;Alle Interrupts aktivieren
SLEEP ;Schlafen
Beginn
BCF STATUS, RP0 ;Bank0 aktivieren
BCF STATUS,RP0
BSF CMCON, CM0 ;Alles Digital
BSF CMCON, CM1
BSF CMCON, CM2
BCF INTCON, GIE ;Alle Interrupts deaktivieren
BSF STATUS,RP0 ;Bank1 aktivieren
BSF TRISB,0 ;Pin RB0 ist Eingang
CLRF TRISA
BCF STATUS,RP0
CLRF PORTA
CLRF PORTB
bsf INTCON, RBIE
bcf INTCON, RBIF ;RB Port hat sich nicht geändert
bsf INTCON, GIE ;Alle Interrupts aktivieren
Entscheiden
BCF STATUS, RP0 ;Bank0 aktivieren
BCF STATUS,RP0
BTFSS PORTB,0 ;Ist Bit 0 von PortB aktiviert ?
GOTO Ein
GOTO Aus
EineSekunde
MOVLW D'100'
MOVWF Hundert1
Warte
MOVLW D'100'
MOVWF Hundert2
Wart
MOVLW .10
MOVWF Zehn
Los
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
DECFSZ Zehn,F
GOTO Los
DECFSZ Hundert2,F
GOTO Wart
DECFSZ Hundert1,F
GOTO Warte
RETLW 0
end ;das Ende des Programms
P.S.:
1. Daß einige Bankänderungen nicht nötig sind, da ich bereits in der Bank bin, ist mir bekannt.
2. Kann man davon ausgehen, daß Success! und Verified! bei FPP auch wirklich für überprüften Erfolg stehen ?
P.S.: Die Diodenbeschaltung ist im Code integriert....
list p=16F628
include "P16F628.INC"
__CONFIG _PWRTE_ON & _WDT_OFF & _XT_OSC
Hundert1 EQU 0x22
Hundert2 EQU 0x23
Zehn EQU 0x24
org 0x00 ;Hier startet der PIC
goto Beginn ;Zum Hauptprogramm
org 0x04 ;Interruptadresse
BCF INTCON,INTE
BCF INTCON,INTF ;An RB0 gab es keinen Interrupt
BCF INTCON, GIE
GOTO Entscheiden ;Fragen, ob der Schalter eingeschaltet
;oder ausgeschaltet ist
Ein
BCF STATUS, RP0 ;Bank0 aktivieren
BCF STATUS,RP0
BCF PORTB,7 ;Gruene Diode deaktivieren
BSF PORTA,2 ;Gelbe Diode aktivieren
;Record ein
CALL EineSekunde ;Warten drei Sekunden
CALL EineSekunde
CALL EineSekunde
;Record aus
CALL EineSekunde ;Warten eine Sekunde
;Pause ein
CALL EineSekunde ;Warten eine Sekunde
;Pause aus
BCF PORTA,2 ;Gelbe Diode deaktivieren
BSF PORTA,4 ;Rote Diode aktivieren
CALL EineSekunde ;Warten eine Sekunde
;Kanal ein
CALL EineSekunde ;Warten eine Sekunde
;Kanal aus
CALL EineSekunde ;Warten eine Sekunde
;Pause ein
CALL EineSekunde ;Warten eine Sekunde
;Pause aus
BSF INTCON,RBIE ;Portaenderungsinterrupt für RB0 aktivieren
BSF INTCON,INTE ;Externen RB0 Interrupt aktivieren
BSF INTCON, GIE ;Alle Interrupts aktivieren
SLEEP ;Schlafen
Aus
;Stop ein
BCF STATUS, RP0 ;Bank0 aktivieren
BCF STATUS,RP0
BCF PORTA,4 ;Rote Diode deaktivieren
BSF PORTB,7 ;Gruene Diode aktivieren
CALL EineSekunde
CALL EineSekunde
;Stop aus
BSF INTCON,RBIE ;Portaenderungsinterrupt für RB0 aktivieren
BSF INTCON,INTE ;Externen RB0 Interrupt aktivieren
BSF INTCON, GIE ;Alle Interrupts aktivieren
SLEEP ;Schlafen
Beginn
BCF STATUS, RP0 ;Bank0 aktivieren
BCF STATUS,RP0
BSF CMCON, CM0 ;Alles Digital
BSF CMCON, CM1
BSF CMCON, CM2
BCF INTCON, GIE ;Alle Interrupts deaktivieren
BSF STATUS,RP0 ;Bank1 aktivieren
BSF TRISB,0 ;Pin RB0 ist Eingang
CLRF TRISA
BCF STATUS,RP0
CLRF PORTA
CLRF PORTB
bsf INTCON, RBIE
bcf INTCON, RBIF ;RB Port hat sich nicht geändert
bsf INTCON, GIE ;Alle Interrupts aktivieren
Entscheiden
BCF STATUS, RP0 ;Bank0 aktivieren
BCF STATUS,RP0
BTFSS PORTB,0 ;Ist Bit 0 von PortB aktiviert ?
GOTO Ein
GOTO Aus
EineSekunde
MOVLW D'100'
MOVWF Hundert1
Warte
MOVLW D'100'
MOVWF Hundert2
Wart
MOVLW .10
MOVWF Zehn
Los
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
DECFSZ Zehn,F
GOTO Los
DECFSZ Hundert2,F
GOTO Wart
DECFSZ Hundert1,F
GOTO Warte
RETLW 0
end ;das Ende des Programms
P.S.:
1. Daß einige Bankänderungen nicht nötig sind, da ich bereits in der Bank bin, ist mir bekannt.
2. Kann man davon ausgehen, daß Success! und Verified! bei FPP auch wirklich für überprüften Erfolg stehen ?