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:
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
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.
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
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.
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
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.
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
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
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) ?
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"?
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.
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.
> 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.
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
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 !
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 !
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 :-)
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 !