Forum
PIC Assembler Anfängerfrage 20-04-06 (Elektronik)
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
Gesamter Thread: