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
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.
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?
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)
im Datasheet stehen routinen drin, wie man den prescaler umaendert. Verwende diese, soweit ich weiss funktionieren die bcf bsf be option_reg nicht.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.