PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 16F877A - Startschwierigkeiten beim Proggen



Claudi
15.02.2010, 18: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

Djog
15.02.2010, 19:23
Hallo,
Erst einmal Tag an Alle, ich bin Djog und neu hier.

Schau Dier mal deine Wait an die ist für einen 4Mhz geschrieben. Für einen
20 Mhz brauchst Du 20 Zyklen und 249 Durchläufe.

Claudi
15.02.2010, 19:36
Schau Dier mal deine Wait an die ist für einen 4Mhz geschrieben. Für einen 20 Mhz brauchst Du 20 Zyklen und 249 Durchläufe.

Danke erstmal für das Feedback, aber das mit der Geschwindigkeit ist nicht das eigentliche Problem.

Ich habe die Lösung immer noch nicht. In ein paar seltenen Fällen hat das Programm ordnungsgemäß funktioniert und das Licht lief von links nach rechts und wenn es rechts fertig war, hat es links wieder angefangen.

Ich meinte, das war, wenn ich mit dem Einschalten der Schaltung einige Minuten gewartet habe. Das ließ sich aber auch nicht immer reproduzieren.

Ich glaube mittlerweile, dass es mit der Taktversorgung zu tun hat. Dass nämlich die Kondensatoren vom Quarz zu weit entfernt sind. Hab' nämlich den Quarz nicht ganz runter auf die Platine platzieren können, sondern der steht mit seinen Beinen etwa 6 oder 7 Millimeter über der Platine, weil die beiden Kondensatoren im Weg sind.

Auf dem Lochmaster-Entwurf war eigentlich für die Kondensatoren genug Platz, aber in der Realität haben sich die, und der Quarz auch, als etwas größer erwiesen.

Ich werd morgen nochmal den Lötkolben in die Hand nehmen und den Quarz so tief wie möglich setzen, und die Kondensatoren auf der Unterseite der Platine anordnen.

Außerdem sollte meine Schaltung noch mit einer Reset-Taste aufgerüstet werden. Zum neustarten muss ich bisher immer eine Krokodilklemme wegnehmen und wieder dranmachen.

LG Claudi

theborg
15.02.2010, 20:33
hi wie viel C haste am Quartz ich hab gute Erfahrungen mit 22p gemacht du kannst noch mal _WRT_OFF auf on setze dann wartet er beim einschalten etwas bis der Quarz angeschwungen ist.

Nr5_is_livin
07.03.2010, 18:10
Hi,


ich kenne die Seite von Sprut damit habe ich mir auch die ersten groben Züge des Programmierens beigebracht. Hier ein Dank an den Autor dieser Seite.

Ich vermute, das dein Problem daran liegt, dass das Programm auf der Seite für den PIC16F84A gilt.

Sollte dies der Fall sein, ist die Initialisierung des PICs nicht korrekt und somit führt er Operationen, welche nach Außen sinnlos erscheinen.

Gruß

S

PICture
07.03.2010, 18:55
Hallo!

@ Claudi

Hoffentlich hilft dir Wiki Artikel http://www.rn-wissen.de/index.php/PIC_Assembler#F.C3.BCr_anderen_PIC_umschreiben :)

MfG