Hallo zusammen,
da ich noch am einarbeiten in die Microcontroller Thematik bin, möchte
ich mir gerade einen einfachen Blinker realisieren.
Da das Programm später noch anderes tun soll, möchte ich es mit Timer
realisieren und nicht mit delay...
Elektronisch habe ich einen ATmega88PA mit jew. LED's an PORTD und PORTB
gegen Masse geschalten.
1 | uint8_t millisec;
|
2 |
|
3 | int main(void)
|
4 | {
|
5 | DDRD = 0xFF; /* PORTD */
|
6 | DDRC = 0x00; /* PINC */
|
7 | DDRB = 0xFF; /* PORTB */
|
8 |
|
9 | PORTC =0x01; /* Pullup an PC0 */
|
10 |
|
11 | /* Timer definieren */
|
12 | TCCR0A |= (0>>WGM02) | (1<<WGM01) | (0>>WGM00); /* CTC-Modus (wenn Compare erreicht Counter=0) */
|
13 | TCCR0B |= (0>>CS02) | (1<<CS01) | (0>>CS00); /* Prescaler=8 */
|
14 | OCR0A = 124; /* Compare-Wert = 125-1, da bei 1MHz und Prescaler 8 125=1ms */
|
15 | TIMSK0 |= (1<<OCIE0A); /* Compare 0A Interrupt freigegeben */
|
16 |
|
17 | sei();
|
18 |
|
19 | while(1)
|
20 | {
|
21 |
|
22 | PIND |= 0x01; /* bei auskommentierung funktioniert nichts mehr */
|
23 |
|
24 | if (millisec==200) {
|
25 | PINB |= (1<<5);
|
26 | millisec=0;
|
27 | PIND = 0xFF;
|
28 | }
|
29 | }
|
30 | }
|
31 |
|
32 | ISR(TIMER0_COMPA_vect) {
|
33 | millisec++;
|
34 | }
|
Wenn ich das Programm nun so aufspiele blinkt alles wie es soll. (D5
blinkt; D 1-7 blinken; D0 ist an, ein Blinken kann ich leider nicht
messen, da kein oszilloskop vorhanden).
Wenn ich jedoch nun die Zuweisung
auskommentiere/lösche, blinkt gar nichts mehr. Alle LED's bleiben aus.
Woran kann so etwas liegen? Gibt es in C++ die Möglichkeit so etwas wie
ein NOP einzufügen?
Dankeschön! ;)
Lg
Jonas
PS: Dass die Nulldefinitionen für DDRC und beim Timer nichts ändern weiß
ich, ich schreib sie fürs Verständnis trotzdem rein.