oh ähm jaklar timer1 .. dann isses natürlcih CS12 hab mich von dem typo hiniressen lassen ... immer dieses blöde copy&paste
in der doku steht ja CSn0 CSn1 und CSn2 wobei n für dne timer steht haha
oh ähm jaklar timer1 .. dann isses natürlcih CS12 hab mich von dem typo hiniressen lassen ... immer dieses blöde copy&paste
in der doku steht ja CSn0 CSn1 und CSn2 wobei n für dne timer steht haha
Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
nicht.
ja danke :-D
ich habe jetzt noch eine doofe frage aber was soll schon passieren..
also die 1 ms habe ich jetzt aber ich soll ja jede zweite LED 9 ms leuchten lassen.
muss ich dafür einen zweiten timer einfügen oder reicht dass mit diesem invertierenden befehl bei else? ist das programm denn sonst richtig??
grüss dich,
Ich habe noch etwas am quellcode geändert.
Wenn ich das programm laufen lasse, funktioniert es immernoch nicht so wie gewünscht...
warum hast du in dein Interrupt eine Endlosschleife?Code:ISR (TIMER1_OVF_vect) { long timer_1 = 0 ; // Variable "Timer1" deklarieren long timer_2 = 0 ; // Variable "Timer2" deklarieren while (1) { timer_1 ++; // Vorladewert von 0 an inkrementieren PORTB = 0xAA ; // ungerade LED´s werden für 1 ms beleuchtet if (timer_1 = preload_value_1) { TIMSK = (1 << TOIE1); // 1 ms ist vergangen -> Interrupt einschalten } else { timer_2 ++; PORTB=0x55 ; // gerade LED´s werden für 9 ms beleuchtet if (timer_2 = preload_value_2) { TIMSK = (1 << TOTIE1); // 9 ms sind vergangen-> Interrupt einschalten } } } }
Dein Programm ist schneller beendet, als der Timer1 sein Interrupt auslöst.Code:int main (void) { DDRB |=(1<<PB2); // Output 1 DDRB |=(1<<PB3); // Output 2 sei (); }
Und du greifst gar nicht auf deine init_Timer1 Funktion zu. Also läuft dieser erst gar nicht an.
ja ich habe eine endlosschleife benutzt, weil der wechsel zwischen 1 ms und 9 ms ewig stattfinden soll.
achso, ja wo kommt das sei() dann genau hin?![]()
Okay... ich erkläre es dir, aber ich sehe hier ein großes Wissensdefizit im Bereich Progammierung von Microcontroller in der Sprache C bzw. C++!
(Und ja... ich bin auch nicht der super Programmierer)
sei(); gibt hier die Interrupt global frei. Soll heißen, dass du den Controller erlaubst auf Interrupt zu reagieren. cli(); ist dem entsprechen die Sperrung von Interrupt.
Deine Endloschleife (oder auch Arbeitsschleife genannt) sollte in der Main Funktion sein (hinter der Initialisierung).
Interrupts sollten immer so kurz und knapp programmiert werden wie möglich, um die Unterbrechung vom Programm möglichst kurz zu halten (ist aber in deinem Fall egal).
von daher würde ich dein Code so strukuieren:
Sry, dass ich meine Antwort möglichs oberflächlich halte. Aber ich lese aus deinem ersten Post herraus, dass du den Auftrag hast den Code zu entwickeln bzw. dir Gedanken dazu zu machen sollst. Wir sind alle bereit dir zu helfen, aber ich werde dir keinen fertigen Code anbieten.Code:- Einbinden von Headerdatein - Funktionen und Interruproutinen -Hauptfunktion + Portrichtung konfigurieren + Timer initialisieren + Interrups global freigeben + Arbeitsschleife
Darf man hier fragen, wer dich dazu verdammt hat?
Lesezeichen