Timer im Atmel - wie benutzen? Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte
Autor |
Timer im Atmel - wie benutzen? Suche nach: timer (2126) |
|
|
|
|
BID = 70673
X-Plod Neu hier
Beiträge: 25 Wohnort: Salzgitter
|
|
Hallo
Ich hab es immer noch nicht so recht kapiert, wie ich den TImer im ATmel korrekt benutzen kann. Ich möchte z.B. bei einem Interrupt Signal den Timer für exakt 0,5 Sekunden starten (bei 10 MHz) und währenddessen die Impulse zählen. Wie wird dies erreicht? Habe schon viele TUts gelesen, doch ich werde daraus nicht schlau. WÄre nett, wenn mir einer mal dazu einen kleinen Programmcode schreiben könnte für den Assembler.
mfg und danke |
|
BID = 70695
chilla Schreibmaschine
Beiträge: 1403 Wohnort: von hier zwei mal rechts und dann zwei mal links
|
|
Ich versteh nicht ganz.
bei 10 MHz und ohne Vorteiler macht der Timer in 0,5s doch genau 5000000 Impulse.
oder willst du genau 0,5s messen?
dann ist die Quarzfrequenz aber ziemlich unglücklich gewählt!
soll heissen:
was willst du eigentlich machen????
standart-tipp:
mit Vorteiler und Software-Reload des Zählregisters Fehler möglichst minimieren.
mfg CHillA
_________________
Wenn man erst einmal die Sache verstanden hat, kapiert man auch, wies im Handbuch gemeint war.
Haftungsausschluß:
Bei obigem Beitrag handelt es sich um meine private Meinung.
Rechtsansprüche dürfen aus deren Anwendung nicht abgeleitet wer |
|
BID = 70726
X-Plod Neu hier
Beiträge: 25 Wohnort: Salzgitter
|
Hab ich doch oben erklärt!
Es geht darum, dass ich in einer gewissen Zeit Impulse messen will, sie danach auswerten und das Ergebnis an ein Display ausgeben will. Und ich brauch halt diesen 0,5s Timer, damit eine Zeit habe, womit ich mein Ergebnis erstellen kann. Die 0,5s müssten jedoch ziemlich exakt sein.
Kurz gesagt: In dieser Zeit bekommt der Controller Impulse vom Geschwindigkeitssensor und soll die Geschwindigkeit errechnen. Geschwindigkeit = Weg / Zeit.
Ich hoffe ich habs verständlich geschildert!
mfg
|
BID = 70739
Benedikt Inventar
Beiträge: 6241
|
Was für einen uC verwendest du ? Atmel ist ein Hersteller...
Falls sich der Vorteiler groß genug einstellen lässt, dann stell den Reloadwert so ein, dass alle 0,5S ein Interrupt erzeugt wird.
Ansonsten stell den Timer auf einen möglichst glatten Wert ein (z.B. 400Hz) Dann zählst du eine Variable hoch (oder runter), bis diese überfließt (hier nach 200 Werten) und hast so die 0,5s...
|
BID = 70828
Jornbyte Moderator
Beiträge: 7193
|
.include "m8def.inc" ;Pfad zur Include-Datei ggf. anpassen
.def temp = r16 ;braucht man immer
.org 0000
rjmp reset ;RESET
RETI ; External Interrupt0 Vector Address
RETI ; External Interrupt1 Vector Address
RETI ; Output Compare2 Interrupt Vector Address
RETI ; Overflow2 Interrupt Vector Address
RETI ; Input Capture1 Interrupt Vector Address
RETI ; Output Compare1A Interrupt Vector Address
RETI ; Output Compare1B Interrupt Vector Address
rjmp check ; Overflow1 Interrupt Vector Address
RETI ; Overflow0 Interrupt Vector Address
RETI ; SPI Interrupt Vector Address
RETI ; USART Receive Complete Interrupt Vector Address
RETI ; USART Data Register Empty Interrupt Vector Address
RETI ; USART Transmit Complete Interrupt Vector Address
RETI ; ADC Interrupt Vector Address
RETI ; EEPROM Interrupt Vector Address
RETI ; Analog Comparator Interrupt Vector Address
RETI ; Irq. vector address for Two-Wire Interface
RETI ; SPM complete Interrupt Vector Address
RETI ; SPM complete Interrupt Vector Address
reset:
;Stackpointer initialisieren
ldi temp,low(RAMEND)
out SPL, temp
ldi temp,high(RAMEND)
out SPH, temp
;Timer initialisieren
ldi temp, 0x00 ;kein pwm und kein output-pin
out tccr1a, temp
ldi temp, 0b00000100 ;/256
out tccr1b, temp
ldi temp, 0xb3 ;Werte für 0,5 Sekunden verzögerung
out tcnt1h, temp ;bei 10 MHz
ldi temp, 0x3b
out tcnt1l, temp
ldi temp, 0b00000000 ;Port D = Eingang
out DDRD, temp
ldi zl,0 ;Zählerregister auf Null
ldi zh,0
sei ;Interrupt einschalten
;****** Haupschleife **********************************
loop: sbic Portd,0 ;Port abfragen
adiw zl,0x01 ;Zählen wenn PinD0 = 1 ist
rjmp loop
;****** Interrup des Timers ***************************
check: cli ;Interrupt aus
in temp,sreg ;Status-Reg sichern
;Hier kommt deine Berechnung und Anzeige rein
;der Zählwert steht im Register ZL und ZH
ldi zl,0 ;Zählerregister wieder auf Null
ldi zh,0
push temp
ldi temp, 0xb3 ;Timer wieder updaten
out TCNT1H, temp
ldi temp, 0x3b
out tcnt1l, temp
pop temp
out sreg,temp ;Status-Reg wiederherstellen
sei ;Interrupt wieder einschalten
reti
_________________
mfg Jornbyte
Es handelt sich bei dem Tipp nicht um eine Rechtsverbindliche Auskunft und
wer Tippfehler findet, kann sie behalten.
|
|
Zum Ersatzteileshop
Bezeichnungen von Produkten, Abbildungen und Logos , die in diesem Forum oder im Shop verwendet werden, sind Eigentum des entsprechenden Herstellers oder Besitzers. Diese dienen lediglich zur Identifikation!
Impressum
Datenschutz
Copyright © Baldur Brock Fernsehtechnik und Versand Ersatzteile in Heilbronn Deutschland
gerechnet auf die letzten 30 Tage haben wir 22 Beiträge im Durchschnitt pro Tag heute wurden bisher 33 Beiträge verfasst © x sparkkelsputz Besucher : 182631413 Heute : 7503 Gestern : 7815 Online : 182 30.12.2024 23:41 2 Besucher in den letzten 60 Sekunden alle 30.00 Sekunden ein neuer Besucher ---- logout ----viewtopic ---- logout ----
|
xcvb
ycvb
0.0470449924469
|