Forum: Mikrocontroller und Digitale Elektronik Port reagiert nicht?


von Jonas (Gast)


Lesenswert?

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
1
PIND |= 0x01
 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.

von Klaus (Gast)


Lesenswert?

volatile!

von Bal T. (baltic)


Lesenswert?

Jonas schrieb:
> uint8_t millisec;

versuch mal:

volatile uint8_t millisec;

von Jonas (Gast)


Lesenswert?

ok... Wikipedia nachgelesen, eingefügt, funktioniert wunderbar.
Das wars dann auch schon. :D
Danke!! :)

von Jonas (Gast)


Lesenswert?

@Jens: genau so hab ichs jetzt drin und funktioniert (s.o.)

von Gerd (Gast)


Lesenswert?

PINx verwendet man zum lesen, PORTx zum schreiben eines Ports

von spess53 (Gast)


Lesenswert?

Hi

>PINx verwendet man zum lesen, PORTx zum schreiben eines Ports

Nicht nur. Bei den neueren AVRs toggled das Schreiben einer 1 in das 
PIN-Register den entsprechenden Portpin.

MfG Spess

von Klaus (Gast)


Lesenswert?

Jonas schrieb:
> Das wars dann auch schon. :D

Mach dir nix draus, diese Frage wird hier ca. 10 mal pro Woche gestellt 
;-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.