AtTiny2313 und Evaluationsboard V2.01 von Pollin. LEDs blinken nicht wie sie sollen.

Gast #2384206
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!
Gast #2384211
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... ;)
Gast #2384309
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
}
Gast #2384315
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.