Hallo liebe Gemeinde!
Ich habe das Problem, dass der AVR SImulator bei der Timerbehandlung
unter bestimmten Bedingungen einfach nicht weitermacht.
Folgender Code (Auszug) funktioniert:
1 | OCR2 = PINC;
|
2 | if (OCR2 > 0)
|
3 | { TCCR2 = 0x69;
|
4 | }
|
5 | else
|
6 | { TCCR2 = 0x29;
|
7 | }
|
Wenn ich nun während der Simulator läuft PINC ändere, ändert sich auch
OCR2 und meine PWM AUsgabe wird an OC2 prima simuliert.
Nun will ich OCR2 per Tasten an INT0 und INT1 ändern können.
Dazu
1 | MCUCR &= 0xF0; //Bit 0 und 2 löschen;
|
2 | MCUCR |= 0x0A; //Bit 1 und 3 setzen - negative Flanke an den Interrupts
|
Die Interruptroutinen (auch wenn für das Problem nicht wirklich
wichtig):
1 | ISR( INT0_vect ) // Heizung höherstellen
|
2 | {
|
3 | if (heizstufe <= 19) heizstufe += 1;
|
4 | }
|
5 |
|
6 | ISR( INT1_vect ) // Heizung runterstellen
|
7 | {
|
8 | if (heizstufe >= 1 ) heizstufe -=1;
|
9 | }
|
nun der Programmteil, in dem Einfluß auf den Timer zwecks PWM Ausgabe
genommen werden soll.
1 | while (1)
|
2 | {
|
3 | // HeizungsPWM stellen
|
4 |
|
5 | if (heizstufe >= 1)
|
6 | {
|
7 | TCCR2 = 0x69;
|
8 | OCR2 = (int)255 / 20 * heizstufe;
|
9 | }
|
10 | if (heizstufe = 0)
|
11 | {
|
12 | TCCR2 = 0x29;
|
13 | OCR2 = 0;
|
14 | }
|
15 | }
|
wenn ich für die heizstufe 0 vorgebe, läft der Simulator bis zur Zeile
OCR2=0, der Timer läuft einmal durch und der Prozessor läuft.
bei einem höheren Wert komme ich bis zur Zeile OCR2 = (int..... und dort
bleibt alles stehen.
Das passiert auch wenn ich statt dem Cast einen hex, oder dez Wert
übergebe. Wenn ich das Ganze an das STK500 sende, kann ich auch nicht
feststellen, ob der Timer richtig tut. Habe eine LED auf OC2 (PWM
Ausgang) gelegt und zwei Taster auf INT0/INT1.
Nun müsste nach spätestens 20 Tastendrücken auf INT1 die LED mal
ausgehen.
Tut sie aber nicht und ich kann nicht unterscheiden,ob da nun die
Interruptbehandlung faul ist, oder eben der Timer im Prozessor
genausowenig läuft, wie im Simulator, bzw. der Proz ebenso steht.
Jemand eine Idee?
Ach ich vergaß: Ist AVR Studio 4 (6 will bei mir nicht recht) und der
Proz ist ein ATMega32
Gruß Thomas