Forum: Mikrocontroller und Digitale Elektronik Atmega8 über Arduino programmieren in Linux


von Cornelia (Gast)


Lesenswert?

Hallo zusammen,

bin Anfänger was Mikrocontroller angeht und versuche, über das Tutorial 
http://www.mikrocontroller.net/articles/AVR-Tutorial:_IO-Grundlagen zu 
lernen.

Leider bekomme ich das kleine 1. Programm (2 LEDs leuchten lassen) nicht 
auf den Atmega8.

Mit einem usbAsp habe ich es versucht, es funktioniert aber nicht.
Da ich einen Arduino Uno habe, mit dem es auch funktionieren soll, 
möchte ich ihn gerne nutzen.

Der Atmega8 ist neu, ich möchte der Einfachheit halber zunächst ohne 
externe Taktgeber arbeiten.

Inzwischen habe ich es geschafft, mit Hilfe dieses Tutorials 
http://dangerousprototypes.com/blog/2012/10/28/tutorial-arduino-as-barebones-avr-programmer/ 
den Atmega8 über den Arduino zu programmieren, also die LED leuchtet.
Da der Link ein Video ist, hier eine kurze Zusammenfassung:
- über Arduino-Firmware den Arduino als ISP einrichten
- minimale Verkabelung (Die Anschlüsse des SPI sind angeschlossen, ein 
Kondensator zwischen GND und Reset und eine LED + Widerstand an PD6)
- c-Programm:
1
 #define F_CPU 1000000
2
#include <avr/io.h>
3
#include <util/delay.h>
4
5
int main (void) {
6
  DDRD |=(1<<PD6);
7
  for(;;)
8
    {PORTD ^=(1<<PD6);
9
      _delay_ms(1000);
10
    }
11
  return 0;
12
}
kompilieren und hochladen über ein make-file:
1
avr-gcc -Wall -Os -DF_CPU=1000000 -mmcu=atmega8 -c main.c -o main.o
2
avr-gcc -Wall -Os -DF_CPU=1000000 -mmcu=atmega8 -o main.elf main.o
3
rm -f main.hex
4
avr-objcopy -j .text -j .data -O ihex main.elf main.hex
5
avrdude -c avrisp -P /dev/ttyACM0 -b 19200 -p atmega8 -U flash:w:main.hex:i

Wenn ich nun mit derselben letzten Zeile, mit leds.hex statt main.hex 
die LED-Datei über den hochladen möchte, läuft er zwar schön durch und 
meldet keine Fehler, funktionieren tut es trotzdem nicht (LEDs leuchten 
nicht).
Mir ist aufgefallen, dass der avrdude-output bei der leds.hex enthält
1
avrdude: avr_read(): skipping page 1: no interesting data
, während er beim funktionierenden main.hex erst ab page 2 diese Meldung 
bringt.

Die leds.asm übersetze ich mit avra, ohne Fehlermeldung.
Trotzdem scheint der erzeugte Code nicht richtig zu sein - denn das 
Hochladen über avrdude ist ja ansonsten identisch, und die Verkabelung 
ist auch identisch, bis auf dass ich Ausgänge PB0 und PB1 verwende. Wenn 
ich in die PB0-Reihe ein Kabel an GND anschließe, leuchtet die LED, so 
dass ich von einer richtigen Verkabelung ausgehen kann.

Kann mir jemand einen Tipp geben, wie ich richtige .hex-Dateien erzeuge? 
Kann ich bei avra irgendwelche Optionen angeben (ich selber sehe in der 
Doku nichts was ich für zielführend halte)? Mir fehlt vor allem die 
Möglichkeit, die Geschwindigkeit anzugeben.
Gerne nutze ich auch einen anderen Übersetzer, der unter Linux und mit 
der m8def.inc funktioniert.

Cornelia

von Ralph S. (jjflash)


Angehängte Dateien:

Lesenswert?

Hmmmm, irgendwie liest sich dein Post etwas "verwirrend" manchmal !

Cornelia schrieb:
> Mit einem usbAsp habe ich es versucht, es funktioniert aber nicht.
> Da ich einen Arduino Uno habe, mit dem es auch funktionieren soll,
> möchte ich ihn gerne nutzen.

Gerade unter Linux funktioniert der USBasp relativ gut. Mit einem 
Arduino UNO kann man (wenn man ihm ein Flasher-Programm aufgeladen hat 
auch flashen).

Verwendet man allerdings den UNO als Flasher, wird es in Verbindung mit 
AVRDUDE immer erst einmal einen Timeout geben, weil AVRDUDE beim Starten 
der Übertragung einen Reset des Arduinos auslöst und der Arduino eine 
Zeitlang in seinem Bootloader verweilt. Nach diesem Timeout startet er 
jedoch eine Übertragung (dauert so ca. 6 Sekunden ... und wenn man 
darauf wartet können 6 Sekunden lang sein).

Cornelia schrieb:
> Kann mir jemand einen Tipp geben, wie ich richtige .hex-Dateien erzeuge?
> Kann ich bei avra irgendwelche Optionen angeben (ich selber sehe in der
> Doku nichts was ich für zielführend halte)?

Richtige .hex Files sind korrekt assemblierte oder compilierte 
Programme. Ein Programm das sich übersetzen lässt ist nicht zwingend 
funktionsfähig. Die Parameterliste die man Assemblern, Compilern und 
Linkern mitgeben kann oder muss können ewig viele sein (und genau aus 
diesem Grunde arbeitet man mit Makefiles oder IDEs, die intern häufig 
auch mit Makefiles arbeiten).

--------------------------------------

Wenn man mit Mikrocontrollern hantiert, kämpft man an folgenden Fronten:

- Hardwareaufbau
- Flashen des Controllers
- die logische Programmierung

Um dir deine Dinge zu erleichtern habe ich jetzt einmal genau deine 
"Anforderungen" aufgebaut, allerdings habe ich nur einen China-Clone 
Arduino und dieser hat unter Linux den seriellen Port: /dev/ttyUSB0.

Wie mir scheint hast du einen originalen und du mußt in den Makefiles 
den Port dort anpassen. Welche seriellen Ports du in betrieb hast siehst 
du mit:

ls /dev/ttyA*
ls /dev/ttyU*

Denjenigen Port den dein Arduino verwendet mußt du in den Makefiles 
anpassen.

Die hier angefügte Zipdatei beinhaltet:

- Arduino als STK500v2 Flasher
- Blinky Programm in C (Compiler ist AVR-GCC)
- asmblink Programm in Assembler (Assembler ist AVRA)

Es wird davon ausgegangen, dass AVRA und AVR-GCC installiert sind.

ZIP-Datei in beliebiges Verzeichnis entpacken und in den Verzeichnissen 
die Makefiles verwenden.

Arduino als Flasher
------------------------------------------------
Ich weiss, dass es in der Arduino-IDE einen AVRisp - Flasher gibt, 
sonderlich gut finde ich diesen nicht. Zudem verwendet er eine Baudrate 
von 19200 Baud ... etwas langsam.

Der im ZIP-File enthaltene Flasher verwendet das STK500v2 Protokoll, ist
einiges schneller und die Baudrate beträgt hier 115200 Baud.

Verwendung:

- Arduino mit USB verbinden
- im Verzeichnis aufrufen:
       make
       make flash
   Der Arduino arbeitet nun als STK500v2 Programmer (natürlich ist
   dieses Programm mit einem anderen wieder überschreibbar)

AVRDUDE-Aufruf mit dem Arduinoflasher:

avrdude -c stk500v2 -p m8 -P /dev/ttyACM0 -b 115200 -U 
flash:w:blinky.hex

Die Verschaltung des Arduino als Flasher nach folgendem Plan vornehmen, 
wichtig hierbei sind die seriellen Widerstände von je 56 Ohm (68 gehen 
auch) in den Leitungen von: reset, clock, miso und mosi. Sinn dieser 
Widerstände ist es die Leitungen etwas zu bedämpfen damit die 
Übersprechneigung auf den Leitungen reduziert werden.
1
 Arduino - Uno
2
3
      |                       +5V                                       +5V
4
      |                        ^                                         ^
5
      |        ------          |      +------------------+               |
6
  D10 | o-----|  56  |-------- |------|  1 rst        28 |               |
7
      |        ------          |      |  2            27 |               |
8
      |                   +----+      |  3            26 |               |
9
      |    +5V            |    |      |  4            25 |               |
10
      |     ^       100u ===   |      |  5            24 |               |
11
      |     |            ---   |      |  6            23 |               |
12
      |     |             |    +------|  7 Vcc    GND 22 |--------------------+
13
  +5V | o---+             |    +------|  8 GND        21 |               |    |
14
      |                   |    |      |  9       AVcc 20 |---------------+    |
15
      |                   |    |      | 10        sck 19 |-----------+        |
16
  GND | o---+            ---  ---     | 11       miso 18 |--------+  |        |
17
      |     |                         | 12       mosi 17 |-----+  |  |       ---
18
      |     |                         | 13            16 |     |  |  |
19
      |     |                         | 14        PB1 15 |---- |- |- | ------+
20
      |    ---                        +------------------+     |  |  |       |
21
      |                                                        |  |  |       --
22
      |                                              ------    |  |  |       \/ LED
23
  D11 | o-------------------------------------------|  56  |-- +  |  |       --
24
      |                                              ------       |  |       |
25
      |                                              ------       |  |       |
26
  D12 | o-------------------------------------------|  56  |------+  |      +-+
27
      |                                              ------          |      | | 470
28
      |                                              ------          |      | |
29
  D13 | o-------------------------------------------|  56  |---------+      +-+
30
      |                                              ------                  |
31
      |                                                                      |
32
                                                                            ---

Eine Leuchtdiode ist an PB1 angeschlossen (weil die Blinkprogramme in 
Assembler und C diesen Anschluss ansprechen)

Programmierung
------------------------------------------------

Schau dir die Makefiles für C und für Assembler genau an. Sie sind gut 
dokumentiert und du solltest in der Lage sein, diese Makefiles deinen 
eigenen Bedürfnissen anzupassen, kopiere sie dir in ein Verzeichnis, in 
dem du dein Programmierprojekt starten möchtest.

Den Makefiles gemeinsam für C und Assembler ist ihr Aufruf:

make        .... erstellt die von dir gewünschte Hex-Datei
make flash  .... flasht den ATmega8 über den Arduino als Programmer
make clean  .... bereinigt erstellte Temporärdateien

zusätzliche Option bei dem Makefile für das C Blinky:

make clk8mhz

Es stellt die Fuses für einen ATMega8 so ein, dass er mit einem internen 
Takt von 8MHz arbeitet (und nicht wie im Auslieferungszustand mit 1MHz).

---------------------------------------------------

Viel Erfolg

von Stefan F. (Gast)


Lesenswert?

Das ist ja mal eine sper detaillierte Hilfe.

Ersetze 100µF durch 100nF, dann bin auch ich damit zufrieden.

Der 100µF Elko hat eine zu hohe Induktivität, um als Abblockkondensator 
nützlich zu sein.

von Cornelia (Gast)


Lesenswert?

Hallo Ralph,

vielen Dank für die schnelle und vor allem ausführliche Antwort.
Leider fehlen mir die passenden Widerstände, so dass ich erst in ein 
paar Tagen (sobald Bestellung geliefert wird) ausprobieren kann, ob 
alles funktioniert. Derweil schaue ich mir alles schon mal an.

Zum usbasp: ich habe nur einen China-Klon 
(https://www.amazon.de/gp/product/B016IGI22W/ref=oh_aui_detailpage_o03_s00?ie=UTF8&psc=1) 
und bekam nur Fehlermeldungen, er wurde nicht erkannt und es gab 
Warnings bzgl. Frequenz. Googeln führte mich immer zu dem Hinweis, die 
Firmware zu updaten. Dafür allerdings muss man (nach allem was ich 
gefunden habe) einen Jumper 2 setzen. Diesen Jumper wiederum kann ich 
nicht finden auf dem Programmer.
Es kann gut sein, dass ich zu dämlich bin - wie gesagt, ich bin neu auf 
dem Gebiet. Aber zwei mit "2" gekennzeichnete Löcher sehe ich nicht.

Daher der Gedanke mit dem Arduino, den ich eh schon habe...

Besten Dank noch mal, ich melde mich dann wenn ich den Aufbau testen 
konnte.
Cornelia

von Ralph S. (jjflash)


Angehängte Dateien:

Lesenswert?

Ach herjeh, schade dass so gar kein "Hühnerfutter" in Elektronik hast 
(Kondensatoren, Widerstände, LEDs, Transistoren etc.)

So ein bischen etwas zum Basteln brauch man schon.

Du kannst versuchsweise die Widerstände auch überbrücken, sie sind dafür 
da, dass der Programmer auch zuverlässig ist. Normalerweise (ich habs 
gerade bei meinem Versuchsaufbau ausprobiert) gehts auch ohne 
(allerdings kann es da dann vorkommen, dass ein Flashversuch auch einmal 
fehl schlägt).

Cornelia schrieb:
> Zum usbasp: ich habe nur einen China-Klon
> 
(https://www.amazon.de/gp/product/B016IGI22W/ref=oh_aui_detailpage_o03_s00?ie=UTF8&psc=1)
> und bekam nur Fehlermeldungen, er wurde nicht erkannt und es gab
> Warnings bzgl. Frequenz

Dieses Platinenlayout kannte ich noch nicht, wie es ausschaut haben die 
Chinesen ein neues Layout bei dem sie noch weniger Platinenmaterial 
benötigen und auch keine Jumper setzen. Billiger gehts nun in der 
Herstellung wohl nicht mehr.

Die "alten" Layouts der Chinesen sahen aus wie im Bild (vllt. solltest 
du dir aus EBAY so einen bestellen - und sechs Wochen warten - ).

http://www.ebay.de/itm/USB-asp-USBISP-3-3V-5V-AVR-Programmierer-USB-ATMEGA8-Heis-Neue-Ankunft-Verkauf-/381737833622?hash=item58e1591496:g:~eUAAMXQEgpTGBxO

Verrückt wie billig die Dinger noch werden, irgendwann bekommt man Geld, 
wenn man einen nimmt !!!!

Mit Verweis auf Jörg Wunsch (der hier Moderator ist und Hauptauthor von 
AVRDUDE) hier dann auch der Hinweis, dass die Option -B 10 keinen 
Einfluss auf die Taktfrequenz bei der alten Firmware nimmt, weil diese 
(Firmware) eben den Wert nicht entgegen nimmt.

von Cornelia (Gast)


Lesenswert?

Ralph S. schrieb:
> So ein bischen etwas zum Basteln brauch man schon.

Bin ja dabei...

Ralph S. schrieb:
> Die "alten" Layouts der Chinesen sahen aus wie im Bild (vllt. solltest
> du dir aus EBAY so einen bestellen - und sechs Wochen warten - ).

OK, ist auf meiner Weihnachtswunschliste :-)

Also, hab jetzt 10 Ohm Widerstände verwendet und bekomme (mehrfach) den 
Fehler
1
avrdude -c stk500v2 -p m8 -b 115200 -P /dev/ttyACM0 -V -U flash:w:blink_atm8.hex
2
avrdude: stk500v2_ReceiveMessage(): timeout
3
4
avrdude: stk500v2_command(): command failed
5
avrdude: initialization failed, rc=-1
6
         Double check connections and try again, or use -F to override
7
         this check.

-> werd ich mir morgen ansehen müssen, im Moment finde ich keinen Fehler 
in der Verkabelung, bis auf die falschen Widerstände.
Das Flashen des STK500 auf den Arduino hatte übrigens einwandfrei 
funktioniert.

Nochmal Danke
Cornelia

von Ralph S. (jjflash)


Lesenswert?

Da ich mal annehme, dass du das mehrfach versucht hast und das mit 10 
Ohm, nicht Kilo-Ohm, Widerständen (nicht lachen, wenn ich meinen 
Lehrlingen Pläne zum Aufbau gebe ist auch immer wieder ein Fehler, dass 
sie der Gewohnheit wegen permanent Kiloohmwiderstände verbauen) 
wenigstens sehr oft funktionieren müsste deshalb das hier:

Bist du dir sicher, dass:

- die Verbindungen wirklich korrekt sind?
- Betriebsspannungen verbunden sind (auch die zu AVcc und dem dortigen 
Ground)
- der ATMega wirklich neu ist und nicht auf enen externen Quarz gefust 
wurde (oder gar das SPI abgeschaltet) ?

von Cornelia (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

inzwischen sind die richtigen Widerstände angekommen und ich habe sie 
eingebaut.

Ralph S. schrieb:
> - die Verbindungen wirklich korrekt sind?
Habs mehrfach überprüft und kann keinen Fehler finden.

> - Betriebsspannungen verbunden sind (auch die zu AVcc und dem dortigen
> Ground)
Ja

> - der ATMega wirklich neu ist und nicht auf enen externen Quarz gefust
> wurde (oder gar das SPI abgeschaltet) ?
Hab ihn zwischendurch durch einen neu gekauften getauscht, das 
funktioniert genau so wenig.

Sind für den Kondensator die 100 mikro- oder nano-Farad richtig?
Hab schon beides probiert, ohne Erfolg.

Hab an den avrdude -vvv angehangen und er scheint der Meinung zu sein 
dass mein Arduino noch ein AVRISP ist - oder was heißt "programmer 
model"?
1
avrdude -c stk500v2 -p m8 -b 115200 -P /dev/ttyACM0 -V -U flash:w:blink_atm8.hex -vvv
2
3
[...]
4
5
         Using Port                    : /dev/ttyACM0
6
         Using Programmer              : stk500v2
7
         Overriding Baud Rate          : 115200
8
avrdude: ser_recv(): programmer is not responding
9
avrdude: stk500v2_ReceiveMessage(): timeout
10
avrdude: stk500v2_getsync(): found AVRISP programmer
11
         AVR Part                      : ATmega8
12
         Chip Erase delay              : 10000 us
13
         PAGEL                         : PD7
14
         BS2                           : PC2
15
         RESET disposition             : dedicated
16
         RETRY pulse                   : SCK
17
         serial program mode           : yes
18
         parallel program mode         : yes
19
         Timeout                       : 200
20
         StabDelay                     : 100
21
         CmdexeDelay                   : 25
22
         SyncLoops                     : 32
23
         ByteDelay                     : 0
24
         PollIndex                     : 3
25
         PollValue                     : 0x53
26
         Memory Detail                 :
27
  
28
[...]
29
30
         Programmer Type : STK500V2
31
         Description     : Atmel STK500 Version 2.x firmware
32
         Programmer Model: AVRISP
33
         Hardware Version: 2
34
         Firmware Version Master : 2.10
35
         Vtarget         : 5.0 V
36
         SCK period      : 0.1 us
37
38
avrdude: stk500v2_command(): command failed
39
avrdude: initialization failed, rc=-1
40
         Double check connections and try again, or use -F to override
41
         this check.
42
43
44
avrdude done.  Thank you.

von Ralph S. (jjflash)


Lesenswert?

Hm, ich habs gerade auch ausprobiert und den ATMega auf 1 MHz internen 
Takt gestellt und siehe da:

Ich hatte auch einen Fehler !

Stell mal den Takt des STK500 nach unten mit der Option -B

avrdude -c stk500v2 -p m8 -b 115200 -P /dev/ttyACM0 -B 10

Seh hin, ob sich der ATmega dann meldet! (Ein Programmiervorgang wird 
dann länger dauern weil der ISP-Takt dadurch reduziert wird).

In der Zipdatei im Ordner: blinky

hab ich das Makefile so geschrieben gehabt, dass hier die Fuses des 
Controllers auf 8 MHz interner Takt eingestellt werden kann:

make clk8mhz

Wenn du dort den Aufruf verfolgst wirst du feststellen, dass dort auch 
ein Aufruf mit -B 20 erfolgt ... um eben einen fabrikneuen ATmega auf 
schnelleren Takt einstellen zu können.

Alternativ kannst du auch ohne Makefile folgendes eingeben:

avrdude -c stk500v2 -p m8 -b 115200 -P /dev/ttyACM0 -B 20 -U 
lfuse:w:0xD4:m -U hfuse:w:0xD9:m

ACHTUNG: bei den Angaben lfuse D4 und hfuse D9 aufpassen, falsche Werte 
können dich vom Controller aussperren.

von Ralph S. (jjflash)


Lesenswert?

Ich hab jetzt auch die beiden Bilder noch einmal angesehen, leider kann 
ich nicht sehen in welchen Pins die Kabel am Arduino stecken, ich gehe 
aber mal davon aus, dass du das schon 1000 mal kontrolliert hast.

Versuche mal wirklich die Option -B 20 bei Avrdude ... oder versuche das 
Makefile des Ordners Blinky um den internen Takt auf 8 MHz zu stellen.

von Stefan F. (Gast)


Lesenswert?

> ser_recv(): programmer is not responding

Das finde ich sehr verdächtig. Offensichtlich ist die Kommunikation 
zwischen PC und Programmer gestört. Das ist übrigend ein häufiges 
Fehlerbild bei USBASP basierten Programmern. Versuche mal einen anderen 
USB port.

von Cornelia (Gast)


Lesenswert?

JIPPIEH, mein Lämpchen blinkt!!

Letztlich war es eine Kombination aus den letzten 3 Beiträgen - erst als 
ich dem USB-Port gewechselt hatte, funktionierte die Takt-Änderung und 
dann auch "make flash" im Assembler-Verzeichnis.

Vielen vielen Dank noch mal, besonders an Ralph.
Ohne die Hilfe wäre mein Einstieg in die Mikrocontroller-Welt um Einiges 
frustrierender, wenn nicht gar unmöglich gewesen.

Ich hoffe, dass ich nun das Assembler-Tutorial (als Einstieg) meistern 
werde - auch um mir das Wissen anzueignen, was ich schon für diese 1. 
kleine Programmierung benötigt hätte.

An dieser Stelle möchte ich die gesamte Webseite loben: 
vielversprechende Tutorials, kompetente Hilfe und wichtige 
Hintergrundinformationen (z.B. zu Kondensatoren, LEDs ...)!

Viele Grüße aus dem Allgäu
Cornelia

von Ralph S. (jjflash)


Lesenswert?

Freut mich sehr dass das jetzt funktioniert hat.

Wenn du den Controller im Takt umgestellt hast, könnte es natürlich auch 
sein (oder eher wahrscheinlich), dass dein USB (mit der älteren Firmware 
die den Takt nicht einstellen kann) mit deinem ATMega jetzt (da intern 8 
MHz anstelle von 1Mhz) kommunizieren kann und du es einfacher hast, 
deinen Controller zu flashen.

Viel Spaß beim Experimentieren !

von Ralph S. (jjflash)


Lesenswert?

Ach so, ja (weil das auch schon mal jemand gemacht hat):

Die Werte der Fuses sind einzig und AUSSCHLIESSLICH für einen ATMega8 
gültig. Auf keinen Fall sollte versucht werden diese Fuses auf einen 
anderen Controller (bspw. einen ATMega328p) zu übertragen. Hier könnte 
es dann vorkommen dass die Fuses so unglücklich gesetzt sind, dass man 
sich aus dem Controller ausgesperrt hat !

von Cornelia (Gast)


Lesenswert?

Ralph S. schrieb:
> Wenn du den Controller im Takt umgestellt hast, könnte es natürlich auch
> sein (oder eher wahrscheinlich), dass dein USB mit deinem ATMega jetzt (da > 
intern 8 > MHz anstelle von 1Mhz) kommunizieren kann und du es einfacher
> hast, deinen Controller zu flashen.

Ja, hab schon etwas mit den Programmen leds.asm und leds+buttons.asm aus 
dem Tutorial 
https://www.mikrocontroller.net/articles/AVR-Tutorial:_IO-Grundlagen 
experimentiert - klappt einwandfrei :-)

von Ralph S. (jjflash)


Lesenswert?

Lachen muß (über mich selbst): USBasp meinte ich (und nicht USB) ... 
wahrscheinlich funktioniert der jetzt auch:

avrdude -c usbasp -p m8

das ... müßte reichen damit eine Meldung ausgespuckt wird !

von Cornelia (Gast)


Lesenswert?

Jo, funktioniert, auch das flashen des Atmega8 mit den Programmen :-)

Allerdings mit dieser Warnung
1
 avrdude: warning: cannot set sck period. please check for usbasp firmware update
 die ich mangels Jumper-Option nicht wegbekomme.
Damit kann ich aber leben.

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.