Forum: Mikrocontroller und Digitale Elektronik PIC16F887 Prescaler wird ignoriert


von Max (Gast)


Lesenswert?

Hallo,
ich wollte gerade ein kleines Programm für den PIC16F887 in Assembler 
schreiben.
Dabei wollte ich den TIMER0 mit Prescaler verwenden.
Zwar wird der Interrupt ganz normal ausgelöst und alles scheint zu 
funktionieren aber der Prescaler wird einfach ignoriert.
Ich habe in der Interrupt Routine einfach mal einen Pin immer ein und 
aus schalten lassen und das mit dem Oszilloskop gemessen.
Und egal wie ich den Prescaler ändere, die Frequenz ist immer die selbe.
Was habe ich bei der Initialisierung des TIMER0 bzw. des Prescalers 
vergessen ?

            SEL_BANK1
            BCF     OPTION_REG, T0CS
            BCF     OPTION_REG, PSA
            BSF     OPTION_REG, PS0
            BSF     OPTION_REG, PS1
            BSF     OPTION_REG, PS2

            SEL_BANK0
            BSF    INTCON, T0IE
            BSF    INTCON, GIE

von Little B. (lil-b)


Lesenswert?

Ich sehe an deiner Init-Routine keinen Fehler.

Es gibt in diesem Controller nur einen Prescaler für Tim0 und WDT. Wenn 
du also nach der Tim0-Init den Watchdog konfigurierst, kann das deine 
Einstellung kaputt machen.

Was hast du für einen Debugger? Schau dir doch mal das Option_Reg in 
Laufzeit an.

von Max (Gast)


Lesenswert?

Ja, aber den WDT habe ich allein schon in der Config deaktiviert.
Abgesehen von "BCF OPTION_REG, PSA" wenn ich das mit meinem Debugger 
laufen lasse, steht das auch alles richtig im OPTION_REG.
Ist es möglich, dass die Hardware vielleicht defekt ist, auch wenn 
dieser Fehler sehr unwahrscheinlich wäre?

von Little B. (lil-b)


Lesenswert?

Natürlich kann die Hardware defekt sein, das ist aber sehr 
unwarscheinlich. Ich vermute eher ein Softwarefehler.

Da du die Möglichkeit hast, das Register zu beobachten, schau doch mal, 
wann das PSA zurückgesetzt wird. Ich vermute einen Fehler mit dem 
Bankselect, wodurch du auf Register zugreifst, die du gar nicht 
verändern willst (hier: OPTION_REG)

von chris (Gast)


Lesenswert?

im Datasheet stehen routinen drin, wie man den prescaler umaendert.
Verwende diese, soweit ich weiss funktionieren die bcf bsf be option_reg 
nicht.

von Ottmar K. (wil1)


Angehängte Dateien:

Lesenswert?

Hallo Max
Schade, dass Du nicht Deinen gesamten Code gepostet hast, so kann man 
nicht viel darüber sagen wo der Fehler liegt.

Ich habe Dir mal ein altes Übungsprogramm von mir beigefügt. Es schaltet 
zwischen 2 Prescalerwerten um und macht dies sichtbar. Müsste für den 
887 bei Anpassung von __CONFIG auch laufen. Nicht vergessen: bei PORTB 
die Pins als digitale I/O konfigurieren.

Der von mir gepostete Code schaltet zur Kontrolle im Takt der ISR die 
PORTB-Pins zwischen 0x00 und 0xFF.
Die PORTC-Pins werden im Takt der Umschaltung des Prescalerwertes 64 und 
128 zwischen 0x00 und 0xFF umgeschaltet.

Vielleicht hilft es Dir.

mfG Ottmar

von Ottmar K. (wil1)


Lesenswert?

Sorry, die Sub "Prescaler_128" ist mit "GOTO Main" falsch abgeschlossen 
- richtig ist "RETURN"

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.