Forum: Mikrocontroller und Digitale Elektronik AtTiny2313 und Evaluationsboard V2.01 von Pollin. LEDs blinken nicht wie sie sollen.


von Phillip (Gast)


Lesenswert?

Hallo zusammen,

nach längerer Zeit habe ich nochmal meine 2 Evaluationboards V2.01 von 
Pollin rausgekramt. Früher liefen sie ganz gut mit Windows, nur verdammt 
langsam.

Jetzt hab ich mir das AVR-Plugin zu Eclipse installiert und mir 
angeguckt wie ich jeweils die ATtiny2313 über avrdude beschreiben kann. 
Klappt angeblich auch.

Mein Problem ist, dass ich bei einem echt kleinen und simplen Programm 
schon nicht das erwünschte Ergebnis bekomme.

Unter Eclipse habe ich folgenden C-Code kompiliert:
1
#include <avr/io.h>
2
3
int main()
4
{
5
  DDRD = 96;
6
  PORTD = 0;
7
8
  int x = 0;
9
10
  while(1){
11
    PORTD = 64; // Schaltet nur 2. Led an
12
    for(x = 0; x < 2500; x++);
13
    PORTD = 32; // Schaltet nur 1. Led an
14
    for(x = 0; x < 2500; x++);
15
  }
16
17
  PORTD = 0;
18
19
  return 0;
20
}

Ich hoffe ihr könnt mir zustimmen das die LEDs nun abwechselnd blinken 
sollten (eventuell etwas schnell, aber erhöhte Durchlauf-Zahlen ändern 
nichts). Jedoch gehen beide LEDs an und verharren dann in diesem 
Zustand. Das ganze geht auch einzeln mit den LEDs, aber auch da werden 
sämtliche for-Schleifen und Änderungen ignoriert. Auf beiden Boards 
bekomme ich das gleiche Ergebnis.

Gibt es einen offensichtlichen Fehler im Code den ich nicht sehe!?

Der Fehler verwirrt mich ziemlich weil es sich ja um ein super simples 
Programm handelt und ich es nicht hinbekomme.

Ich bin über alle Anregungen und Hilfen bei der Fehlersuche dankbar :)

Vielen Dank!

von blabla (Gast)


Lesenswert?

Deine for-Bremsen werden vom Optimierer ersatzlos wegoptimiert, da das 
Ergebnis der for-Schleifen nirgends verwendet wird.

aus
1
 while(1){
2
    PORTD = 64; // Schaltet nur 2. Led an
3
    for(x = 0; x < 2500; x++);
4
    PORTD = 32; // Schaltet nur 1. Led an
5
    for(x = 0; x < 2500; x++);
6
  }

wird
1
 while(1){
2
    PORTD = 64; // Schaltet nur 2. Led an
3
    PORTD = 32; // Schaltet nur 1. Led an
4
  }

Du möchtest Dir die _delay_ms()-Funktion näher anschauen... ;)

von Phillip (Gast)


Lesenswert?

Super! Vielen Dank für deine Hilfe. Ich war echt am Verzweifeln.
So klappts nun wunderbar:
1
#include <avr/io.h>
2
#include <avr/delay.h>
3
4
int main()
5
{
6
  DDRD = 96;
7
  PORTD = 0;
8
9
  while(1 != 2){
10
    PORTD = 64;
11
    _delay_ms( 1000 );
12
    PORTD = 32;
13
    _delay_ms( 1000 );
14
  }
15
16
  PORTD = 0;
17
  return 0;
18
}

von Ballermann (Gast)


Lesenswert?

Phillip schrieb:
> PORTD = 32;

Übersichtlicher wird es übrigens wenn Du das folgendermaßen schreibst:
1
PORTD|= (1<<5);

oder
1
PORTD|= (1<<PD5);

oder
1
PORTD = 0b00100000;

Ansonsten muss man bei Dingen wie
DDRD = 96;
immer rumrechenen.
Wenn Du aber
1
DDRD = 0b01100000;
schreibst ist es sofort ersichtlich.

Grüße

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.