ATtiny12: Assembler in Atmel Studio 7

#7818501
Lesenswert?

Hallo,

jetzt habe ich mir einen ATtiny12 bestellt und habe erst dann gemerkt, dass man den nur in Assembler programmieren kann. Weil der nur einen Taster einlesen und dann ein Signal ausgeben soll, sollte das grundsätzlich machbar sein.

Nach ersten Versuchen (Atmel Studio 7) komme ich jetzt aber nicht weiter. Ich habe folgendes Programm hier, dass erst mal nur ein paar Pins auf Output setzt und dann nichts mehr macht:

1
.device ATtiny12
2
//#include <avr/io.h>
3

4
// Interrupt-Vektoren
5
.org 0x00 
6
rjmp main
7
reti
8
reti
9
reti
10
reti
11
reti
12

13
.org 0x06 
14
main:
15
    ldi R16, 0b00011001
16
    out DDRB, R16           // Output Pins
17

18
    ldi R16, 0b00011001
19
    out PORTB, R16          // Output Pins auf High
20

21
loop:
22
    rjmp loop              // Endlosschleife

Das #include ist auskommentiert, da es beim Assemblieren sonst einen Fehler gibt (Cannot find include file). Ohne das #include läuft der Assembler durch und erzeugt auch ein List- und ein Hex-File:

1
                                 .device ATtiny12
2
                                 //#include <avr/io.h>
3
                                 
4
                                 // Interrupt-Vektoren
5
                                 .org 0x00 
6
000000 c005                      rjmp main
7
000001 9518                      reti
8
000002 9518                      reti
9
000003 9518                      reti
10
000004 9518                      reti
11
000005 9518                      reti
12
                                 
13
                                 .org 0x06 
14
                                 main:
15
000006 e109                          ldi R16, 0b00011001
16
000007 bb07                          out DDRB, R16           // Output Pins
17
                                 
18
000008 e109                          ldi R16, 0b00011001
19
000009 bb08                          out PORTB, R16          // Output Pins auf High
20
                                 
21
                                 loop:
22
00000a cfff                          rjmp loop              // Endlosschleife

Das hex-File kann ich auch ohne Fehlermeldung auf den ATtiny12 hoch laden, auch ein anschließendes Verify ist in Ordnung.

Nur macht der Controller keinen Mucks, kein Pin geht auf High, egal welchen ich zu setzen versuche.

Nun zwei Fragen:

  1. Warum akzeptiert der Assembler das #include nicht? In vielen Beispielen, die man im Internet findet ist das drin. Oder muss ich den Pfad manuell irgendwo hinzufügen?

  2. Wo liegt in meinem Programm der Fehler bzw. wie erreiche ich, dass ein Pin auf High geschaltet wird?

Würde mich freuen, wenn mir dazu jemand Hilfestellung geben könnte.

Vielen Dank schon mal!

#7818528
Lesenswert?

Danke für den Hinweis. Das habe ich jetzt auch gleich ausprobiert und diese Datei ins Projektverzeichnis kopiert und oben im Programmcode eingebunden:

1
.device ATtiny12
2
.include "tn12def.inc"

Das assembliert ohne Fehler, der in meinem ersten Beitrag zitierte Abschnitt aus dem Listfile ist aber unverändert, auch die erzeugten Hex-Codes sind gleich.

Da war dann zu erwarten, dass sich die Ports auch so nicht auf High schalten lassen, was dann durch Hochladen und Messen leider bestätigt wurde.

#7818532
Lesenswert?

Mark U. schrieb:

Nun zwei Fragen:

Warum akzeptiert der Assembler das #include nicht? In vielen Beispielen, die man im Internet findet ist das drin. Oder muss ich den Pfad manuell irgendwo hinzufügen?

Assembler ist nicht gleich Assembler...

Das #include stammt aus der avrlibc der avr-gcc-toolchain, deren Assembler avr-as heisst. Wenn du im Studio ein C-Project erstellst, in dem auch Assemblerdateien genutzt werden, wird der avr-as genutzt.

Reine Assemblerprojekte im Studio nutzen statt dessen den Atmel/Microchip-Assembler "AVR-Assembler". Der ist halt anders, und nutzt Atmel files.

Oliver

#7818569
Lesenswert?

Verstehe.

Also, das Projekt wurde in Atmel Studio 7 als Assembler Projekt angelegt. Ich habe da in der Projektverwaltung auch einen Eintrag gefunden, der einen Include-Pfad zu tn12def.inc enthält.

Das ist dann wohl auch der Grund, warum der Compiler auch ohne eine Kopie dieser Datei ins Projektverzeichnis durchläuft.

Das Projekt kompiliert ohne Fehler und Warnungen.

Es bleibt also die Frage, warum der Controller nichts macht.

Dazu habe ich auf dieser Seite hier eine Erklärung zu den Assembler-Befehlen gefunden: https://trolsoft.ru/en/avr-assembler?cmd=ldi und https://trolsoft.ru/en/avr-assembler?cmd=out

Hier nochmal die Zeilen aus dem List-File:

1
000006 e109                          ldi R16, 0b00011001
2
000007 bb07                          out DDRB, R16

Dabei fällt auf, dass mit dem Befehl /ldi/ das Register R16 mit 0x00 (4Bit) verwendet wird, mit dem Befehl /out/ jedoch mit 0x10 (5 Bit). Das wird wohl aber schon stimmen, oder?

Ich frage mich halt, ob das Register R16 entweder nicht beschrieben wird oder der Befehl out an eine falsche Adresse schreibt.

Ja, ich hatte schon versucht, den Simulator aufzurufen. Das funktioniert aber leider nicht. Für andere Controller gibt es da einen Eintrag, hier nicht. Evtl. auch, weil es ein Assembler-Projekt ist.

Und ja, ich weiß, dass der Controller abgekündigt ist und es mit einem andern kleinen Controller einfacher in C zu programmieren wäre. Aber jetzt habe ich eben diesen hier und würde mich freuen, wenn ich ihn zum Laufen bekomme.

#7818794
Lesenswert?

Hallo, Mark U. schrieb im Beitrag #7818501:

Das hex-File kann ich auch ohne Fehlermeldung auf den ATtiny12 hoch laden, auch ein anschließendes Verify ist in Ordnung.

Zeig mal wie dein Controller mit dem Programmer verbunden ist. Ich hatte hier auch mal den Fall das der Controller (ATmega 8) sich programmieren ließ, der Controller anschließend aber nicht "lief". Der Grund war banal: ich hatte die Betriebsspannung für den Controller nicht eingeschaltet.

rhf

(Firma: 1984now) #7818814
Lesenswert?

Mark U. schrieb:

1
>     ldi R16, 0b00011001
2
>

Was mag sich der Verfasser bei diesem Literal wohl gedacht haben?...

Antwort: nix. Einfach stumpf geklaut von Code für irgendwelche 8-Beiner-Tinys!

  1. Wo liegt in meinem Programm der Fehler bzw. wie erreiche ich, dass ein Pin auf High geschaltet wird?

Nun, das naheliegendste wäre wohl, den korrekten Wert dem Datenblatt zu entnehmen und dann hinzuschreiben.

Wäre in C übrigens ganz genauso nötig...

#7818924
Lesenswert?

Jetzt ein Update:

Ich habe obigen Code und die Einstellung des Atmel Studio dahingehend geändert, dass der Controller ein ATtiny13A ist. Sonst blieb alles gleich.

Auch damit assembliert der Code. Und noch besser: Der lässt sich jetzt auch simulieren. Wenn das Programm bei der Endlosschleife ankommt, sind die Ausgangspins wie erwartet gesetzt, siehe Screenshot. Das Programm funktioniert also grundsätzlich mal.

Dann habe ich die beiden List-File (also das für den ATtiny12 und das für den ATtiny13A) miteinander verglichen: Der erzeugte Code ist identisch. Auch die erzeugten Hex-Files sind gleich.

Dann habe ich aus einem alten Projekt einen ATtiny13A genommen, und den statt des ATtiny12 eingebaut und programmiert. Und siehe, der ATtiny13A läuft wie erwartet. Die Hardware sollte also nicht das Problem sein.

Zusammengefasst: Sowohl das Programm als auch meine kleine Hardware funktionierten mit dem ATtiny13A nicht aber mit dem ATtiny12.

In den Datenblättern der beiden Controller sind die Adressen für DDRB (0x17) und PORTB (0x18) identisch. Was mich jetzt aber stutzig macht ist, dass im Simulator für den ATtiny13A andere Adressen angegeben werden (rot markiert). Da ist ein Offset von 0x20. Muss ich den beim ATtiny12 irgendwie abziehen? Wie?

Weiß jemand, warum das so ist bzw. könnte das das Problem sein?

Danke und Grüße

Angehängte Dateien:
#7818945
Lesenswert?

Ja, der Reset-Pin hat einen 10k-Pullup.

Den Link bei Stackexchange habe ich mir angesehen, habe die dort erwähnte Zeile ganz oben eingefügt:

1
#define __SFR_OFFSET 0

Das macht leider keinen Unterschied. So langsam habe ich den Verdacht, mein Controller hat einen Schaden. Ich werde mir einen neuen bestellen und dann doch wieder in C programmieren.

Trotzdem vielen Dank für alle Hinweise und Tips.

(Firma: Funkenflug Industries) #7819144
Lesenswert?

Aaalso.

Normalerweise sind die AVRs extrem gut in Assembler programmierbar, die haben recht viele Befehle in Hardware und anders als die PICs einen guten Registersatz.

Dabei fällt auf, dass mit dem Befehl ldi das Register R16 mit 0x00 (4Bit) verwendet wird,

4 Bit ist Blödsinn, der Befehl lädt immer einen 8-Bit-Wert in das Register. Wie man diesen Wert nun darstellt, ob dezimal, hexadezimal oder binär spielt keine Rolle. Ich glaube, es wäre sogar ein Zeichen als String möglich, aber es bleiben immer 8 Bit.

mit dem Befehl out jedoch mit 0x10 (5 Bit).

Das sollte bei den kleinen AVRs immer passen, die können mit OUT alle Hardware-Register erreichen. Bei den größeren AVRs sind so viele Funktionen und damit verbundene Hardware-Register hinzugekommen, daß sich die oberen anstatt mit IN/OUT nur noch mit LDS/STS erreichen lassen, so als würde man aufs RAM schreiben. Für den ATTiny12 sollte das egal sein.

Wenn Du keine Interrupts benutzt, brauchst Du auch keine Interrupttabelle.

Probier mal:

1
.include "tn12def.inc"
2
.cseg
3
.org  0x00
4
ldi r16,0b00011001
5
out DDRB,r16
6
                                 
7
ldi r16,0b00011001
8
out PORTB,r16
9

10
hang: rjmp hang
#7819151
Lesenswert?

Die ATtiny12 sind uralt und haben folgenden Design-Nachteil: Es gibt kein RAM! Deshalb geht auch nur ASM Programmierung.

Dein Prog nutzt die CPU Register, daher ist das wohl nicht relevant.

ABER, die ATtiny12 die ich in der Zeit der Chipknappheit gekauft hatte waren eine Katastrophe! Diese ließen sich kaum Programmieren. Mutmaßlich weil die Flashzellen aufgrund des Alters der ICs nicht mehr richtig funktionieren.

Nur mit einem superlangsamen Takt von 2kHz und auch erst nach mehreren Versuchen klappte es dann doch.

Meine dringende Empfehlung, nutze ATtiny13 oder besser etwas noch aktuelleres.

Moderator (Firma: Titel) Persönliche Seite #7819226
Lesenswert?

Mark U. schrieb:

Zusammengefasst: Sowohl das Programm als auch meine kleine Hardware funktionierten mit dem ATtiny13A nicht aber mit dem ATtiny12.

Lustig, welchen Interpretationsspielraum so ein fehlendes Komma schafft... ;-)

Variante 1:

funktionierten mit dem ATtiny13A nicht, aber mit dem ATtiny12.

Variante 2:

funktionierten mit dem ATtiny13A, nicht aber mit dem ATtiny12.

Persönliche Seite #7819231
Lesenswert?

Ben B. schrieb:

Dabei fällt auf, dass mit dem Befehl ldi das Register R16 mit 0x00 (4Bit) verwendet wird,

4 Bit ist Blödsinn, der Befehl lädt immer einen 8-Bit-Wert in das Register.

Die LDI Instruktion codiert sowohl den zu ladenden Wert als auch das Zielregister. Für den Wert codieren 8 Bits, und für das Zielregister R16...R31 codieren 4 Bits.

(Firma: Jasinski) #7819690
Lesenswert?

Oliver D. schrieb:

Meine dringende Empfehlung, nutze ATtiny13 oder besser etwas noch aktuelleres.

Es war bei diesem komischen Thread leider auch mein erster Gedanke oder Überlegung, warum sich die Leute immer wieder mit diesen verkümmerten µControllern und Überresten oder Leichen selbst quälen, um irgendetwas mit µControllern – beispielsweise den Einstieg oder Wiedereinstieg – zu machen. Wie ich bereits in einem ähnlichen Fall mit ähnlicher Selbstquälerei schrieb – es gibt auch ATTINY85, ATTINY84 oder gar ATMEGA328P – alle auch in PDIP, den erstgenannten gibt es sogar auch als PDIP8, man kann sie sowohl in Assembler als auch in C programmieren, da hier immer reichlich SRAM vorhanden ist und der Compiler damit im Hintergrund arbeiten kann. Aber das Muster wiederholt sich immer – man will immer schön mit dem Kopf durch die Wand bis der Arzt kommt. Ferner schrieb ich auch, dass ein sehr einfacher, kleiner µC genauso problematisch wie ein größerer sein kann – und das ist hier genau so ein Fall, denn ohne SRAM muss selbst der Mensch in Assembler eine komische Gymnastik mit Registern machen und sie für diese Zwecke entfremden, damit das alles überhaupt funktionieren kann. Diese extrem kleinen, beschnittenen ATTINY-µC sollte man nur dann nehmen, wenn man sie explizit braucht und auch ganz genau weiß, was man da tut.

(Firma: Jasinski) #7819704
Lesenswert?

Hinzu kommt noch immer wieder die Hardwareseite der Geschichte wie Aufbau und Ausrüstung etc. zum Vorschein oder fordert ihren Tribut – statt 50-60 Euro in einen vernünftigen Programmer zu investieren, um sich vom Atmel-Studio-7 direkt mit dem jeweiligen µController zu verbinden und alles sofort zu sehen und unter Kontrolle zu haben, vor allem die Fuses und ob der µC überhaupt lebt, wird irgendein Mist für 5 Euro auf Ali & Co. aus Geizgründen gekauft und man versucht dann damit über Umwege und komischen Aufbau seine generierten Hex-Filechen auf kryptische Weise und oft ohne eine wirkliche, reale Rückmeldung in den µC zu schieben. Es wird auch gar nicht richtig gezeigt, was man da zu Hause eigentlich versucht und macht, sondern es beginnt dann das große Blindekuh-Spiel im Thread, wo dann alle nacheinander versuchen, blind dem Blinden zu „helfen”. Zum Schluss noch ein Trost: wenn es hier dann mit dem Attiny12 und dem 5-Zeilenprogramm endlich klappt, wird man am Ende der absurden Odyssee sehr schnell feststellen müssen, dass auch der Flashspeicher sehr schnell ziemlich knapp wird, wenn man doch ein richtiges Programm schreiben will, denn bei 1 Kilobyte sind es nur 512 einfache Befehle wie NOP, CLR oder ADD, bei größeren Befehlen wird daraus noch deutlich weniger und die Pseudo-Vektortabelle am Anfang des Flashs muss man davon auch noch abziehen; wenn man dann noch ein paar Daten im Flash ablegen will, dann gute Nacht Thaddäus. Aber es steht natürlich jedem frei, sich selbst und – bedingt durch diese Vorgehensweise – auch andere in diesen Strudel des Wahnsinns hineinzuziehen und als Kollateralschaden somit auch zu quälen.

(Firma: Funkenflug Industries) #7819705
Lesenswert?

Viel gelabert, nichts gesagt.

Es ist doch nichts neues, daß man den Controller passend zur Aufgabe wählen muss. Der Registersatz beim AVR ist wie ich bereits angesprochen habe, ziemlich gut. Gewissermaßen hat man da 32 Byte RAM. Für irgendwelche einfachen Aufgaben wie einen programmierbaren Timer oder einen Timer mit irgendwelchen Logikfunktionen reicht das locker, da brauche ich keinen STM32 oder so für nehmen. Auch das eine Kilobyte Flash wird dafür locker reichen, solange man keine größere Menge an Daten bzw. Tabellen für irgendwas braucht. Es besteht auch keine Notwendigkeit, Daten im Flash abzulegen - der ATTiny12 hat 64 Bytes EEPROM dafür.

#7819750
Lesenswert?

Gregor J. schrieb:

warum sich die Leute immer wieder mit diesen verkümmerten µControllern und Überresten oder Leichen selbst quälen, um irgendetwas mit µControllern – beispielsweise den Einstieg oder Wiedereinstieg – zu machen.

Wenns nur ein paar dutzend Zeilen Assembler für die Anwendung braucht, ist ein Tiny12 sicher nicht unterdimensioniert.

Oliver

(Firma: Jasinski) #7819773
Lesenswert?

Oliver S. schrieb:

Wenns nur ein paar dutzend Zeilen Assembler für die Anwendung braucht, ist ein Tiny12 sicher nicht unterdimensioniert.

Es würde sogar noch kleiner mit einem AVR in SOT23-6 gehen, wenn man versiert ist und die Programmierung samt allem, was drumherum dazu nötig ist, beherrscht, hier scheint das aber nicht der Fall zu sein, insofern ein klassischer Fehlgriff in die in diesem Forum so berühmte „Bastelkiste”. Aus welchen Gründen auch immer – und oft ist es die „Geiz ist geil Mentalität” oder weil etwas altes in der Schublade lag, was die Entscheidungen maßgeblich definiert – einfach wieder mal in die falsche Schublade gegriffen, aber das darf jeder selbst feststellen.

(Firma: Jasinski) #7819808
Lesenswert?

Georg M. schrieb:

Seit es den ATtiny412 gibt, ist der dürftige ATtiny13A nicht mehr erwähnenswert.

Viele kommen mit der neueren AVR-Architektur nicht klar und wenn jemand die alten ATTINY registermäßig gar nicht oder nur rudimentär beherrscht oder generell meint, diese durch „Copy & Paste” von Codeteilen beherrschen zu können, so wird er in der Regel die neueren Registeransätze gar nicht verstehen oder mögen können, denn die Komplexität der Peripherieregister geht ein wenig in Richtung STM32 – das beginnt schon mit den Portregistern und mit der Innovation, wie man die I/Os der Ports einstellen und unterschiedlich ansprechen kann, über Virtual Ports etc. Ein AVR128DB28 sieht z.B. von außen genauso wie ein ATMEGA328P aus, ist aber – obwohl die CPU an sich fast identisch arbeitet – im Inneren völlig anders aufgebaut, das Drumherum ist quasi ein deutlich komplexer Neuentwurf. In so einem Fall bleibt einem Kandidaten nichts anderes übrig als bei den alten ATTINY-ICs zu bleiben, allein schon das neue UPDI-Interface macht einem „Ali-1Euro-Käufer” oft einen Strich durch die Rechnung.

Persönliche Seite #7819838
Lesenswert?

Gregor J. schrieb:

denn bei 1 Kilobyte sind es nur 512 einfache Befehle wie NOP, CLR oder ADD, bei größeren Befehlen wird daraus noch deutlich weniger

Immerhin, größere, also 32-Bit Befehle, braucht man ohnehin nicht:

  • LDS / STS braucht man nicht da es eh kein RAM gibt, und für den I/O Bereich genügen IN und OUT.

  • CALL / JMP braucht man wegen des kleinen Programmspeichers auch nicht, bzw werden erst garnicht unterstützt.

(Firma: Jasinski) #7819861
Lesenswert?

Johann L. schrieb:

Immerhin, größere, also 32-Bit Befehler, braucht man ohnehin nicht:

Es ist durchaus möglich, dass durch den extrem kleinen Adressraum alle Befehle innerhalb von 16 Bit codiert werden können und so quasi alles „orthogonal” bleibt, bei RISC-Architektur hat man allerdings das Problem, dass bei vielen Befehlen über zwei Befehle gegangen werden muss, weil das – bedingt durch die Reduzierung des Befehlssatzes – meistens über ein Registerladen geht, und somit dann hier für einen Vorgang oft zwei Befehle (also 2x 16-Bit) benötigt werden, was die Anzahl an maximal möglichen 512 Befehlen in einem 1KB-Speicher immer signifikant reduzieren wird. Möchte man Subroutinen im Code haben, für z.B. verschiedene Delays und eventuell um ein paar komplexere Zahlenberechnungen mit größeren Integern anzustellen, wird der noch vorhandene Platz immer kleiner.

Persönliche Seite #7819883
Lesenswert?

Gregor J. schrieb:

Johann L. schrieb:

Immerhin, größere, also 32-Bit Befehler, braucht man ohnehin nicht:

Es ist durchaus möglich, dass durch den extrem kleinen Adressraum alle Befehle innerhalb von 16 Bit codiert werden können und so quasi alles „orthogonal” bleibt, bei RISC-Architektur hat man allerdings das Problem, dass bei vielen Befehlen über zwei Befehle gegangen werden muss

Nicht bei AVR. Die einzigen 32-Bit Befehle sind LDS, STS, CALL und JMP, die wie erklärt auf ATtiny12 nicht gebraucht werden bzw. ohnehin nicht unterstützt werden.

(Firma: Jasinski) #7819890
Lesenswert?

Johann L. schrieb:

Nicht bei AVR. Die einzigen 32-Bit Befehle sind LDS, STS, CALL und JMP, die wie erklärt auf ATtiny12 nicht gebraucht werden bzw. ohnehin nicht unterstützt werden.

Falls man nicht verstanden hat, was gemeint war, hier unten ein Zitat und Beispiel gleich aus dem ersten Post des Autors – und ich lege sogar noch nach: man muss sogar sehr oft so unfreiwillig über zwei Befehle – also insgesamt 32-Bit – gehen, um einen Vorgang durchzuführen.

1
000006 e109    ldi R16, 0b00011001
2
000007 bb07    out DDRB, R16           // Output Pins
3
                                 
4
000008 e109    ldi R16, 0b00011001
5
000009 bb08    out PORTB, R16          // Output Pins auf High
Persönliche Seite #7819901
Lesenswert?

Gregor J. schrieb:

1
> 000006 e109    ldi R16, 0b00011001
2
> 000007 bb07    out DDRB, R16           // Output Pins
3
> 
4
> 000008 e109    ldi R16, 0b00011001
5
> 000009 bb08    out PORTB, R16          // Output Pins auf High
6
>

Oder einfach:

1
000006 e109    ldi R16, 0b00011001
2
000007 bb07    out DDRB, R16           // Output Pins
3
000009 bb08    out PORTB, R16          // Output Pins auf High
#7819911
Lesenswert?

Gregor J. schrieb:

Möchte man Subroutinen im Code haben, für z.B. verschiedene Delays und eventuell um ein paar komplexere Zahlenberechnungen mit größeren Integern anzustellen, wird der noch vorhandene Platz immer kleiner.

Man kann damit durchaus komplexere Programme schreiben, z.B.: Beitrag "DCF77-Uhr mit ATTINY12"

Man spart sogar Flash, da alle Variablen in Registern vorliegen (kein PUSH, POP, LDS, STS nötig). Allerdings zwingt der begrenzte Hardwarestack zu einigen Kompromissen.

(Firma: Jasinski) #7819913
Lesenswert?

Johann L. schrieb:

1
> 000006 e109    ldi R16, 0b00011001
2
> 000007 bb07    out DDRB, R16           // Output Pins
3
>
4
> 000008 e109    ldi R16, 0b00011001
5
> 000009 bb08    out PORTB, R16          // Output Pins auf High
6
>

Oder einfach:

1
> 000006 e109    ldi R16, 0b00011001
2
> 000007 bb07    out DDRB, R16           // Output Pins
3
> 000009 bb08    out PORTB, R16          // Output Pins auf High
4
>

Man kann den Code später u.a. so optimieren, wenn es gerade so von den Werten passt, erfahrungsgemäß passt es oft aber leider nicht. Ferner wird dem Codemanipulator empfohlen, wenigsten die Orginalversion auskommentiert im Code zu lassen und es entsprechend in einem Kommentar zu erwähnen, um später nicht grübeln zu müssen und es wieder schnell rückgängig zu machen, falls die Werte doch verschieden sein sollten.

(Firma: Jasinski) #7819916
Lesenswert?

Peter D. schrieb:

Man kann damit durchaus komplexere Programme schreiben (...)

Ich habe nicht behauptet, dass es nicht geht, sondern, dass es knapp wird und man sich mit einem µC mit so knappen Ressourcen unnötig selbst Probleme bereitet. Gerade dann, wenn man Assembler nicht kann, kann es zu unüberwindbaren Problemen führen.

(Firma: Funkenflug Industries) #7819939
Lesenswert?

Immer diese Diskussion, welcher Controller nun der beste oder der geeignetste ist, ohne daß man genau weiß, was der TE überhaupt vor hat.

Aber eine Sache dazu: Diese neue AVR-Architektur halte ich für eine Totgeburt. Wenn ich da vieles neu oder umlernen müsste, dann wechsle ich garantiert nicht von AVR-alt auf AVR-neu, sondern von AVR auf ARM Cortex M0 oder M3. Oder eben gleich C-only, dann spielt die Architektur des µC nur noch eine untergeordnete Rolle insofern der Compiler das gewünschte Spektrum abdeckt.

(Firma: Jasinski) #7819957
Lesenswert?

Ben B. schrieb:

Oder eben gleich C-only, dann spielt die Architektur des µC nur noch eine untergeordnete Rolle insofern der Compiler das gewünschte Spektrum abdeckt.

Nein, leider falsch gedacht, sie spielt keine untergeordnete Rolle – egal ob in Assembler oder C, die Arbeit zu den Registern, die angesprochen werden müssen und über die man sich informieren muss, muss in beiden Fällen erledigt werden. Selbst wenn es für die AVR so etwas wie in der STM32CubeIDE für die STM32 zum Zusammenklicken und Vorkonfigurieren gibt, sollte man sich mit der Peripherie auseinandersetzen, um sie adäquat verstehen und nutzen zu können.


Diese neue AVR-Architektur halte ich für eine Totgeburt.

Schauen wir mal, was sich im Laufe der Zeit als Totgeburt herausstellt – Deine Worte oder die neue AVR-Architektur.

(Firma: Jasinski) #7819980
Lesenswert?

Ben B. schrieb:

Gerne. Es ist aber schon 'ne ganze Weile her, daß ich bei irgendwelchen Geräten, die ich so zerlegt habe, 'nen AVR - egal ob alt oder neu - drin gefunden habe. Dafür jede Menge STM32-irgendwas oder deren Klone.

Dein Vergleich oder Deine Analogie hinkt – Du vergleichst Äpfel mit Birnen. Die Welt und der Markt sind viel komplexer, um mithilfe so einer vereinfachten Sichtweise diese Schlussfolgerung abzuleiten.

#7820869
Lesenswert?

Ben B. schrieb:

Immer diese Diskussion, welcher Controller nun der beste oder der geeignetste ist, ohne daß man genau weiß, was der TE überhaupt vor hat.

Aber eine Sache dazu: Diese neue AVR-Architektur halte ich für eine Totgeburt. Wenn ich da vieles neu oder umlernen müsste, dann wechsle ich garantiert nicht von AVR-alt auf AVR-neu, sondern von AVR auf ARM Cortex M0 oder M3. Oder eben gleich C-only, dann spielt die Architektur des µC nur noch eine untergeordnete Rolle insofern der Compiler das gewünschte Spektrum abdeckt.

Na ja, es gibt halt eine ganze Menge Leute, die schlauer sind als Du und mit dem Lernen keine Probleme haben. Du bist aber auch nicht der Maßstab. Die neuen Serien haben einige Vorteile, die die Industriekunden haben wollen. Z.B. die Entkopplung der IO-Spannung von der Kernspannung. Die Teile laufen über den gesamten Spannungsbereich mit vollem Takt, weil der Kern eben immer nur mit z.B. 1.8V läuft. Kleinere Transistoren sind halt schneller. Bei den 8-Bit PICs ist das schon seit einem Jahrzehnt so. Oder das Einblenden des Programspeichers in den Datenadressraum. Das erlaubt einfache Pointeroperationen statt (E)LPM. Das hat PIC24 z.B. seit Anfang an mit dem PSW (Program Space Window). Oder der Verzicht auf DIL-Packages. Braucht in der Industrie kaum noch jemand. Viel zu teuer in der Bestückung. Wer die Rechnung bezahlt, bestimmt, was gespielt wird.

Und was zahlst DU?

fchk

(Firma: Jasinski) #7820949
Lesenswert?

Ben B. schrieb:

Wenn ich da vieles neu oder umlernen müsste, dann wechsle ich garantiert nicht von AVR-alt auf AVR-neu, sondern von AVR auf ARM Cortex M0 oder M3.

Dass ich in der Komplexität des Registeraufbaus der neuen AVRs ansatzweise Züge des Registeraufbaus der STM32 gefunden habe, heißt leider nicht automatisch, dass der Einstieg in die STM32-Welt genauso einfach wie der Einstieg in die Welt der neuen AVRs sein wird, selbst mit dem einfachsten STM32F030 wird es nicht so einfach sein, aber das weiß man sofort, wenn man mit der schwerverdaulichen Materie anfängt und sich vorab z.B. schon mal ein wenig mit den Datenblättern befasst. Der Plural des Substantivs hier ist leider kein Schreibfehler und der Umfang der Dokumentationen ist deutlich größer – bei den 8-Bit-AVRs ist das alles in der Regel in einem überschaubar kurzen oder langen Datenblatt eingekapselt.

#7821047
Lesenswert?

Ben B. schrieb:

dann wechsle ich garantiert nicht von AVR-alt auf AVR-neu, sondern von AVR auf ARM Cortex M0 oder M3.

Habe ich das richtig verstanden: Es kann entweder der NE555 oder ein ARM Cortex-M sein, und nichts dazwischen?

Ben B. schrieb:

Oder eben gleich C-only, dann spielt die Architektur des µC nur noch eine untergeordnete Rolle insofern der Compiler das gewünschte Spektrum abdeckt.

Es gibt sehr viele unterschiedliche Mikrocontroller, weil sie unterschiedlich sind, weil ihre Komponenten unterschiedlich sind: Timer, ADC, DAC, AC, Vʀᴇꜰ, interne Oszillatoren, Connectivity, Power Management, etc. etc. etc. Die Kenntnis von Programmiersprachen allein reicht nicht aus: man muss auch das Datenblatt lesen.

(Firma: Funkenflug Industries) #7822092
Lesenswert?

Habe ich das richtig verstanden: Es kann entweder der NE555 oder ein ARM Cortex-M sein, und nichts dazwischen?

Ja natürlich hast Du das richtig missverstanden, für diese großartige Leistung darf man Dich durchaus beglückwünschen.

Ich bin der Meinung, daß die älteren AVR-Kerne dafür völlig ausreichend sind. Und naja, die kleineren ARM Cortex sind heute ähnlich preiswert wie ein NE555.

Ich hätte mich mehr darüber gefreut, wenn sie den älteren AVR-Kernen etwas bessere Hardware gegönnt hätten. Vielleicht einen höheren Takt, schnellere Timer (bekommt man nur bei einer kleinen Auswahl, nicht bei allen AVRs), D/A-Wandler oder besser auflösende A/D-Wandler, USB-Fähigkeit. So wie man das im Wesentlichen beim 8051 gemacht hat.

#7825047
Lesenswert?

Hallo,

jetzt will ich das Thema hier abschließen. Inzwischen habe ich einen ATtiny13A bestellt. Den kann ich in C programmieren und die Schaltung funktioniert damit.

Weil ich aber neugierig war, ob nun wirklich der ATtiny12 ein Problem hatte, habe ich mir auch davon einen mitbestellt. Den habe ich mit dem ursprünglichen Assembler Code programmiert und siehe da, auch damit läuft die Schaltung. Also waren die Schaltung und auch das Assembler Programm in Ordnung und das Problem lag offenbar beim ersten ATtiny12, der einen Defekt hatte.

#7825093
Lesenswert?

Mark U. schrieb:

Also waren die Schaltung und auch das Assembler Programm in Ordnung und das Problem lag offenbar beim ersten ATtiny12, der einen Defekt hatte.

Danke für den Nachtrag - hatte gerade diesen Thread zufällig gefunden und mit Interesse überflogen.

Kurioserweise hatte ich mich die letzten Tage auch etwas mit dem ATtiny12 beschäftigt, aber ohne ein Exemplar davon zu besitzen - lediglich dessen ISP-Schnittstelle war für mich interessant, da dieser die RDY/BSY-Instruktion fehlt und dadurch das Testen von Value Polling mit avrdude ermöglicht wird.

#7825115
Lesenswert?

Mit der Programmierschnittstelle habe ich mich gar nicht befasst und kann dazu leider auch nichts sagen.

Insgesamt ist es schon so, dass der ATtiny12 mal interessant für ein kleines Assembler-Projekt ist. Aber viel mehr als eine LED blinken zu lassen ist für mich dann doch zu aufwendig. Und so bin ich mit dem ATtiny13A jetzt wahrscheinlich besser beraten.

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