so. nach einigen tests von beiden beschriebenen beiträgen muss ich leider wider einen misserfolg vermelden. es will und will nicht.
so. nach einigen tests von beiden beschriebenen beiträgen muss ich leider wider einen misserfolg vermelden. es will und will nicht.
Wie macht sich den der Fehler bemerkbar?
Wird die Timer-ISR nicht ausgeführt oder was?
Schaut ruhig mal auf meiner Homepage vorbei:
http://kampis-elektroecke.de
Oder folge mir auf Google+:
Daniel Kampert
Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.
Gruß
Daniel
Weder ein syntaktisch noch ein semantisch Fehler wird vom Compiler angezeigt, folgedessen muss es sich um einen Logikfehler handeln.
Bemerkbar macht sich das dadurch, dass der Couter jetzt gar nicht mehr hochzählt.
folgenden code verwende ich im moment:
laut meinem verständnis sollte der code jede sekunde unterbrechen und den zähler "Laufvariable" durch die isr um eins erhöhen. ist der zähler über 100 gekommen, so wird er reseted.//Variablen initialisierung
long int Laufvariable = 0;
//HAUPTPROGRAMM
int main (void)
{
//Timer1 (16Bit) Initialisieren
TCCR1A |= (1<<CS02) | (1<<CS00) | (1<<WGM10);
OCR1A = 15625;
TIMSK |= (1<<OCIE1A);
sei();
...
...
//Ausgabe der Variablen "Laufvariable" auf dem Display
//(Displayfehler habe ich 100%ig ausgeschlossen)
...
...
return 0;
}
//INTERRUPT von Timer1 (16Bit)
ISR (TIMER1_COMPA_vect)
{
if (++Laufvariable > 100)
Laufvariable = 0;
}
Geändert von tom77? (15.06.2012 um 14:06 Uhr)
Hallo,
drei Dinge fallen mir spontan auf:
- die Laufvariable muss volatile sein (volatile long int Laufvariable = 0Warum ist die überhaupt Long? Wenn die nur bis 100 zählt reicht ein Smallint bis 127 oder zumindest ein Byte. Controller-Speicher ist kostbar!
- in die ISR müsste noch ein OCR1A = 15625; oder?
- ist die Display-Ausgabe in der Main auch in einer Endlosschleife?
Viele Grüße
Andreas
Nachtrag: Ich habe gerade das Register OCR1A nachgeschlagen. Das ist ja der Compare-Vergleichswert. Da reicht es, wenn er einmal gesetzt wird. In der ISR kannst du ihn weglasen.
Die Initialisierung des Timers habe ich nicht geprüft. Ich hoffe die Bits stimmen alle, und auch der Interrupt wird richtig aktiviert. Wenn es immer noch nicht läuft, würde ich eine LED anschalten, wenn die Interrupt-Routine ausgeführt wird. (Vor dem sei natürlich ausschalten)
hmm.. danke dir erst mal für deine mühen. code hab ich versucht --> erfolglos![]()
zum datentyp. in der praxis zählt er höher als bis 100 (100 war nur zur vereinfachten darstellung im forum - aber auch mit 100 funktioniert es nicht)
led werde ich testen.
led wird nicht angesteuert- ergo wird die routine gar nicht angesprochen. aber warum
?
Ist auch ein wildes Durcheinander.
Im letzten geposteten Code:
TCCR1A enthält keine Prescalerbits, ein paar Posts vorher war das noch ein bisserl besser:Code://Timer1 (16Bit) Initialisieren TCCR1A |= (1<<CS02) | (1<<CS00) | (1<<WGM10); OCR1A = 15625; TIMSK |= (1<<OCIE1A); sei();
Lies das Datenblatt statt programming-by-guessing.Code:TCCR1B |= (1<<CS02) | (1<<CS00);
Prescalerbits und auch einige andere Bitnamen haben bei Atmel die Timernummer im Namen, ein CS02 ist ein Timer0-Bit, hat hier nur keinen Einfluss, da das Register sowieso das Falsche ist und die Bits für Timer0 und Timer1 ander gleichen Position stehen.
Außerdem ver-odert man bei der Initialisierung nicht:
sondern weist direkt zu, damit die Register einen definierten Zustand erhalten.Code:TCCR1A |= ...
Mach das alles richtig und es wird gehen.
ich danke euch allen für die posts. werde mich wohl selbst etwas mehr einlesen müssen und hoffen dass ich etwas mehr finde.
Lesezeichen