Blink leuchtet durchgehend.

Hallo zusammen.

Nachdem ich heute meine Lieferung ATMEGA328P erhalten habe und diesen den Arduino Bootloader verpasst habe. Funktioniert ein simples Blink nicht. Die LED leuchtet durchgehend. Habe mittlerweise auch schon DP12 ausprobiert das selbe Problem. Komischerweise ist nach dem Bootloader flashen ja ein Blink drauf was auch funktioniert. Nur wenn ich den Sketch selbst danach einspiele leuchtet der PIN durchgehend. Ein Fade auf PIN9 funktioniert hingegen super.

Was kann das sein?

Greeez Oli

Habe jetzt mal den optiboot Bootloader geflasht, selbes Problem. Auf verschiedenen Chips ausprobiert. Hmmmmm

Also ich habe jetzt das knightrider Example ausprobiert und dort klappt es mit dem digitalwrite das sie an und aus geht. Aber warum zur Hölle geht kein einfaches Blink???

Den optiboot Bootloader habe ich wie folgt geflasht:

[root@workstation optiboot]# make ISPTOOL=stk500v1 ISPPORT=/dev/ttyUSB0 ISPSPEED=-b19200 atmega328_isp
avrdude  -c stk500v1 -p atmega328p -P /dev/ttyUSB0 -b19200 -e -u -U lock:w:0x3f:m -U efuse:w:0x05:m -U hfuse:w:0xDE:m -U lfuse:w:0xFF:m

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.12s

avrdude: Device signature = 0x1e950f
avrdude: erasing chip
avrdude: reading input file "0x3f"
avrdude: writing lock (1 bytes):

Writing | ################################################## | 100% 0.04s

avrdude: 1 bytes of lock written
avrdude: verifying lock memory against 0x3f:
avrdude: load data lock data from input file 0x3f:
avrdude: input file 0x3f contains 1 bytes
avrdude: reading on-chip lock data:

Reading | ################################################## | 100% 0.04s

avrdude: verifying ...
avrdude: 1 bytes of lock verified
avrdude: reading input file "0x05"
avrdude: writing efuse (1 bytes):

Writing | ################################################## | 100% 0.04s

avrdude: 1 bytes of efuse written
avrdude: verifying efuse memory against 0x05:
avrdude: load data efuse data from input file 0x05:
avrdude: input file 0x05 contains 1 bytes
avrdude: reading on-chip efuse data:

Reading | ################################################## | 100% 0.04s

avrdude: verifying ...
avrdude: 1 bytes of efuse verified
avrdude: reading input file "0xDE"
avrdude: writing hfuse (1 bytes):

Writing | ################################################## | 100% 0.12s

avrdude: 1 bytes of hfuse written
avrdude: verifying hfuse memory against 0xDE:
avrdude: load data hfuse data from input file 0xDE:
avrdude: input file 0xDE contains 1 bytes
avrdude: reading on-chip hfuse data:

Reading | ################################################## | 100% 0.04s

avrdude: verifying ...
avrdude: 1 bytes of hfuse verified
avrdude: reading input file "0xFF"
avrdude: writing lfuse (1 bytes):

Writing | ################################################## | 100% 0.04s

avrdude: 1 bytes of lfuse written
avrdude: verifying lfuse memory against 0xFF:
avrdude: load data lfuse data from input file 0xFF:
avrdude: input file 0xFF contains 1 bytes
avrdude: reading on-chip lfuse data:

Reading | ################################################## | 100% 0.04s

avrdude: verifying ...
avrdude: 1 bytes of lfuse verified

avrdude done.  Thank you.

avrdude  -c stk500v1 -p atmega328p -P /dev/ttyUSB0 -b19200 -U flash:w:optiboot_atmega328.hex -U lock:w:0x2f:m

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.12s

avrdude: Device signature = 0x1e950f
avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed
         To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "optiboot_atmega328.hex"
avrdude: input file optiboot_atmega328.hex auto detected as Intel Hex
avrdude: writing flash (32768 bytes):

Writing | ################################################## | 100% 0.58s

avrdude: 32768 bytes of flash written
avrdude: verifying flash memory against optiboot_atmega328.hex:
avrdude: load data flash data from input file optiboot_atmega328.hex:
avrdude: input file optiboot_atmega328.hex auto detected as Intel Hex
avrdude: input file optiboot_atmega328.hex contains 32768 bytes
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% 37.50s

avrdude: verifying ...
avrdude: 32768 bytes of flash verified
avrdude: reading input file "0x2f"
avrdude: writing lock (1 bytes):

Writing | ################################################## | 100% 0.12s

avrdude: 1 bytes of lock written
avrdude: verifying lock memory against 0x2f:
avrdude: load data lock data from input file 0x2f:
avrdude: input file 0x2f contains 1 bytes
avrdude: reading on-chip lock data:

Reading | ################################################## | 100% 0.04s

avrdude: verifying ...
avrdude: 1 bytes of lock verified

avrdude: safemode: Fuses OK

avrdude done.  Thank you.

Zuvor ArduinoAsISP auf einen Arduino und einen selbstgelöteten FlasherShield dann den 328 geflasht.

Meine glaskugel sagt mir, dass das problem irgendwo zu finden ist. Im moment ist es aber noch etwas verschleiert.

madworm:
Meine glaskugel sagt mir, dass das problem irgendwo zu finden ist. Im moment ist es aber noch etwas verschleiert.

Der Post hilft mir nicht weiter. Wenn du Informationen brauchst dann sag welche!

Nun, zum beispiel mal den CODE. Das waere hilfreich.

madworm:
Nun, zum beispiel mal den CODE. Das waere hilfreich.

Das Stinknormales Example, dachte währe klar aber bitte hier:

/*
  Blink
  Turns on an LED on for one second, then off for one second, repeatedly.
 
  This example code is in the public domain.
 */

void setup() {                
  // initialize the digital pin as an output.
  // Pin 13 has an LED connected on most Arduino boards:
  pinMode(13, OUTPUT);     
}

void loop() {
  digitalWrite(13, HIGH);   // set the LED on
  delay(1000);              // wait for a second
  digitalWrite(13, LOW);    // set the LED off
  delay(1000);              // wait for a second
}

Probiers mal hiermit:

Blink.cpp.hex (2.8 KB)

madworm:
Probiers mal hiermit:

Habs geflasht mit:

avrdude -p atmega328p -c arduino -P /dev/ttyUSB0 -b 115200 -D -Uflash:w:Blink.cpp.hex

Und funktioniert. Aber was nützt mir das? Wenn du mir blos ne Binärdatei schickst, da werde ich auch nicht schlau draus!
Wie ist der Code? Und warum funktioniert der Standart Example nicht. Wenn ich einen atmega168 drauf setzte geht es sofort.

Nun, was sagt uns das.

Ich habe mit meinem compiler (und beiwerk) das simple blink beispiel (obiger code) fuer einen 328p compiliert (uno board) und es geht bei dir...

Entweder hast du das falsche board gewaehlt, oder dein compiler hat ein ernsthaftes problem.

Probier mal das hier aus: http://arduino.cc/forum/index.php?topic=100503.0

In dieser variante ist der compiler und die ganze toolchain enthalten (auch fuer linux). Allerdings basiert das ganze auf etwas aelteren versionen. Alles Arduino-relevante geht natuerlich, aber z.B. ATtiny4313 oder gar xmega nicht.

Als Board habe ich auch den Uno gewählt! Und wie ich bereits geschrieben habe mit zb. fade gibt es keine Probleme.

Das ist ja gut und schoen, aber fading laeuft wohl ueber hardware PWM. Das ist nicht das selbe :wink:

Und da 'mein' .hex-file laeuft, kann es nur an deiner toolchain liegen. Andere benutzerfehler mal ausgeschlossen.

Das sagt mir jetzt nichts?! Das knightrider Sketch läuft ja auch mit digitalwrite!

/* Knight Rider 2
 * --------------
 *
 * Reducing the amount of code using for(;;).
 *
 *
 * (cleft) 2005 K3, Malmo University
 * @author: David Cuartielles
 * @hardware: David Cuartielles, Aaron Hallborg
 */

int pinArray[] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 13};
int count = 0;
int timer = 15;

void setup(){
  // we make all the declarations at once
  for (count=0;count<10;count++) {
    pinMode(pinArray[count], OUTPUT);
  }
}

void loop() {
  for (count=0;count<10;count++) {
   digitalWrite(pinArray[count], HIGH);
   delay(timer);
   digitalWrite(pinArray[count], LOW);
   delay(timer);
  }
  for (count=9;count>=0;count--) {
   digitalWrite(pinArray[count], HIGH);
   delay(timer);
   digitalWrite(pinArray[count], LOW);
   delay(timer);
  }
}

Aha... der unterschied ist, dass du ein paar globale variablen definiert hast. Da gab es irgendeien bug in irgendeiner avr-gcc version... frag mich nicht.

http://arduino.cc/forum/index.php/topic,68512.0.html

Probier mal in dem blink beispiel folgendes noch vor setup() einzufuegen:

byte dummy = 1;

Und dann in setup():

dummy++;

madworm:
Aha... der unterschied ist, dass du ein paar globale variablen definiert hast. Da gab es irgendeien bug in irgendeiner avr-gcc version... frag mich nicht.

Probier mal in dem blink beispiel folgendes noch vor setup() einzufuegen:

byte dummy = 1;

Und dann in setup():

dummy++;

Das wars! Danke.
Habe eben noch in einer Windows VM getestet, da geht es von Haus aus mit dem Example.
Habe zwar immer noch nicht so genau verstanden warum das so ist, bin auch kein Genie in C aber naja. Wenigstens wurde des Problems Lösung gefunden.

Das ist ein toolchain bug. Irgendetwas mit den initialisierungsroutienen die laufen bevor main() ueberhaupt anfaengt. Jedenfalls taucht dieses problem nicht in allen versionen auf. Und auf jedenfall nicht in der variante, die mit der naechsten IDE version mitgeliefert wird.