Eigentlich ganz einfach:
- Stell mal den Simulator auf ATmega8515
- Cursor auf "main:"
- "Run to Cursor" Strg+F10
zu dem Zeitpunkt hat der schon alle Einstellungen gemacht
Klapp mal TIMER_COUNTER_1/TCCR1A und TIMER_COUNTER_1/TCCR1B in der
I/O-View auf. Zudem PORTA bis PORTD. Man erkennt z.B., dass PINB1 als
Ausgang definiert wurde.
Wir mogeln jetzt etwas:
- Schalt mal CS12 aus und dafür CS10 ein.
Das beschleunigt den Timer um Faktor 256, was das Debugging um eben die
selbe Zeit verkürzt ;)
Wenn du jetzt den Autostep-Modus (Alt+F5) startest, dann siehst du, dass
der Timer losrennt. Während wir jetzt gespannt darauf warten, dass PINB1
auf High gesetzt wird passiert was anderes: PIND5 geht auf High!
Ein flüchtiger Blick ins Datenblatt sagt auch warum: auf dem ATmega8 ist
OC1 = PB1 (wie im Wiki-Code angegeben), auf dem ATmega8515(L) allerdings
ist OC1 = PD5!
Ändere den unteren Teil einfach wie folgt ab:
1 | ; Den Pin OC1A zu guter letzt noch auf Ausgang schalten
|
2 | ldi temp1, 1 << PORTD5 ; Die Notation ist lesbarer, 0b00100000 ist auch gut.
|
3 | out DDRD, temp1
|
und schließ die LEDs an Port D an.
Leider funktioniert das dann in der Simulation immer noch nicht richtig,
obwohl es das meiner Meinung nach sollte:
1 | ; WGM13 WGM12 WGM11 WGM10
|
2 | ; 1 1 1 0
|
Eigentlich sollte der Counter (TCNT1) bis ICR1H laufen... er läuft aber
nur bis OCR1A ... was nur bei WGM10 = 1 passieren sollte (Seite 121,
Tabelle 53). Setze ich im Simulator das Bit, so zählt er höher (0x3FFF),
aber auch nicht bis ICR1.
Vielleicht kann das jemand anderes erklären, ich habe mit den meisten
PWM-Modi noch nichts gemacht. Müsste ich selber nachlesen.
Hoffe, das hilft dir weiter
Gruß
Kai