Forum: Mikrocontroller und Digitale Elektronik megaAVR 0 - Lowlevel Libraries


von Thomas F. (tf1973)


Lesenswert?

Hallo,

muss für ein Projekt wegen der Verfügbarkeit auf die megaAVR 0 Serie
zugreifen. Hab leider seit gut 15 Jahren keinen AVR mehr in der Hand
gehabt und Zeit zur Wiedereinarbeitung ist (wie immer) knapp....:)
Gibt es dafür irgendwelche komfortablen Libraries um das Leben zu
vereinfachen? Alles was man so findet für die älteren AVRs kann man
leider nicht verwenden, weil die Registernamen und Speicheradressen
unterschiedlich sind. Danke für jeden Tipp!

von Cyblord -. (cyblord)


Lesenswert?

Nimm die mitgelieferten Header und fertig. Programmiere nach Datenblatt.

von Frank G. (frank_g53)


Lesenswert?

Thomas F. schrieb:
> Gibt es dafür irgendwelche komfortablen Libraries um das Leben zu
> vereinfachen?

Vielleicht ist hier was dabei:
https://github.com/MCUdude

von Thomas F. (tf1973)


Lesenswert?

Danke, aber das ist leider für Arduino.

von Stefan F. (Gast)


Lesenswert?

Thomas F. schrieb:
> Danke, aber das ist leider für Arduino.

Na und? Du hast nach "irgendwelche komfortablen Libraries" gefragt.

Arduino fällt ganz sicher in diese Kategorie. Und das schöne an Arduino 
ist, dass du weder auf die IDE festgenagelt bist, noch sonstwie 
eingeschränkt wirst. Du kannst C und C++ verwenden und auch immer noch 
direkt auf Register zugreifen, wenn du willst.

von Thomas F. (tf1973)


Lesenswert?

Ich hab da bisher immer einen Bogen herum gemacht :)

Wie sieht das aus beim Kompilieren bezüglich Codesize und 
Geschwindigkeit gegenüber nativem Code?

von abc (Gast)


Lesenswert?

Es ist nativer code...halt schön verpackt..

von Cyblord -. (cyblord)


Lesenswert?

abc schrieb:
> Es ist nativer code...halt schön verpackt..

Und sau lahm.
Weil jede Funktion darauf ausgelegt ist, dass sie von einem Affen mit 
Schlaganfall aufgerufen wird.

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Cyblord -. schrieb:
> Und sau lahm.
> Weil jede Funktion darauf ausgelegt ist, dass sie von einem Affen mit
> Schlaganfall aufgerufen wird.

Du meinst wohl hauptsächlich digitalWrite() und digitalRead(). Die muss 
man nicht benutzen. Betrachte sie als optionale Komfortfunktionen.

von Veit D. (devil-elec)


Lesenswert?

Hallo,

@ TO:
Du hast demnach beim lesen des Wortes 'Arduino' schon abgebrochen 
weiterzulesen? Dann hast du die fertigen Libs von MCUdude leider auch 
nicht verdient. Leichter kann man es nun wirklich nicht auf dem 
Silberteller serviert bekommen. Selbst für das Pin schalten sind 
schnellere Funktionen dabei. Müßtest ja nur das was du brauchst 
extrahieren. Aber wenn du nicht willst, dann eben nicht.

von Florian S. (sevenacids)


Lesenswert?

Der megaAVR bringt doch für die Ports schon "Komfortregister" zum Ein-, 
Aus- und Umschalten der Richtung und Ausgangswerte der Pins 
(DIRSET/DIRCLR/DIRTGL/OUTSET/OUTCLR/OUTTGL) mit. Wozu braucht man da 
noch Komfortfunktionen?

Es kommt immer darauf an, was man machen möchte. Für simple 
Portansteuerung oder das Senden von ein paar Bytes per UART benötigt man 
sicherlich keine Bibliotheken. Bei komplexeren Aufgaben sieht das 
natürlich anders aus.

Wenn der TE wirklich Bibliotheken verwenden möchte: Einfach die 
vorhandenen Bibliotheken auf den neuen AVR anpassen kommt für dich nicht 
in Frage? Mit etwas Glück hält sich der Aufwand in Grenzen.

: Bearbeitet durch User
von Markus (Gast)


Lesenswert?

>Vielleicht ist hier was dabei:
>https://github.com/MCUdude

By the way: Sieht jemand den Unterschied zwischen dem "Migthy-Core" und 
dem "Mega-Core" in dem Repositiory?
Warum gibt es zwei "Cöre"?

von Stefan F. (Gast)


Lesenswert?

Florian S. schrieb:
> Wozu braucht man da noch Komfortfunktionen?

Zur Übersetzung der Arduino Port Nummern in AVR Port+Pin.

von Cyblord -. (cyblord)


Lesenswert?

Stefan ⛄ F. schrieb:
> Florian S. schrieb:
>> Wozu braucht man da noch Komfortfunktionen?
>
> Zur Übersetzung der Arduino Port Nummern in AVR Port+Pin.

Das ist sehr wichtig für intellektuell herausgeforderte Entwickler mit 
besonderen Bedürfnissen.

von Stefan F. (Gast)


Lesenswert?

Cyblord -. schrieb:
> Das ist sehr wichtig für intellektuell herausgeforderte Entwickler mit
> besonderen Bedürfnissen.

Schön formuliert. Warum haben die Arduino Erfinder sich diesen Quatsch 
eigentlich angetan?

von Veit D. (devil-elec)


Lesenswert?

Hallo,

Gegenfrage. Warum soll das Quatsch sein? Dann wäre ja jede C++ OOP Lib 
Quatsch die man sich schreibt um sich das Leben einfacher zu machen.
Um bei den Pins zu bleiben. Warum soll man sich in seinem Programmcode 
ständig mit Ports und Bits rumschlagen? Das macht auf Dauer keinen Sinn. 
In C schlägt man sich deswegen mit define Makros durch. In C++ gehts 
besser.

von BasherBasher (Gast)


Lesenswert?

Veit D. schrieb:
> Warum soll das Quatsch sein?

Da fragt einer nach megaAVR 0 Libs, bekommt eine große Sammlung 
vorgesetzt.
Die schmeckt ihm nicht.
Soweit so gut.
Damit könnte fertig sein.

Aber dann kommen mal wieder die Basher aus den Büschen gesprungen, und 
es wird lustig. Leider ist denen mit Argumenten nicht bei zu kommen. 
Vorurteilsträger sind dafür nicht zugänglich! Da muss wohl irgendeine 
"Arduino Weltverschwörung" mit allen Mitteln unterbunden werden.

Danke fürs lesen und Tschüss.

von Markus (Gast)


Lesenswert?

>von Stefan ⛄ F. (stefanus)
>14.09.2021 10:44

>Cyblord -. schrieb:
>> Das ist sehr wichtig für intellektuell herausgeforderte Entwickler mit
>> besonderen Bedürfnissen.

>Schön formuliert. Warum haben die Arduino Erfinder sich diesen Quatsch
>eigentlich angetan?

Tja, da sind wahrscheinlich 10 Millionen Arduinonutzer anderer Meinung 
als ihr zwei Spezialisten.

Aber wenn du's wirklich wissen willst, kannst du es hier genau 
nachlesen:
https://arduinohistory.github.io/

von Veit D. (devil-elec)


Lesenswert?

Markus schrieb:

> https://arduinohistory.github.io/

Danke für den interessanten Link. Mein Resümee daraus ist das Open 
Source leider auch ausgenutzt wird. Leider.

von Spess53 (Gast)


Lesenswert?

Hi

>Tja, da sind wahrscheinlich 10 Millionen Arduinonutzer anderer Meinung
>als ihr zwei Spezialisten.

Leute, fresst Scheiße, denn Millionen Fliegen können sich nicht irren.

MfG Spess

von Stefan F. (Gast)


Lesenswert?

Veit D. schrieb:
> Mein Resümee daraus ist das Open
> Source leider auch ausgenutzt wird.

Entschuldige mal, aber das ist ein Sinn von Open Source. Schau dir mal 
die gängigen Lizenzen an, dann siehst du, dass kommerzielle Nutzung der 
Werke ausdrücklich vorgesehen ist.

Wer das verhindern will, muss das halt in seinem Lizenztext verbieten. 
Die meisten Opern-Source Entwickler wollen es aber absichtlich zulassen.

von Peter D. (peda)


Lesenswert?

Veit D. schrieb:
> Um bei den Pins zu bleiben. Warum soll man sich in seinem Programmcode
> ständig mit Ports und Bits rumschlagen? Das macht auf Dauer keinen Sinn.
> In C schlägt man sich deswegen mit define Makros durch.

Man kann einem Macro auch 2 Parameter übergeben und damit einen 
bestimmten Pin definieren. Damit ist man sehr flexibel, Pins 
nachträglich zu ändern. Ich schreibe diese Definitionen in ein 
"hardware.h".

Das Arduino-Mapping einer Zahl auf einen Pin gilt nur für Arduion-Boards 
und läßt sich daher nicht auf eigene Projekte anwenden. Man müßte sonst 
eine zusätzliche Tabelle mit dem Mapping der magischen Zahl auf einen 
physischen Pin mitpflegen. Damit fügt man eine zusätzliche Fehlerquelle 
hinzu und der Betrachter des Schaltplans steht beim Debugging ziemlich 
ratlos da.

von Teo (Gast)


Lesenswert?

Sie dich erst mal auf der Microchip Seite um!³
Dann gibts auch noch den Code Configurator, der viel Tipparbeit erspart. 
In wie weit die AVRs bereits unterstützt werden kA. aber da sollte sich 
schon was finden lassen!

von Cyblord -. (cyblord)


Lesenswert?

Es macht halt wenig Sinn von einer Portnummerierung auf eine Andere 
Portnummerierung zu abstrahieren.

Das wird sowieso nur bei generischen Boards benötigt. Für eine spezielle 
Applikation abstrahiert man im Code so schnell wie möglich über die 
eigentliche Funktion. Und da ist es egal ob das PORTB.3 oder Pin 8 ist.

von Peter D. (peda)


Lesenswert?

Teo schrieb:
> Dann gibts auch noch den Code Configurator, der viel Tipparbeit erspart.

Solche Wizards können schnell Ärger bereiten. Man ist dann auf Gedei und 
Verderb auf eine ganz bestimmte Umgebung angewiesen und kann nicht eben 
mal auf einen anderen Compiler wechseln.
Und wenn man mal ein älteres Projekt wieder anfassen muß, wurde der 
Wizard mehrfach geändert und versteht die alten Datenformate bzw. alte 
Chipversionen nicht mehr. Die originale Wizardversion wurde natürlich 
von der Downloadseite entfernt oder geht mit aktuellen Windows/PCs nicht 
mehr.

von Veit D. (devil-elec)


Lesenswert?

Hallo,

@ Stefan:
Hast du den Link gelesen oder nur auf meinen Kommentar reagiert? Ich 
empfehle erstmal zu lesen.

@ Peter:
Es hält einen niemand davon ab auch bei eigenen Boards die Pins 
durchzunummieren. Wer das mag. Dann kann man mittels for Schleife 
darüber iterieren. Man kann den Nummern auch eindeutige Namen geben. In 
meiner Lib habe ich alle Möglichkeiten ohne Einschränkung. Ich kann 
einen Pin mit Nummer oder Namen ansprechen. Die Idee von MCUdude gefiel 
mir und habe ich übernommen. Das macht absolut keinen Unterschied. Weder 
in der Codegröße noch in der Geschwindigkeit. Am Ende spielt das weniger 
eine Rolle wie man denkt, weil man mit C++ in Objekten denkt (bzw. 
denken sollte) und weniger an die eigentliche Hardware. Ich sage nicht 
schalte Pin 2 ein sondern ich sage schalte Pumpe ein. Damit weiß ich 
beim Code lesen was geschalten wird. Und ich kann versehentlich weniger 
Unsinn machen. Bspw. kann ich einen konfigurierten Eingangspin nicht 
schalten.
1
// In original Arduino sieht das so aus.
2
// Man hat mit den Nummern im Grunde auch nur einmal etwas zu tun.
3
const byte pumpe {2};
4
pinMode(pumpe, OUTPUT);
5
digitalWrite(pumpe, HIGH);
6
7
// Mit meiner Lib sieht das so aus. pumpe wird zum Objekt.
8
OutputPin <2> pumpe; // oder bspw. OutputPin <pinPA2> pumpe;
9
pumpe.init();
10
pumpe.setOn();
11
12
// Bei dir sieht das dann so oder so ähnlich aus.
13
#define pumpe_OUT  sbi (DDRA,2)  
14
#define pumpe_ON   sbi (PORTA,2)

Das was du in deiner hardware.h stehen hast, steht bei mir Sinngemäß in 
einer Registertabelle. Bei einem angenommen neuen Boarddesign müssen wir 
beide nur die eine Datei anpassen. Die andere Datei bei mir mit den 
Methoden/Elementfunktionen bleibt ja immer gleich.

Allen ist bewusst das die Arduino Pin Funktionen nicht gerade die 
Schnellsten sind. Für das Pin Schnelligkeitsproblem kenne ich einen User 
im Arduino Forum der das Problem gelöst hast. Das habe ich adaptiert, 
verstanden und für den ATtiny841, Nano Every Board und AVRxDB umgesetzt. 
MCUdude und Spencekonde haben das etwas anders im #define Style gelöst. 
Hat den Grund das die Schreibweise für den User nahezu identisch bleibt. 
Das Ergebnis ist in allen Fällen gleich. Es wird ein Takt zum Pin 
schalten benötigt. Damit ist die Schwachstelle vom Tisch.

Aber nur um das klarzustellen. Mir ist es egal ob jemand C oder C++ 
programmiert. Soll jeder machen wie er mag. Grabenkämpfe sind eh 
sinnlos. Und wenn jemand Arduino nicht mag dann eben nicht. Nur dann 
soll er diese Leute in Ruhe lasen. Genauso wie ich Bascom und 
Assemblerprogrammierer in Ruhe lasse. Gegenseitig kann man dennoch etwas 
lernen bzw. mitnehmen. Es kommt auf die grundlegende Idee an. Umsetzen 
muss es dann jeder in seiner bevorzugten Programmiersprache.

@ Teo:
diesen Wizard habe ich einmal in Atmel Studio ausprobiert. Schrecklich. 
Es werden tausende Dateien erstellt durch die man sich erstmal 
durchwühlen muss um zu sehen wie die Funktionen denn nun lauten um sie 
zu nutzen. Und irgendwelche Timer zu konfigurieren macht darin auch 
keinen Spass. Weil man erst wissen muss was die Auswahlfelder genau 
bedeuten. Mit Manual und paar Zeilen Code tippen kommt man wesentlich 
besser und schneller zum Ziel und hat keinen Wust an Headerfiles. Das 
ist bestimmt alles gut gemeint, schießt aber am Ziel vorbei.

von Stefan F. (Gast)


Lesenswert?

Veit D. schrieb:
> Hast du den Link gelesen oder nur auf meinen Kommentar reagiert?

Ich habe nur auf deinen Kommentar reagiert. Die Story von Arduino habe 
ich nur noch grob in Erinnerung, ich las sie vor ein paar Jahren mal 
komplett durch als ich Interesse daran hatte.

von Teo D. (teoderix)


Lesenswert?

Peter D. schrieb:
> Solche Wizards können schnell Ärger bereiten. Man ist dann auf Gedei und
> Verderb auf eine ganz bestimmte Umgebung angewiesen und kann nicht eben
> mal auf einen anderen Compiler wechseln.

Jo, macht ja auch Sinn, hier den Compiler zu wechseln.....?

Peter D. schrieb:
> Und wenn man mal ein älteres Projekt wieder anfassen muß, wurde der
> Wizard mehrfach geändert und

Na dann gehts halt zu Fuß weiter, so als hätte es nie einen gegeben. Da 
wird ja nix kryptisches erzeugt!
Und auch noch Dokumentiert.....


Veit D. schrieb:
> @ Teo:
> diesen Wizard habe ich einmal in Atmel Studio ausprobiert. Schrecklich.
> Es werden tausende Dateien erstellt durch die man sich erstmal
> durchwühlen muss um zu sehen wie die Funktionen denn nun lauten um sie
> zu nutzen. Und irgendwelche Timer zu konfigurieren macht darin auch
> keinen Spass.

Kenns nur aus dem MPLAB X und für PICs.
Tausende? Nö! Viele, Ja klar, für jedes Modul zwei, foo.h und foo.c :)
Zurechtfinden ist leicht. Nur muss man halt viel ungenutzten Sourcecode 
mit rumschleppen, sonnst wird die Weiterverwendung des Generators 
"nervig" (Code merging).
Das MPLAB-X und Co, mit etlichen, seit Jahren nicht behobenen Bugs 
nervt, is ne andere Geschichte. :/

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.