Hi
Ich habe ein Problem mit meinem Atmega328.
Wenn ich einen "bestimmten" Sketch per avrdude hochladen will
bekomme ich eine Fehlermeldung:
1 | avrdude: verifying ...
|
2 | avrdude: verification error, first mismatch at byte 0x0000
|
3 | 0x00 != 0x0c
|
4 | avrdude: verification error; content mismatch
|
5 |
|
6 | avrdude: safemode: lfuse changed! Was 22, and is now 0
|
7 | Would you like this fuse to be changed back? [y/n]
|
Ich habe dann bisher mit CTRL+R abgebrochen...
Kurz zur Vorgeschichte:
Ich habe einem Arduino Nano den Atmega328 entlötet
und auf meine selbst entworfene Platine gelötet. Kurz und knapp
wollte ich einfach nur den Atmega haben und nicht den ganzen
Schnulz vom Arduino Board um die Stromaufnahme auf ein minimum zu
reduzieren. Der Atmega läuft außerdem nun mit 3.3V. Logischerweise
schreibe ich meine *.hex Dateien nun per UsbAsp Clone auf den Atmega und
nicht via "hochladen" in der Arduino IDE. Ich habe ihn erfolgreich
auf 1Mhz interner Oszillator und Ausgabe des Systemtakts auf PB0
programmiert. Meine Fuses sind damit:
Zum programmieren benutze ich die Arduino IDE und lasse mir dann den
Sketch als hex exportieren.
Damit auch das Timing (1MHz) stimmt habe ich diese Anweisung in der
"boards.txt" geändert:
1 | nano.build.f_cpu=1000000L
|
Ein einfacher Blink Sketch der PD1 und eine daran gehängte LED im
Sekunden Takt blinken lässt funktioniert tadellos:
1 | void setup() {
|
2 | // put your setup code here, to run once:
|
3 | DDRD = B00000010; //set PD1 as output
|
4 | }
|
5 |
|
6 | void loop() {
|
7 | // put your main code here, to run repeatedly:
|
8 |
|
9 | PORTD = B00000010;
|
10 | delay(500);
|
11 | PORTD = B00000000;
|
12 | delay(500);
|
13 | }
|
avrdude gibt keinerlei Fehlermeldungen raus und der Sketch läuft:
1 | ...
|
2 | Reading | ################################################## | 100% 0.33s
|
3 |
|
4 | avrdude: verifying ...
|
5 | avrdude: 638 bytes of flash verified
|
6 |
|
7 | avrdude: safemode: Fuses OK (E:FF, H:D9, L:22)
|
8 |
|
9 | avrdude done. Thank you.
|
Nun wollte ich mein SSD1306 Oled an dem Atmega testen, habe alle libs in
Arduino IDE runtergeladen und ein minimalen Sketch geschrieben.
1 | #include <SPI.h>
|
2 | #include <Wire.h>
|
3 | #include <Adafruit_GFX.h>
|
4 | #include <Adafruit_SSD1306.h>
|
5 |
|
6 | #define SCREEN_WIDTH 128 // OLED display width, in pixels
|
7 | #define SCREEN_HEIGHT 64 // OLED display height, in pixels
|
8 |
|
9 | // Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
|
10 | #define OLED_RESET 4 // Reset pin # (or -1 if sharing Arduino reset pin)
|
11 | Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
|
12 |
|
13 |
|
14 |
|
15 | void setup() {
|
16 | display.begin(SSD1306_SWITCHCAPVCC, 0x3D); // Address 0x3D for 128x64
|
17 | display.clearDisplay();
|
18 |
|
19 | display.setTextSize(1); // Normal 1:1 pixel scale
|
20 | display.setTextColor(WHITE); // Draw white text
|
21 | display.setCursor(0,0); // Start at top-left corner
|
22 | display.println("Hello, world!");
|
23 | display.display();
|
24 | }
|
25 |
|
26 | void loop()
|
27 | {}
|
Wenn ich nun diesen Sketch exportiere und versuche auf den Atmega zu
schreiben bekomme ich die obige Fehlermeldung...
Warum versucht gerade dieser Sketch die Fuses beim hochladen zu ändern
und der Blink Sketch nicht? Warum will er die Fuses auf 0 ändern?