hmm.. danke aber ich such immer noch nach c-source-code....
hmm.. danke aber ich such immer noch nach c-source-code....
Wie gesagt, schau dir die Tutorials an...
Es ist besser etwas zu können als den ganzen Code zu kopieren, und so schwer istn nun auch nicht
Welche Timer hast du schon in Verwendung?
Bzw. Welche Timer-Pins?
benötige ich denn pins um einen timer starten zu können?
timer im allgemeinen verwende ich noch nicht.
Neee...aber man kann den Timer direkt nach außen legen auf einen Pin...
Aber ich helf dir mal ein bisschen....
Du willst:
Im 1Hz Takt wird eine Variable inkrementiert
Du brauchst:
Timer
Prescaler
Interrupt
Interrupt-Routine
Variable
Einen fertigen Code wirst du wahrscheinlich nirgends finden - bekommen wirst du von uns auch keinen - nur Denkanstöße
hmm.. also wenn ich alles richtig kapiert habe, dann mal eine kleine nachfrage...
wie ich den code verstehe:TCCR1B |= (1<<CTC1)| (1<<CS02) | (1<<CS00);
OCR1C = 15625;
OCR1A = 0;
TIMSK |= (1<<OCIE1A);
zeile eins ergibt den vorteiler mit wert 1024 (dann wird der interrupt ausgelößt).
nach dem wert in zeile zwei (15625) wird wider bei null (wegen zeile drei) begonnen.
zweile vier schaltet den interrupt wieder frei.
berechnung:
16Mhz / 1024 = 15625Hz
1/15625Hz = 0,000064 Sek.
funktion:
der timer wir alle 0,000064 Sek. um den wert eins erhöht (+1).
bei "OCR1C = 15625;" bedeutet das 0,000064 Sek. * 15625 = 1,00 Sek.
der timer springt ab 15625 auf 0 und dann wird die interrupt routine ausgelößt und so geht es weiter und weiter und weiter....
liege ich soweit richtig mit meiner interpretation?!
und wie um gottes willen lege ich jetzt diese interrupt routine an?!
Also.
In deiner ersten Zeile stellst Du den Prescaler ein und sagst dem Timer, das das TCNT Register bei einem Comparematch 0 werden soll.
In der zweiten Zeile gibst Du an, das das Comparematchregister 1C einen Wert von 15625 haben soll.
In der dritten Zeile weist Du dem OCR1A Register den Wert 0 zu, was aber eigentlich keinen Sinn macht.
In der vierten Zeile gibst Du den Interrupt bei Comparematch des 1A Comparematch frei.
Nimm Zeile 2 raus und weise in Zeile 3 dem OCR1A den Wert 15625 zu.
Das Ganze funktioniert nun so 16MHz/1024/15625 = 1Hz. Das passt dann schon mal.
Das anlegen eines Interrupts ist von deinem Compiler abhängig.
Soweit ich weiß muss man bei AVR GCC die interrupt.h Library includen #include <avr/interrupt.h> und kann dann mit der Funktion.
ISR (Vektorname)
{
}
Nach der Initialisierung und vor der Hauptschleife deines Programmes musst Du mit sei(); noch global die Interrupts frei geben.
Sonst wird niemals ein Interrupt ausgeführt.
Den Funktionsaufruf der Interruptroutine starten.
Da gibts aber so viele Tutorials dafür, guck da einfach mal nach.
In diesem Interrupt würde ich nur ein Flag setzen ( Bit Variable ) und im Hauptprogramm dieses Flag wieder löschen, sobald es verarbeiet wurde.
Dadurch bleibt die Interruptroutine sehr kurz, was ja auch erwünscht ist.
Hi
du machst den Fehler das du Timer1 mit parameter von Timer0 lädst
so gehts - nur Quartz anpassen
#include <avr/io.h>
#include <avr/interrupt.h>
#define F_CPU 5120000
#include <util/delay.h>
#include <avr/pgmspace.h>
#include <stdio.h>
#include <inttypes.h>
ISR(TIMER1_COMPA_vect)
{
PORTA ^= (1<<PA1);
}
int main(void)
{
TCCR1B |= (1<<WGM12)| (1<<CS12) | (1<<CS10);
OCR1A = 5000;
TIMSK |= (1 << TOIE1);
TIMSK |= (1<<OCIE1A);
sei();
while(1);
}
danke. inzwischen habe ich aber schon die lösung für mein problem gefunden.
Lesezeichen