PIC16F887 Prescaler wird ignoriert

Gast #4186678
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
#4186706
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.
Gast #4186727
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?
#4186742
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)
#4187057
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
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren