Forum: Mikrocontroller und Digitale Elektronik ATTiny mit Linux programmieren - Einsteigerhilfe gesucht


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Paul S. (wattfummler)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich möchte eine kleine Steuerung implementieren und habe mir dafür einen 
ATTiny 13a ausgesucht.
Den Chip und einen usbasb-clone Programmieradapter 
(https://www.ebay.de/itm/235678726686?var=535986828201) habe ich hier , 
aber ich scheitere an der Software zum Brennen. Die meisten Tutorials 
beziehen sich auf den Arduino, habe ich aber nicht.

Was ich habe ist die Arduino IDE mit den ATTinyCore Boiards. Da ist der 
13a aber leider unbekannt.
Dann habe ich noch VisualStudio Code, weiß aber nicht, welche 
Extra-Pakete ich da bräuchte. Könnte man man damit auch brennen?
Dann habe ich auch noch unter Windows das Microchip AVR-Studio 
installiert. Das erkennt allerdings keinen Chip.

Dann gibt's ja auch noch die Komandozeilenprogramme unter Linux, aber 
alles in Allem überfordet mich das ein bisschen. So viele 
Dokumentationen und so wenig Ahnung :-(
Eigentlich wollte ich ja nur schnell 50 Zeilen Code da reinbringen.

Kann mir jemand ein funktionierendes Setting empfehlen, das auch ein 
alter Mann noch versteht?

Vielen Dank schon mal

Nachtrag:
  avrdude -p t13 -c usbasp
findet leider kein Target.
"avrdude: error: program enable: target doesn't answer. 1
avrdude: initialization failed, rc=-1
         Double check connections and try again, or use -F to override
         this check."

Die Verkabelung ist ja eigentlich ziemlich eindeutig. Kann man da 
irgendwie mehr testen? Ein Oszillograph ist verfügbar.

: Bearbeitet durch User
von Johannes Fe (jofe)


Lesenswert?

Hallo,

Paul S. schrieb:
> Die Verkabelung ist ja eigentlich ziemlich eindeutig

Naja, man muss sich schon etwas Mühe geben, um anhand des Fotos zu 
beurteilen, mit welcher Wahrscheinlichkeit die Verdrahtung korrekt ist.

Ich sehe auf dem Foto auch keinen Abblockkondensator (100 nF Keramik) an 
der Versorgungsspannung des Mikrocontrollers.

Paul S. schrieb:
> avrdude -p t13 -c usbasp

Ich vermute, es wäre besser, noch den verwendeten seriellen Port 
anzugeben.

von Paul S. (wattfummler)


Lesenswert?

Die Verkabelung habe ich noch win weiteres mal nach dieser Vorlage 
kontrolliert
https://www.blikk.it/forum/blog.php?bn=neuemedien_fb&id=1646239783
Ich gehe davon aus, dass MISO mit MISO verbunden wird und MOSI mit MOSI 
!?

Kondensator ist jetzt gesteckt (direkt am IC zwischen Plus und Masse).

Der Adapter hängt an USB und hat keine Adresse (wie z.B. /dev/USBSer1). 
Allerdings blinkt eine LED auf dem Adapter. Wenn ich den abstecke kommt 
das Programm mit einem "could not find USB device" zurück. Bis zum 
Adapter läuft wohl alles gut.

von Max D. (max_d)


Lesenswert?

Für mich sieht JP1 aus als wurde er auswählen ob der usbasp 3.3 oder 5V 
ausgeben soll. Kriegt der tiny (so ganz ohne jumper) überhaupt strom?

von Martin (martin_l72)


Lesenswert?

Das Problem hatte ich auch mal.Probiere mal den Befehl -B 100 
dazuzuschreiben.

von Johannes Fe (jofe)


Lesenswert?

Paul S. schrieb:
> Ich gehe davon aus, dass MISO mit MISO verbunden wird und MOSI mit MOSI
> !?

Ja, so sollte es sein.

Paul S. schrieb:
> Der Adapter hängt an USB und hat keine Adresse (wie z.B. /dev/USBSer1).

OK, das wird wohl so stimmen (ich kannte diesen USBasp noch nicht und 
hatte irrtümlich vermutet, dass er via serieller Schnittstelle a.k.a. 
COM-Port angesprochen wird).

Max D. schrieb:
> Für mich sieht JP1 aus als wurde er auswählen ob der usbasp 3.3 oder 5V
> ausgeben soll. Kriegt der tiny (so ganz ohne jumper) überhaupt strom?

Guter Punkt. Also bitte mal die Versorgungsspannung des ATtinys 
nachmessen und ggf. eine 3-polige Pfostenleiste in JP1 einlöten und 
passend mit Jumper versehen.

von Paul S. (wattfummler)


Lesenswert?

Wenn der Programmer arbeitet stehen da ganz kurz mal um die 3V an.
Wenn ich einen Jumper setze hat der Chip die ganze Zeit Strom. Gut zu 
wissen.
Leider wird der Chip aber so wie so nicht gefunden; Auch ein -B 100 hat 
nichts geholfen.
Ich habe leider keinen zweiten Chip zum Testen. Vielleicht ist der ja 
einfach kaputt?

: Bearbeitet durch User
von Paul S. (wattfummler)


Lesenswert?

Nun läuft's. Ich verstehe nicht ganz, warum.
Nach einigen weiteren Versuchen und Messungen geht es nun (vielleicht 
irgendwo ein Wackelkontakt?).

Auch ganz ohne Jumper wird jetzt ein Device erkannt, allerdings mit 
einer ungültigen Signatur (0x000000)

Auf 3V oder 5V gejumpert funktioniert es aber nun.

Der Parameter -B 100 ist aber tatsächlich nötig.


Jetzt wäre meine nächste Frage: Mit welcher IDE schreibe ich am Besten 
das Programm?

von Martin (martin_l72)


Lesenswert?

Super das es Funktioniert.Nur nicht aufgeben.IDE ist Geschmackssache die 
von Arduino, Visual Studio usw. Ich verwende Visualmicro unter Visual 
Studio 2022 Community Edition.
PS: mit den 100 von -B kannst ruhig runtergehen, mußt probieren bis zu 
welchem wert es noch funktioniert. Weil wenn zu hoch dauert es bei 
größeren Codes ewig bis er das auf dem Mikrocontroller drauf geladen 
hat.

von Christoph M. (mchris)


Lesenswert?

Der Attiny13 ist zu klein für das Arduino Framework, den kann man nur 
"Bare Metal" programmieren. Ein Attiny85 würde gehen.

von Veit D. (devil-elec)


Lesenswert?

Hallo,

wenn der Anfang leicht sein soll, dann Arduino IDE + 
https://github.com/MCUdude/MicroCore. Ansonsten wird das drum herum bis 
man loslegen kann etwas umständlicher. Wenn du wenig programmierst, 
denke ich die Arduino IDE reicht dir vollkommen aus.

von Veit D. (devil-elec)


Lesenswert?

Christoph M. schrieb:
> Der Attiny13 ist zu klein für das
> Arduino Framework.

Nein.

von Sebastian R. (sebastian_r569)


Lesenswert?

Christoph M. schrieb:
> Der Attiny13 ist zu klein für das Arduino Framework, den kann man nur
> "Bare Metal" programmieren. Ein Attiny85 würde gehen.

Es gibt sogar für den Tiny4/5 das Framework. "Luxusfunktionen" wie 
millis() hat man damit nicht mehr, aber man kann die mit Arduino 
programmieren. Meist muss man dann aber doch "auf Fußpilzebene" in den 
Registern für Timer etc. arbeiten, aber das ist vollkommen okay.

Wichtig ist immer ein niedriger Takt beim ersten Programmieren.Das 
CKDIV-Fusebit ist gesetzt, damit darf der ISP-Takt max. 125kHz betragen 
(ein Achtel von einem Achtel von 8MHz)

von Christoph M. (mchris)


Lesenswert?

Christoph M. schrieb:
>> Der Attiny13 ist zu klein für das
>> Arduino Framework.

Veit D. (devil-elec)
01.10.2024 06:29
>Nein.

Das sieht aber definitiv nicht nach Arduino-Framework aus, sondern nach 
"Bare Metall":

https://github.com/MCUdude/MicroCore/blob/master/avr/libraries/AVR_examples/examples/Blink/Blink.ino

von Ralph S. (jjflash)


Angehängte Dateien:

Lesenswert?

Paul S. schrieb:
> Der Parameter -B 100 ist aber tatsächlich nötig.

-B 20 hätte wohl auch gereicht.

Dieser Parameter reduziert den Takt, mit dem der ATtiny programmiert 
wird. Da der Tiny wohl fabrikneu ist (noch ungefused) steht der per 
default bei 1,2 MHz internem Takt ("int. RC OSC 9.6 MHz" und "Divide 
clock by 8 internally)

Siehe auch:

https://www.engbedded.com/fusecalc/

avrdude -c usbasp -p t13 -B 20 -U lfuse:w:0x7A:m -U hfuse:w:0xff:m

fused den Tiny und deaktiviert die interne Taktteilung, so daß der Chip 
fortan mit 9,6 MHZ läuft. Danach ist -B 20 nicht mehr notwendig.

Paul S. schrieb:
> Jetzt wäre meine nächste Frage: Mit welcher IDE schreibe ich am Besten
> das Programm?

Wieso muß es eine IDE sein und nicht ganz klassisch mittels einem 
Makefile (gerade bei einem ATtiny13)?

Im Anhang habe ich dir ein Demo-Blinkprogramm zusammen gestellt, mittels 
dem du einfach auf der Konsole ein

make

aufrufst und das Blinkprogramm wird kompiliert.

Dann brauchst du nur noch einen Texteditor deiner Wahl und du kannst 
loslegen. Für meine Zwecke programmiere ich mit dem Programm Geany (weil 
schlank und schnell) und meinem eigenen Konsoleneditor.

Entpacke den Anhang in ein Verzeichnis deiner Wahl und wechsle in der 
Konsole in dieses Verzeichnis.

Mache das Programm cide mittels

chmod +x cide

lauffähig und starte dieses mit:

./cide

Hier kannst du bspw. das Blink-Programm laden und entweder mit den 
Menüflachen oder mit F9 kompileren und mit F8 flashen.

Möchtest du mit Geany programmieren, empfiehlt es sich Geany für den 
Erstellenvorgang (build) zu konfigueren. Hierfür gehst du auf den 
Menüpunkt:

- Erstellen
    |
    Kommandos zum Erstellen konfigurieren

Dort nimmst du die Einstellungen wie im Bildschirmfoto vor und du kannst 
auch von hier aus loslegen

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

Zum Makefile im Archiv:

Das Makefile ist so gehalten, dass im Kopf alle Angaben gemacht werden 
können, die zum Kompilieren und Flashen notwendig sind. Der Kommentar im 
Makefile beschreibt die Benutzung.

Hier machst du nur noch Angaben zum verwendeten

- AVR-Controller (in deinem Falle ATtiny13)
- der Frequenz mit der er betrieben wird
- evtl. Bibliotheken die du einbinden möchtest (in deinem Fall erst 
einmal keine)
- den zu verwendenden Programmer

Alle anderen Angaben nach
1
###############################################################################
2
#
3
# funktionaler Teil des Makefiles, Aenderungen nur mit Bedacht vornehmen
4
#
5
###############################################################################

solltest du so lassen wie es ist. Hiermit bist du dann in der Lage, dein 
Programm mittels CIDE, GEANY oder per Texteingabe auf der Konsole zu 
generieren.

Eingabe auf der Konsole:

[code]
make
  erstellt eine Binärdateu
make all
  dto.
make size
  zeigt den Flashspeicherbedarf des Programms an
make clean
  löscht alle erzeugten Kompilate (nicht das Quellprogramm)
make fuses
  fused den ATtiny13 für einen 9,6 MHz Takt intern


[/code

Hinweis: Die verwendete Includedatei avr_gpio.h macht den Umgang mit den 
Anschlusspins leichter. Eine "Bitverschiebeakrobatik" im Main-Programm 
ist hier dann nicht mehr notwendig und macht ein Programm lesbarer.

von Monk (roehrmond)


Lesenswert?

Christoph M. schrieb:
> Das sieht aber definitiv nicht nach Arduino-Framework aus, sondern nach
> "Bare Metall"

Eben. Dazu sagt die Doku von ATTinyCore:

"ATtiny13/13A are supported by MicroCore by @MCUdude - 2k of flash is 
the lower cutoff for ATTinyCore."
https://github.com/SpenceKonde/ATTinyCore

Link zum Microcore
https://github.com/MCUdude/MicroCore

Ich würde allerdings auch lieber auf den ATtiny45 oder 85 wechseln, denn 
dann kann man den "normalen" und viel weiter verbreiteten ATTinyCore 
verwenden. Man muss sich ja nicht unnötig Probleme schaffen.

Für die Bare-Metal Programmierung des ATtiny13 hatte ich mal ein Buch 
geschrieben:
http://stefanfrings.de/mikrocontroller_buch/index.html

von Ralph S. (jjflash)


Angehängte Dateien:

Lesenswert?

... ach herjeh, vor lauter Bilder hochladen habe ich das Wichtigste 
vergessen: das Archiv.

Wird hiermit nachgereicht !

von Veit D. (devil-elec)


Lesenswert?

Hallo,

Leute, jetzt seid nicht so klein kariert. Das Arduino Framework wird 
auch vom MCUdude MicroCore für den ATtiny13 verwendet. Bspw. für Serial. 
Die wenigen Pins sollte man natürlich Bare Metall abfrühstücken. Dafür 
dient sein Bsp. wie man das macht.

von Paul S. (wattfummler)


Lesenswert?

Martin schrieb:
> IDE ist Geschmackssache die von Arduino, Visual Studio usw. Ich verwende 
Visualmicro unter Visual

OK, werde ich mal testen.

> PS: mit den 100 von -B kannst ruhig runtergehen, mußt probieren bis zu
> welchem wert es noch funktioniert. Weil wenn zu hoch dauert es bei
> größeren Codes ewig bis er das auf dem Mikrocontroller drauf geladen
> hat.
Ja, das habe ich  schon bemerkt. Aber mein Programm wird wahrscheinlich 
wirklich nicht viel mehr als 50 Zeilen haben.

von Paul S. (wattfummler)


Lesenswert?

Veit D. schrieb:
> Hallo,
>
> wenn der Anfang leicht sein soll, dann Arduino IDE +
> https://github.com/MCUdude/MicroCore.

Cool, das habe ich vermisst. Ich hatte ein anderes ATTiny Paket 
installiert, aber da war der 13a nicht dabei. Vielen Dank.

Ist jetzt installiert, funktioniert aber nur teilweise.
Wenn ich ein kleines Testscript schreibe wird das anstandslos übersetzt, 
aber danach kommst die Meldung: "Requested 'upload' (sic!) fehlt", ohne 
weitere Infos.
Kann ich die erzeugte Datei auch mit avrdude flashen? Und wenn ja, 
welche wäre das dann?

von Monk (roehrmond)


Lesenswert?

Paul S. schrieb:
> Kann ich die erzeugte Datei auch mit avrdude flashen?

Die Arduino IDE benutzt bereits avrdude.

von Veit D. (devil-elec)


Angehängte Dateien:

Lesenswert?

Hallo,

alle kompilierten Dateien landen in einem Temp Ordner unter Windows. Das 
sollte unter Linux genauso sein. Der Pfad steht im Ausgabefenster ganz 
unten und nach rechts scrollen. In den IDE Einstellungen alle Ausgaben 
einschalten.

Hast du zum flashen in der IDE den Programmer ausgewählt? Weil 
Standardmäßig flasht die IDE über USB zum Bootloader.

Fehlermeldungen bitte als Text und komplette Ausgabe kopieren und zur 
Verfügung stellen.

Dann schauen wir mal wer wie weiterhelfen kann.

Noch ein Schuss ins Blaue. Die User Rechte für die USB Schnittstelle 
hast du? Oder erscheint dafür keine Linux Fehlermeldung?

: Bearbeitet durch User
von Paul S. (wattfummler)


Lesenswert?

Oh, wo muss/kann ich das einstellen? Wenn ich einfach "upload" sage 
bekomme ich einen Fehler "Requestet upload failed".
Ich finde nichts.

Manuall flashen mit avrdude hat funktioniert (die .hex-Datei im 
Temp-Ordner), ist aber natürlich mühsam.

: Bearbeitet durch User
von Monk (roehrmond)


Lesenswert?

Stelle im Menü deinen ISP Programmer ein und flashe damit den bootloader 
neu. Auch dafür gibt es einen Menüpunkt.

von Paul S. (wattfummler)


Lesenswert?

Sorry, das war falscher Alarm.


Flashen direkt aus der Arduino-IDE funktioniert jetzt auch. Ich hatte 
die Einstellungen an der falschen Stelle gesucht.


Welche Möglichkeiten gibt es eigentlich zum Debugging?

von Monk (roehrmond)


Lesenswert?

Paul S. schrieb:
> Welche Möglichkeiten gibt es eigentlich zum Debugging?

Keine, es sei denn du meinst blinkende LEDs und serielle Ausgaben.

: Bearbeitet durch User
von Georg M. (g_m)


Lesenswert?


von Veit D. (devil-elec)


Lesenswert?

Hallo,

gut das erstmal alles funktioniert. Debugging ist so eine Sache. Dafür 
benötigt es einen teureren Programmer bspw. Atmel ICE. Und dann wäre 
noch eine andere IDE von Nöten um Breakpoints zu setzen. Aber, wenn man 
Minimalismus gewohnt ist, kommt man mit gut platzierten seriellen 
Ausgaben und ggf. einen Logic Analyzer schon sehr weit. Hat auch den 
Vorteil, dass das Programm nicht am Breakpoint angehalten wird. Man 
schaut sozusagen live zu. Ob du mit dem ATtiny13A noch Platz für den 
Code von "Serial" hast, musste schauen. Ansonsten freie Pins schalten 
und mit Analyzer schauen, wo wann welche Codezeile ausgeführt wird oder 
auch nicht.

Oder wie Georg eingeworfen hat, die AVR Serie wechseln. Ist ein kleiner 
Umstieg, aber UPDI ist die neue Schnittstelle bei AVR. Die verlinkten 
Boards von Georg kann man als Programmer/Debugger verwenden. Hatte ich 
gar nicht mehr auf dem Schirm. ;-) Da ist alles dran und drauf was man 
benötigt. Damit kennt sich Georg aus. Eine andere IDE wie die Arduino 
IDE benötigt man dennoch?

: Bearbeitet durch User
von Paul S. (wattfummler)


Lesenswert?

OK, auf das Debugging verzichte ich wohl erstmal :-)

Technisch scheint dann alles soweit geklärt.
Woran ich jetzt knabbere:
Wie sind eigentlich die Pinbezeichnungen?

wenn ich Pin2 auf High schalten will muss ich
digitalWrite(3, HIGH)
schreiben.
Pin3 ist dann 4

In den Scripten, die ich so sehe sehe ich aber immer

DDRB |= (1<<PB0);          //Datenausgangsregister setzen
PORTB |= _BV(PB1);         //internen Pull-Up-Widerstand an PB1 
einschalten
PCMSK |= (1<<PINB1);       //PCMSK – Pin Change Mask Register
GIMSK  |= (1<<INT0);       //External Interrupt Request 0 Enable
MCUCR |=(0<<ISC01) | (0<<ISC00);

Gibt es irgendwo eine Liste der diversen Bezeichnungen?
Nachtrag: Hab's gerade gefunden!

Ansonsten möchte ich mich hier schon mal für die rege und konstruktive 
Hilfe bedanken. Schön, dass doch noch nicht alle nur noch vor TikTok 
sitzen :-)

: Bearbeitet durch User
von Ralph S. (jjflash)


Angehängte Dateien:

Lesenswert?

Paul S. schrieb:
> In den Scripten, die ich so sehe sehe ich aber immer
>
> DDRB |= (1<<PB0);          //Datenausgangsregister setzen

> PORTB |= _BV(PB1);         //internen Pull-Up-Widerstand an PB1 einschalten

> PCMSK |= (1<<PINB1);       //PCMSK – Pin Change Mask Register

> GIMSK  |= (1<<INT0);       //External Interrupt Request 0 Enable

> MCUCR |=(0<<ISC01) | (0<<ISC00);

Das hier ist "Bare Metall" und sicherlich kein Beispiel für Arduino 
gewesen.

Paul S. schrieb:
> wenn ich Pin2 auf High schalten will muss ich
> digitalWrite(3, HIGH)
> schreiben.
> Pin3 ist dann 4

Du meinst hier wohl den Pin2 des Chips?!?
PB0 oder auch PB1 ist die Funktion des Anschlusspins des Chips und hat 
mit der Pinnummerierung des Bausteins nichts zu tun!

Pinbelegung des Chips siehe Bild im Anhang.

Arduino macht seine eigene Zuordnung zu den Pins, wodurch es in Arduino 
möglich ist, Boards mit unterschiedlichen Controllern immer gleich 
anzusprechen (ob einem das gefällt sei dahin gestellt).

Im Falle des ATtiny13 ist die Zuordnung:
1
Chip-Pinnummer   Bezeichnung   Arduino-Boardnummer
2
--------------------------------------------------
3
    1                PB5 *          5 auch A0
4
    2                PB3            3 auch A3
5
    3                PB4            4 auch A2
6
    4                GND
7
8
    5                PB0            0
9
    6                PB1            1
10
    7                PB2            2 auch A1
11
    8                Vcc
12
13
* Anschluss sollte nicht verwendet werden, da dieser auch der Resetpin ist. Wird ein ATtiny13 so geflasht, dass dieser Pin als GPIO verwendet wird, ist nach dem Flashen der Chip nicht mehr mittels ISP (bspw. über UŚBasp) flashbar

von Georg M. (g_m)


Angehängte Dateien:

Lesenswert?

Veit D. schrieb:
> Eine andere IDE wie die Arduino IDE benötigt man dennoch?

Eine IDE benötigt man so oder so.

von Norbert (der_norbert)


Lesenswert?

Georg M. schrieb:
> Eine IDE benötigt man so oder so.

Ich lerne hier jeden Tag neue Dinge.

Aus gewöhnlich gut unterrichteten Kreisen sickerte neulich
noch folgende Information durch:
Es gab tatsächlich ein Leben vor IDEs.

von Gerhard Z. (germel)


Lesenswert?

Es scheint ja jetzt bei dir alles zu funktionieren. Hier noch mal der 
Vollständigkeit halber der Hinweis: Wenn (unter Linux) das Paket brltty 
installiert ist (für die Braille Zeile, oft vorinstalliert) kann / wird 
es mit dem flashen über USB kollidieren. Man sollte das Paket 
deinstallieren vorausgesetzt, man benötigt keine Braille Zeile. (siehe 
z.B. hier https://github.com/arduino/help-center-content/issues/155)

von Ralph S. (jjflash)


Lesenswert?

Gerhard Z. schrieb:
> Es scheint ja jetzt bei dir alles zu funktionieren. Hier noch mal der
> Vollständigkeit halber der Hinweis: Wenn (unter Linux) das Paket brltty
> installiert ist (für die Braille Zeile, oft vorinstalliert) kann / wird
> es mit dem flashen über USB kollidieren.

Das KANN eine Rolle spielen, wenn man den Chip mittels eines seriellen 
Bootloaders (eine USB2UART-Brücke ist eine virtuelle serielle 
Schnittstelle) flasht, wie bspw. unmengen preiswerter Arduino UNO r3 
Boards.

Da der TO seinen Chip über einen USBasp flasht (weil im Tiny13 aufgrund 
des mickrigen Flashspeichers schlicht kein Platz ist) und nicht über 
eine wie geartete serielle Schnittstelle, brltty ohne Belang.

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.