ATTiny mit Linux programmieren - Einsteigerhilfe gesucht

#7745264
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.

Angehängte Dateien:
#7745267
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.

#7745269
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.

#7745272
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.

#7745275
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?

#7745278
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.

#7745293
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)

#7745317
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.

Angehängte Dateien:
Gast #7745318
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

#7745652
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.

#7745658
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?

#7745673
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?

Angehängte Dateien:
#7745740
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?

#7745748
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 :-)

#7745801
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
Angehängte Dateien:
#7746081
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)

#7746132
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren