Idiotischer Anfängerfehler

OP #3369625
Lesenswert?

Hallo Leuts,
nach vielen Jahren habe ich mal wieder mein Olimexboard mit dem Mega16 
bestückt und bin am probieren.
Mein AVR Dragon funzt einwandfrei, daran kann es nicht liegen.
An Port B0 ist eine LED angeschlosen, die eifnach nur blinken soll: Aber 
ich kann den Endwert der for-Schelifen ändern wie ich will, es tut sich 
nichts.
Wenn ich nur den Port einschalte oder ausschalte, also nur EINE 
Anweisung in der while schleife, dann geht es.
Hat jemand eine rettende Idee ?
1
#define  __AVR_ATmega16__  1
2
#define OSCSPEED  8000000    /* in Hz */
3

4
#include "avr/io.h"
5

6

7
void Initialize()
8
{
9
  PORTB = 0x01; //Led is set off
10
  PORTC = 0x00;
11
  PORTD = 0x00;
12

13
  DDRB = 0x01; // Led is set as output
14
  DDRC = 0x01;
15
  DDRD = 0x01;
16
  
17
}
18

19
int main()
20
{
21
  unsigned long l;
22
  Initialize();
23
  while (1)
24
  {
25
    PORTB = 0xFF;
26
    PORTD = 0xFF;
27
    for(l=0;l<100000;l++)
28
      ;
29
    PORTB = 0x00;
30
    PORTD = 0x00;
31
    for(l=0;l<100000;l++)
32
      ;
33
  }
34
  return 0;
35
}
Gast #3369638
Lesenswert?

Der Compiler optimiert die for Schleifen raus, weil sie keinen Code 
enthalten. Führe entweder:
- Ein NOP aus
  for (long b = 0; b < 10000; b++) {
       asm("nop");
  };
- oder nutze die Funktion _delay_ms(time_in_ms); Musst dafür nur
  #include <util/delay.h>
  hinzufügen und den Takt über define.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren