Hallo zusammen, ich möchte mit einem Testprogramm und Oszi herausfinden, ob meine Timerwerte stimmen. Zur Funktionsweise: jedesmal, wenn TMR1 (16 bit) oder TMR2 (8 bit mit Postscaler) überläuft, toggle ich ein Speicherzellenwert und setze oder lösche einen Port, den ich dann mit dem Oszi erfasse. So müßte ein Rechteck herauskommen mit einer Periodendauer, die der Dauer von einem Überlauf zum nächsten entspricht. Bei TMR1 sind das etwa 0,26 s und bei TMR2 800µs - wenn meine Werte stimmen (siehe Formeln). Leider zeigt mein Oszi kein Rechtecksignal. Vielleicht könnt ihr einen Blick auf dieses kurze Prog werfen und mir einen Hinweis geben? Title "16F88 Test" ERRORLEVEL -302 LIST P=PIC16F88 include "P16F88.INC" __CONFIG _CONFIG1, _HS_OSC & _WDT_OFF & _LVP_OFF & _MCLR_ON & _CCP1_RB3 & _CP_OFF & _DEBUG_OFF & _CPD_OFF & _WRT_PROTECT_OFF #DEFINE tmr1 PORTB,1 ; [pin7]= TMR1-LED #DEFINE tmr2 PORTB,6 ; [pin12]= TMR2-led ;======================================================================= === ; ; RAM Definition ; ;======================================================================= === ; cblock 20h TMR1_Hi TMR2_Hi endc ;======================================================================= === ; ; Hauptprogramm ; ;======================================================================= === org 0 ; Start Adresse 0 Start clrf PORTA clrf PORTB clrf TMR1L clrf TMR1H bsf STATUS,RP0 movlw 0 movwf TRISA movlw 0 movwf TRISB ; movlw b'11000001' ; keine Pull-ups,Rising edge INT0,interner Timer,1:4 prescaler movwf OPTION_REG movlw .200 ; fosz x gewünschte Zeit in s movwf PR2 ; PR2 = -------------------------------------- ; 4 x TMR2-Prescaler x TMR2-Postscaler bcf STATUS,RP0 ; zurück zu Bank 0 ; movlw b'00001001' ; TMR2 aus, prescaler 1:4, postscaler 1:2 movwf T2CON ; ; 4 x PR2 x TMR2-Prescaler x TMR2-Postscaler ; TMR2-Zeit = -------------------------------------------[s] ; fosz ; movlw b'00110000' ; TMR1 aus, prescaler 1:8, Sync an movwf T1CON ; ; 4 x prescaler x TMR1-Wert ; TMR1-Zeit = ------------------------- [s] ; fosz[MHz] movlw 0x20 movwf FSR clrf INDF incf FSR,F btfss FSR,6 ; Lösche Speicherzellen von 0x20 bis 63 goto $-3 ; bsf T1CON,TMR1ON bsf T2CON,TMR2ON Mainloop movf TMR1_Hi,1 ; TMR1_Hi wird in sich selbst kopiert um das Zeroflag zu testen btfss STATUS,Z bsf tmr1 movf TMR1_Hi,1 btfsc STATUS,Z bcf tmr1 movf TMR2_Hi,1 btfss STATUS,Z bsf tmr2 movf TMR2_Hi,1 btfsc STATUS,Z bcf tmr2 btfsc T1CON,TMR1IF call TMR1Overflow btfsc T2CON,TMR2IF call TMR2Overflow goto Mainloop TMR1Overflow movf TMR1_Hi,1 btfsc STATUS,Z goto TMR1LoHi goto TMR1HiLo TMR1HiLo clrf TMR1_Hi goto $+2 TMR1LoHi incf TMR1_Hi bcf T1CON,TMR1IF return TMR2Overflow movf TMR2_Hi,1 btfsc STATUS,Z goto TMR2LoHi goto TMR2HiLo TMR2HiLo clrf TMR2_Hi goto $+2 TMR2LoHi incf TMR2_Hi bcf T2CON,TMR2IF return end
Hi,
> Leider zeigt mein Oszi kein Rechtecksignal.
Schade das Du nicht beschrieben hast was Du auf dem Oszi siehst!
Wenn ich mich recht erinnere liegt auf PORTB,6 ein ANALOG-Eingang. Ohne Umschalten auf DIGITAL wird dort nix zu sehen sein (ANSEL-Register, Datenblatt lesen!)
Hier auch noch ein Link zu diesem Thema: http://www.gooligum.com.au/tutorials/baseline/PIC_Base_A_5.pdf Schau Dir doch auch einmal einen C-Compiler an. Zum Beispiel der CCS. Ist da alles viel einfacher und in 3-4 Zeilen erledigt...
Manfred John schrieb: > Hi, > >> Leider zeigt mein Oszi kein Rechtecksignal. > Schade das Du nicht beschrieben hast was Du auf dem Oszi siehst! Ja, richtig :-) Ich sehe eine 5V-Linie
Chris B. schrieb: > Wenn ich mich recht erinnere liegt auf PORTB,6 ein ANALOG-Eingang. > Ohne Umschalten auf DIGITAL wird dort nix zu sehen sein (ANSEL-Register, > Datenblatt lesen!) clrf ANSEL ist eingefügt, leider ändert sich nichts.
Andy schrieb: > Vielleicht hilft Dir auch diese Seite weiter... > > http://pictimer.picbingo.com/ Sehr gut,danke! Ich denke, der Fehler liegt im falschen Parameter. Das Prog hier ist ja nur ein Testbau. In meinem eigentlichen Programm soll TMR1 nach 11,4 ms ein Zählerstand von etwa 2800 haben bei 8MHz Quarzfrequenz. Im MPLAB-Debugger läuft das auch alles mit dem 1:8 Prescaler, aber wenn ich mir die Ergebnisse des Rechenprogramms anschaue... Helft mir mal auf die Sprünge: ich habe 8Mhz auf dem Quarz, ein instruction cycle ist fosz/4, prescaler 1:8 Mit dieser Formel 4 prescaler TMR1-Wert TMR1-Zeit = ------------------------- fosz stimmt die Rechnung, und MPLAB Debugger sagt das auch Liege ich richtig?
Thomas M. schrieb: > #DEFINE tmr1 PORTB,1 ; [pin7]= TMR1-LED > #DEFINE tmr2 PORTB,6 ; [pin12]= TMR2-led TMR2 ist in der Include-Datei für Timer2 definiert. Wenn hier LEDs angeschlossen wäre es vielleicht sinnvoller die Variablen LED1 und LED2 zu nennen. > cblock 20h Ist Hex-Schreibweise ist bei Microchip nicht 0x20? > btfsc T1CON,TMR1IF > > btfsc T2CON,TMR2IF Die Interrupt Flags TMR1IF und TMR2IF befinden sich im Register PIR1. Gruß John
John Bauer schrieb: > Thomas M. schrieb: >> #DEFINE tmr1 PORTB,1 ; [pin7]= TMR1-LED >> #DEFINE tmr2 PORTB,6 ; [pin12]= TMR2-led > TMR2 ist in der Include-Datei für Timer2 definiert. Wenn hier LEDs > angeschlossen wäre es vielleicht sinnvoller die Variablen LED1 und LED2 > zu nennen. Deswegen hab ich es ja auch klein geschrieben > > >> cblock 20h > Ist Hex-Schreibweise ist bei Microchip nicht 0x20? So gehts aber auch > >> btfsc T1CON,TMR1IF >> >> btfsc T2CON,TMR2IF > Die Interrupt Flags TMR1IF und TMR2IF befinden sich im Register PIR1. DANKE!!! Ich Idiot, klar doch! Aber der Assembler hat es ohne Fehlermeldung übersetzt... Testprogramm läuft jetzt, und ich bekomme das Rechteck. Irgendwas scheint der Debugger falsch zu debuggen. Ich messe folgende Pulsdauer: (Quelle ist der interne Takt fosz/4, also 8Mhz/4=2Mhz) bei Prescaler 1:1 25 ms bei Prescaler 1:8 200 ms, und die Prescalerwerte dazwischen stimmen auch. Das ist die Dauer eines Hi- bzw. Low-Impulses, also 65536 TMR1-Schritte. Wie ich schon schrieb, muß ich für eine Dauer von 11,4 ms auf einen ungefähren TMR1-Stand von 2800 kommen. Meßtechnisch tue ich das nur mit Prescaler 1:1, im MPLAB Debugger mit 1:8. Wo liegt mein Denkfehler? Gruß Tom
Ich habe (m)einen Denkfehler gefunden: es müßten eigentlich 262 ms bei 1:8 und fosz/4 als Takt sein, aber warum messe ich 200 ms bzw. 25ms bei 1:1? Die 2800 bei 25ms können natürlich nicht sein :-((( Gruß Tom
Moin, schau doch mal wie schnell der Internetakt wirklich läuft. Im sinne von: incf PORTx goto $-1 Oder über Hardware Funktion, wenn das bei dem Pic möglich ist. Sieh dir auch mal die Errata an. Gruß Manfred
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.