1 Sekunde über TIMER1 mit Uhrenquarz - Probleme
Samstag, 19. Mai 2012
 
 

PIC Mikrocontroller Forum  |  PIC Mikrocontroller  |  Programmiersprache Assembler  |  Timer (Assembler)  |  1 Sekunde über TIMER1 mit Uhrenquarz - Probleme « vorheriges nächstes »
Seiten: [1] Nach unten Drucken
Autor Thema: 1 Sekunde über TIMER1 mit Uhrenquarz - Probleme  (Gelesen 4956 mal)
 
devzero
Newbie
*
Offline Offline

Beiträge: 32


Profil anzeigen
« am: Mai 09, 2006, 21:58:15 »

Hallo,

ich habe dieses Board durch zufall durch Google gefunden. Endlich mal ein deutsches PIC-Forum - ich kannte bisher nur Sprut als Quelle.

Nun zu meinem Problem, ich habe einen 32,768kHz-Quarz an RC0/1 angeschlossen und möchte damit später mal eine Uhr takten.
Um überhaupt erstmal den Timer hinzubekommen, hab ich ein neues Programm angefangen. Hierbei sollen einfach 2 LEDs abwechselnd im Abstand von einer Sekunde blinken (RB0, RB1).
Die LEDs blinken auch abwechselnd, nur das leider rasend schnell (aber man sieht sie noch flackern) - tun sie aber auch wenn man den Quarz rausnimmt.

Code:
list p=16f873
#include<p16f873.inc>
__CONFIG _XT_OSC & _PWRTE_ON & _WDT_OFF & _LVP_OFF
ERRORLEVEL -302


w_back equ 0x20
status_back equ 0x21
LED equ 0x22


org 0x0
goto Init

; ---- Interrupt ----
org 0x4
ISR
movwf w_back
swapf STATUS,w
clrf STATUS
movwf status_back

incf LED,f ; LED um eins erhöhen
bcf PIR1,TMR1IF

ISR_ende
swapf status_back,w
movwf STATUS
swapf w_back,f
swapf w_back,w
retfie


Init
movlw 0x80
movwf TMR1H
movlw 0x00
movwf TMR1L

bsf STATUS,RP0
clrf TRISB ; PORTB Ausgang
bsf PIE1,TMR1IE ; Timer1 Interrupt erlauben
bcf STATUS,RP0

clrf PORTB

bsf INTCON,PEIE
bsf INTCON,GIE

bcf T1CON,T1CKPS1
bcf T1CON,T1CKPS0
bsf T1CON,T1OSCEN
bsf T1CON,T1SYNC
bsf T1CON,TMR1CS

bsf T1CON,TMR1ON


Main

movf LED,w
movwf PORTB
xorlw D'3'
btfss STATUS,Z
goto Main
clrf LED
goto Main

end



Kann mir da jemand helfen?
Würde mich über Antwort freuen, danke

/devzero
Gespeichert
Stampede
Globaler Moderator
Hero Member
*****
Offline Offline

Beiträge: 969



Profil anzeigen WWW
« Antworten #1 am: Mai 09, 2006, 23:28:27 »

Hallo!

Du musst den Timer in der ISR auch wieder mit 0x80 vorladen, sonst kommst du nicht auf den sekundentakt. Die Taktsycronisation würde ich ebenfalls ausschalten.

Zitat
tun sie aber auch wenn man den Quarz rausnimmt.
Das ist wirklich komisch.

Microchip hat einen Code für eine Echtzeituhr für die 18F geschrieben. Wenn du die CPTSGT-Befehl ersetz und auf das Banking achtest, solltest du diese Routine benutzen können.

Gruß Stefan

Code:
RTCinit
MOVLW 80h ; Preload TMR1 register pair
MOVWF TMR1H ; for 1 second overflow
CLRF TMR1L
MOVLW b’00001111’ ; Configure for external clock,
MOVWF T1CON ; Asynchronous operation, external oscillator
CLRF secs ; Initialize timekeeping registers
CLRF mins ;
MOVLW .12
MOVWF hours
BSF PIE1, TMR1IE ; Enable Timer1 interrupt
RETURN
RTCisr
BSF TMR1H, 7 ; Preload for 1 sec overflow
BCF PIR1, TMR1IF ; Clear interrupt flag
INCF secs, F ; Increment seconds
MOVLW .59 ; 60 seconds elapsed?
CPFSGT secs
RETURN ; No, done
CLRF secs ; Clear seconds
INCF mins, F ; Increment minutes
MOVLW .59 ; 60 minutes elapsed?
CPFSGT mins
RETURN ; No, done
CLRF mins ; clear minutes
INCF hours, F ; Increment hours
MOVLW .23 ; 24 hours elapsed?
CPFSGT hours
RETURN ; No, done
CLRF hours ; Reset hours
RETURN ; Done
Gespeichert

Mr. B A
Full Member
***
Offline Offline

Beiträge: 150



Profil anzeigen
« Antworten #2 am: Mai 11, 2006, 07:23:18 »

Du mußt die beiden Portpins, an denen der Quarz angeschlossen ist, als Eingänge schalten (Hab ich auch nur per Zufall gefunden.) Außerdem solltest du ihn schlafenlegen mit sleep.
Gespeichert
devzero
Newbie
*
Offline Offline

Beiträge: 32


Profil anzeigen
« Antworten #3 am: Mai 12, 2006, 17:04:47 »

Also im Prinzip war softwaremässig alles richtig, natürlich habe ich nur vergessen den Timerwert erneut zusetzen (beim Interrupt) - danke an Stampede.

B-A: Das dachte ich auch erst, aber die Pins müssen nicht extra konfiguriert werden, habe es im Datenblatt nachgelesen und auch nicht getan.

Das Problem lag an mir selbst, ich hab im Eifer des Gefechtes vergessen, auf dem Steckbrett die 15pF Kondensatoren auch an Masse anzuschliessen - die waren quasi nur miteinander verbunden. Drähtchen vergessen. Nun gehts.
Gespeichert
Mr. B A
Full Member
***
Offline Offline

Beiträge: 150



Profil anzeigen
« Antworten #4 am: Mai 13, 2006, 07:52:36 »

Ich habe mit einem 16F648 es getestet. Sobald diese beiden Pins auf Ausgang geschaltet waren, lief die Uhr nicht.
Vielleicht habe ich beim Programmieren des PICs einen Fehler gemacht.
Gespeichert
Seiten: [1] Nach oben Drucken 
« vorheriges nächstes »
Gehe zu:  

Powered by MySQL Powered by PHP Made for Mozilla (Firefox) Made for Internet Explorer
Seite erstellt in 0.043 Sekunden mit 19 Zugriffen.
 
Top! Top!