Forum

Einloggen | Registrieren | RSS  

PIC Assembler Anfängerfrage 20-04-06 (Elektronik)

verfasst von Altgeselle(R) E-Mail, 06.04.2020, 20:42 Uhr

» Verehrte Gemeinde!
» PIC 16F630 , 1MHz Takt , Übungsobjekt, ohne ernsten Hintergrund:
» Aber funktionieren sollte es , macht es aber nicht:
» Es soll alle 4,096 ms ein bit H sein, aber nur einen Programmdurchlauf
» lang. Da dachte ich mir, Timer0 (der genaugenommen ein 8bit Zähler ist) via
» Vorteiler 256:1 mitlaufen lassen und dessen bit3 auf steigende Flanke
» abfragen. Geht 7mal, dann unerklärliche Pause, wieder 7mal ... irgendwann
» mal längere Pause (scheint mir) , mein ostalgisches Oszi kann das nicht
» darstellen.
» Hatte den vermeintlichen 4,096 ms -Takt noch weiter runtergeteilt um eine
» 7-Seg Anzeige (etwa) im Sekundentakt hochzählen zu lassen, dabei fiel auf,
» dass die "Uhr" zu langsam und unregelmäßig lief. Letzteres wieder gelöscht,
» das Übrige sieht dann so aus:
» ;Files Required: P16F630.INC
» list p=16f630 ; list directive to define processor
» #include <p16F630.inc> ; processor specific variable definitions
» errorlevel -302 ; suppress message 302 from list file
» __CONFIG _FOSC_INTRCIO & _WDTE_OFF & _PWRTE_ON & _MCLRE_ON & _BOREN_OFF &
» _CP_OFF & _CPD_OFF
» ORG 0x000 ;processor reset vector
» ;clear RAM
» movlw 0x20 ;Anfang RAM
» movwf FSR ;ins FileSelectRegister
» clrf INDF ;lösche Inhalt indirekt adressiertes Register
» incf FSR,1 ;erhöhe FileSelectRegister um 1
» btfss FSR,7 ;wenn 80h, dann überspringe nächsten Befehl
» goto $-3 ;springe 3 Zeilen zurück
» ;setting SpecialFunktionRegister
» bcf STATUS,RP0 ;Umschaltung auf Bank 0
» movlw b'00000111' ;Zahl in Akku
» movwf CMCON ;Komparator Konfig off, lowest power
» bsf STATUS,RP0 ;Umschaltung auf Bank 1
» movlw b'01010111' ;Zahl in Akku
» movwf OPTION_REG ;pull-up zulassen+timer+prescaler256
» movlw b'00001111' ;Zahl in Akku
» movwf TRISA ;PortA definieren
» movlw b'00000000' ;Zahl in Akku
» movwf TRISC ;PortC definieren
» bcf STATUS,RP0 ;Umschaltung auf Bank 0
» movlw b'111111' ;Zahl in Akku
» movwf PORTA ;Akku zum PortA
» movlw 0x52 ;Kalibrierwert in Akku
» movwf OSCCAL ;korrigiere Oszillator
» goto Haupt ;zum Hauptprogramm
» ; Hier geht's richtig los
» Haupt ;Flankenauswertung timer0
» comf 0x20,0 ;Reg.20 negiert in Akku
» andwf TMR0,0 ;Akku alt & timer0 = Akku neu
» movwf 0x21 ;Akku in Reg.21 = Flankenbits
» movf TMR0,0 ;timer0 in Akku
» movwf 0x20 ;Akku in Reg.20
» movf 0x21,0
» movwf PORTC
»
» goto Haupt ;zum Hauptprogramm
» END ;directive 'end of program'
»
» Weiß jemand, weshalb die Flankenbits (im Register 21) nicht wie erhofft
» regelmäßig zur Verfügung stehen?
» Denkfehler meinerseits oder völlig falscher Ansatz?
» Besten Dank schonmal fürs Durchwurschteln:-|

Hallo,
zunächst: du kalibrierst den Oszillator falsch. Siehe Datenblatt 9.2.5.1, benutze den Code
von Example 9-1.
Um eine konstante Zykluszeit der Hauptschleife zu erreichen, geht man so vor:
Man setzt den TMR0 auf einen gewünschten Wert. Der Timer
zählt dann hoch bis zum Überlauf. Den Überlauf fragt man entweder über eine
Interrupt-Routine ab (siehe 9.4) oder man testet den Timer in einer Schleife, in der
die restliche Zeit "verbraten" wird.
Grüße
Altgeselle



Gesamter Thread:

PIC Assembler Anfängerfrage 20-04-06 - Strippenzieher(R), 06.04.2020, 19:25 (Elektronik)
PIC Assembler Anfängerfrage 20-04-06 - xy(R), 06.04.2020, 20:41
PIC Assembler Anfängerfrage 20-04-06 - Strippenzieher(R), 07.04.2020, 10:36
PIC Assembler Anfängerfrage 20-04-06 - Altgeselle(R), 06.04.2020, 20:42
PIC Assembler Anfängerfrage 20-04-06 - Strippenzieher(R), 07.04.2020, 10:49
Problem gelöst - Strippenzieher(R), 08.04.2020, 18:59