Claudi
15.02.2010, 19:44
Hi,
ich hab' noch ein wenig Startschwierigkeiten mit dem 16F877A. Hab' dazu das Lauflichtbeispiel von Sprut für den 16F84 hergenommen und ein wenig umgestrickt für den 16F877A. Ich verwende einen 20MHz-Quarz und 8 LEDs am Port B.
Das sieht dann aus wie folgt:
list p=16f877A
;************************************************* *************
;*
;* Pinbelegung
;* ----------------------------------
;* PORTA: 0
;* 1
;* 2
;* 3
;* 4
;* PORTB: 0 LED
;* 1 LED
;* 2 LED
;* 3 LED
;* 4 LED
;* 5 LED
;* 6 LED
;* 7 LED
;*
;************************************************* *************
;
; sprut (zero) Bredendiek 05/2000 (mod. am 16.01.2002)
;
; Lauflicht am Port B
;
; Taktquelle: 4MHz
;
;************************************************* *************
; Includedatei für den 16F84 einbinden
;
#include <P16f877A.INC>
;
; Configuration festlegen
;
;
; ab 4 MHz: Power on Timer, kein Watchdog, HS-Oscillator
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _HS_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF
;
;************************************************* *************
; Variablennamen vergeben
loops Equ 0x70 ; Zähler für Warteschleife
loops2 Equ 0x71 ; Zähler für Warteschleife
;************************************************* *************
; los gehts mit dem Programm
; Port B auf Ausgabe stellen
Init
bcf INTCON,GIE
bcf STATUS, RP1
bsf STATUS, RP0 ; auf Bank 1 umschalten
movlw B'00000000' ; PortB alle output
movwf TRISB
bcf STATUS, RP0 ; auf Bank 0 zurückschalten
clrf PORTB ; alle LEDs ausschalten
; 1. LED einschalten
bsf PORTB,0 ; LED an RB0 einschalten
; Lauflicht
Loop
call Wait ; Wartezeit
rlf PORTB,f ; laufen zur nächsten LED
goto Loop
;************************************************* *********
; Warteschleife 250 ms
Wait
movlw D'250' ; 250 ms Pause
movwf loops
Wai
movlw .110 ; Zeitkonstante für 1ms
movwf loops2
Wai2 nop ;
nop
nop
nop
nop
nop
decfsz loops2, F ; 1 ms vorbei?
goto Wai2 ; nein, noch nicht
;
decfsz loops, F ; 250 ms vorbei?
goto Wai ; nein, noch nicht
retlw 0 ; das Warten hat ein Ende
end
Jetzt zu meinem Problem:
Schalte ich den Strom an, so leuchten nacheinander so drei oder vier LEDs und das wars dann. Anschließend bleiben alle dunkel.
Ich dachte, dass es zu tun hat mit dem LVP-Modus, habe deshalb schon den LVP mittels _LVP_OFF explizit ausgeschaltet.
Außerdem habe ich um sicher zu gehen, sämtliche Interrupts ausgeschaltet mit bcf INTCON,GIE .
Blockkondensatoren habe ich auch am PIC jeweils zwischen Vdd und GND.
Die Schaltung habe ich auch schon mit einem Beispiel von http://www.voti.nl/blink/code/b877-1.hex ausprobiert und da hat dann in meiner Schaltung die LED bei RA0 geblinkt, so wie es sein soll.
Könnte bitte mal jemand über das obige Programm drübergucken und mich auf eventuelle Fehler hinweisen. Dürfte für jemanden mit ein wenig Erfahrung eine kleine Sache sein. Ich möchte nur sicher gehen, dass in der Software kein Fehler ist.
LG Claudi
ich hab' noch ein wenig Startschwierigkeiten mit dem 16F877A. Hab' dazu das Lauflichtbeispiel von Sprut für den 16F84 hergenommen und ein wenig umgestrickt für den 16F877A. Ich verwende einen 20MHz-Quarz und 8 LEDs am Port B.
Das sieht dann aus wie folgt:
list p=16f877A
;************************************************* *************
;*
;* Pinbelegung
;* ----------------------------------
;* PORTA: 0
;* 1
;* 2
;* 3
;* 4
;* PORTB: 0 LED
;* 1 LED
;* 2 LED
;* 3 LED
;* 4 LED
;* 5 LED
;* 6 LED
;* 7 LED
;*
;************************************************* *************
;
; sprut (zero) Bredendiek 05/2000 (mod. am 16.01.2002)
;
; Lauflicht am Port B
;
; Taktquelle: 4MHz
;
;************************************************* *************
; Includedatei für den 16F84 einbinden
;
#include <P16f877A.INC>
;
; Configuration festlegen
;
;
; ab 4 MHz: Power on Timer, kein Watchdog, HS-Oscillator
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _HS_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF
;
;************************************************* *************
; Variablennamen vergeben
loops Equ 0x70 ; Zähler für Warteschleife
loops2 Equ 0x71 ; Zähler für Warteschleife
;************************************************* *************
; los gehts mit dem Programm
; Port B auf Ausgabe stellen
Init
bcf INTCON,GIE
bcf STATUS, RP1
bsf STATUS, RP0 ; auf Bank 1 umschalten
movlw B'00000000' ; PortB alle output
movwf TRISB
bcf STATUS, RP0 ; auf Bank 0 zurückschalten
clrf PORTB ; alle LEDs ausschalten
; 1. LED einschalten
bsf PORTB,0 ; LED an RB0 einschalten
; Lauflicht
Loop
call Wait ; Wartezeit
rlf PORTB,f ; laufen zur nächsten LED
goto Loop
;************************************************* *********
; Warteschleife 250 ms
Wait
movlw D'250' ; 250 ms Pause
movwf loops
Wai
movlw .110 ; Zeitkonstante für 1ms
movwf loops2
Wai2 nop ;
nop
nop
nop
nop
nop
decfsz loops2, F ; 1 ms vorbei?
goto Wai2 ; nein, noch nicht
;
decfsz loops, F ; 250 ms vorbei?
goto Wai ; nein, noch nicht
retlw 0 ; das Warten hat ein Ende
end
Jetzt zu meinem Problem:
Schalte ich den Strom an, so leuchten nacheinander so drei oder vier LEDs und das wars dann. Anschließend bleiben alle dunkel.
Ich dachte, dass es zu tun hat mit dem LVP-Modus, habe deshalb schon den LVP mittels _LVP_OFF explizit ausgeschaltet.
Außerdem habe ich um sicher zu gehen, sämtliche Interrupts ausgeschaltet mit bcf INTCON,GIE .
Blockkondensatoren habe ich auch am PIC jeweils zwischen Vdd und GND.
Die Schaltung habe ich auch schon mit einem Beispiel von http://www.voti.nl/blink/code/b877-1.hex ausprobiert und da hat dann in meiner Schaltung die LED bei RA0 geblinkt, so wie es sein soll.
Könnte bitte mal jemand über das obige Programm drübergucken und mich auf eventuelle Fehler hinweisen. Dürfte für jemanden mit ein wenig Erfahrung eine kleine Sache sein. Ich möchte nur sicher gehen, dass in der Software kein Fehler ist.
LG Claudi