RE: Arduino / AVR / Atmega328p "Lern-"Fragen

#1 von franz_H0m , 04.04.2021 13:22

Hallo,

ich bringe mir mühsam langsam Arduino und AVR bei. Mein Programmierstil bisher kann man am besten als "cut & paste" bezeichnen, aber ich habe diesen Spleen, dass ich gerne verstehe, was ich cutte and paste. Manchmal wäre es ganz schön, einfach jemanden Fragen zu können, anstatt googeln zu müssen. Das mache ich jetzt mal hier.

Wenn ich ein Register bitweise manipulieren will, habe ich verschiedene Methoden gefunden, die mir äquivalent vorkommen. Sehe ich richtig, dass die beiden Folgen Möglichkeiten das gleiche machen? Und hat eine Methode einen Vorteil über eine andere?

Beispiel ADC Register:

1
2
3
4
5
 

bitSet (ADCSRA, ADSC);
//macht das gleiche wie
ADCSRA |= (1 << ADSC)
//oder?
 



Und dann entsprechend:

EDIT: Ist leider falsch, siehe weiter unten. Richtig ist ADCSRA &= ~(1 << ADSC)

1
2
3
4
5
 

bitClear (ADCSRA, ADSC);
//macht das gleiche wie
ADCSRA &amp;= (0 &lt;&lt; ADSC)
//oder?
 



Danke!


Grüße, Franz

Mitglied bei den Lundarallarna.
Avatar: MAN-Zugmaschine der Ottensener Industriebahn (Foto: Dr. Ullrich Huckfeld).


 
franz_H0m
InterCity (IC)
Beiträge: 552
Registriert am: 02.11.2008
Ort: Lund, Sweden
Gleise Tillig/Eigenbau
Spurweite H0m
Steuerung z21PG DCC
Stromart Digital


RE: Arduino / AVR / Atmega328p "Lern-"Fragen

#2 von Domapi , 04.04.2021 13:53

Das kann man doch ganz einfach ausprobieren, indem man z.B. Bit 3 in einer Variablen „Test“ setzt (vorher Test = 0 setzen), mit beiden Wegen und dann die Variable im seriellen Monitor ausgibt.


Viele Grüße
Martin

- Mein Trennungsbahnhof: viewtopic.php?f=64&t=152275
- Drehscheibensteuerung auf Arduinobasis "LocoTurn": https://wiki.mobaledlib.de/anleitungen/b...v10/150_inhalte


 
Domapi
CityNightLine (CNL)
Beiträge: 1.654
Registriert am: 22.09.2015
Ort: Nämberch
Gleise Ohne Pickel
Spurweite H0
Steuerung Mit Hirn und Verstand
Stromart DC, Digital


RE: Arduino / AVR / Atmega328p "Lern-"Fragen

#3 von franz_H0m , 04.04.2021 14:45

Hallo Martin,

da hast du natürlich recht.


Grüße, Franz

Mitglied bei den Lundarallarna.
Avatar: MAN-Zugmaschine der Ottensener Industriebahn (Foto: Dr. Ullrich Huckfeld).


 
franz_H0m
InterCity (IC)
Beiträge: 552
Registriert am: 02.11.2008
Ort: Lund, Sweden
Gleise Tillig/Eigenbau
Spurweite H0m
Steuerung z21PG DCC
Stromart Digital


RE: Arduino / AVR / Atmega328p "Lern-"Fragen

#4 von Wolframwendel , 08.04.2021 19:56

Hallo Allerseits

Martins Test führt leider in die Irre! Und das kommt so: Der vorgeschlagene Ersatz für Bitclear löscht alle Bits, nicht nur das gewünschte. Besser wäre etwa ADCSRA &= ~(1 << ADSC). Wird der Test nur mit einem gesetzten Bit durchgeführt, fällt der Unterschied nicht auf.

Gruss
Wolframwendel


Wolframwendel  
Wolframwendel
Beiträge: 3
Registriert am: 10.03.2021


RE: Arduino / AVR / Atmega328p "Lern-"Fragen

#5 von Domapi , 09.04.2021 07:27

Ein Test führt selten in die Irre, höchstens zu neuen Erkenntnissen.
Ich habe nicht behauptet, dass die beiden Versionen das gleiche Ergebnis in allen Konstellationen liefern.
Darum der Vorschlag das zu testen/debuggen, ggf. mit diversen Variablenwerten - so wie man das halt bei Tests macht.


Viele Grüße
Martin

- Mein Trennungsbahnhof: viewtopic.php?f=64&t=152275
- Drehscheibensteuerung auf Arduinobasis "LocoTurn": https://wiki.mobaledlib.de/anleitungen/b...v10/150_inhalte


 
Domapi
CityNightLine (CNL)
Beiträge: 1.654
Registriert am: 22.09.2015
Ort: Nämberch
Gleise Ohne Pickel
Spurweite H0
Steuerung Mit Hirn und Verstand
Stromart DC, Digital


RE: Arduino / AVR / Atmega328p "Lern-"Fragen

#6 von Klaus3 , 09.04.2021 15:20

Zitat

ich bringe mir mühsam langsam Arduino und AVR bei.



Erster Tip: Lerne Programmieren, richtig! All dieses Arduino, Scetch, Dings Zeugs... ja, sehr hilfreich für den aller ersten Tag, aber dann? Viele Dinge, die Du in der riesigen Bibliothek findest, funktioniere allein alle super. Aber sobald Du mehrere Dinge gleichzeitig verwendest. kann es "merkwürdig" werden. Zudem ist "Arduino" irgendwie eine Schein-Welt für eine unendliche Zahl von Controllern. Und all das verwirrt, wenn man sich mit einer ganz konkreten Hardware beschäftigt. Ein Datenblatt des Controllers nehmen, zum Biespiel AVR Atmega32 und dann gehts los. Dazu die passende libc fuer avr und den passenden Compiler, typischer Weise gcc in einer aktuellen Version, also derzeit 10.x

Zitat

Mein Programmierstil bisher kann man am besten als "cut & paste" bezeichnen, aber ich habe diesen Spleen, dass ich gerne verstehe, was ich cutte and paste. Manchmal wäre es ganz schön, einfach jemanden Fragen zu können, anstatt googeln zu müssen. Das mache ich jetzt mal hier.



Da würde ich mich in einem Programmierforum eintragen. Da wird Dir vermutlich zielführender geholfen. Ich empfehle https://stackoverflow.com.

Zitat

Wenn ich ein Register bitweise manipulieren will, habe ich verschiedene Methoden gefunden, die mir äquivalent vorkommen. Sehe ich richtig, dass die beiden Folgen Möglichkeiten das gleiche machen? Und hat eine Methode einen Vorteil über eine andere?

1
2
3
4
5
 

bitSet (ADCSRA, ADSC);
//macht das gleiche wie
ADCSRA |= (1 &lt;&lt; ADSC)
//oder?
 



Und dann entsprechend:

1
2
3
4
5
 

bitClear (ADCSRA, ADSC);
//macht das gleiche wie
ADCSRA &amp;= (0 &lt;&lt; ADSC)
//oder?
 





Ganz daneben

Also was passiert:
Was ist ADSC:
avr/iom32a.h:#define ADSC 6
Es ist also das Bit Nummer 6 im Register ADCSRA.

Wenn wir nun dieses Bit in einer Integer-Variablen setzen wollen, benutzen wir den "shift operator <<" und schieben den Wert 1 solange, bis diese 1 an der passenden Stelle steht. Beispiel:

1 << 0 ergibt 1
1 << 1 ergibt 2
1 << 2 ergibt 4
usw.

Hierzu solltest Du also in der Lage sein, zu verstehen, was ein Bit in einem Integer Wert bedeutet, welche Werte dann diese Integer Variable hat usw.
Beispiel

Integer: 5 ist in Bits 101, weil eben 1*4 + 0*2 + 1*1 -> 5 ergibt.

Also zurueck zum Bit loeschen:

Wir wollen ja das Bit Nummer 6 in dem Register loeschen:
Also:
Wir schieben eine 1 6 mal nach links ( 1<<6 ), ergibt 64 oder besser hexadezimal: 0x40 ( man sieht da einfacher, das es sich um Bits handelt

Also ist jetzt in dem Wert genau das 6. Bit gesetzt. Um es zu loeschen, wollen wir aber genau das "Gegenteil", also alle Bits sollen 1 sein, außer das 6te!
Also drehen wir den ganzen Integer Wert um. Dazu gibt es den ( ~ operator )

~0x00 -> 0xff
~0xff -> 0x00
~0x01 -> 0xfe
und so weiter. Hier haben wir 8 Bit Integer betrachtet.

Nun wollen wir ja in einem Register was loeschen, dazu verknuepfen wir mit UND. "&", es bleibt also nur übrig, was in BEIDEN Werten des
Operators gesetzt war. Beispiel:

0x05 & 0x01 -> 0x01
0x05 & 0x02 -> 0x00
0x05 & 0x04 -> 0x40
0x0f & 0x55 -> 0x05
usw.

Wenn wir also:
ADCSRA &= ~(1 << ADSC)
ausfuehren, loeschen wir das Bit6 in dem Register.

Also: Lerne wirklich Programmieren. Hier solltest Du Dich erst einmal mit den Operatoren für Integer beschäftigen. Am einfachsten geht das, wenn Du Du das direkt auf einem PC machst, anstatt embedded. Direkt auf der Maschine sparst Du Dir das ständige runterladen und angucken, zudem hast Du direkt einen Debugger und kannst Dir Schritt fuer Schritt anschauen, was passiert.

Und Fragen zur Programmierung solltest Du besser auf einem Programmierforum stellen.

Hoffe ein wenig geholfen zu haben.

Gruß
Klaus


Klaus3  
Klaus3
InterCity (IC)
Beiträge: 564
Registriert am: 06.11.2015
Spurweite N
Stromart DC


RE: Arduino / AVR / Atmega328p "Lern-"Fragen

#7 von franz_H0m , 09.04.2021 16:02

Da ist mir doch geholfen worden - Danke Euch allen.

Ein typischer Fehler für mich, nicht zu Ende gedacht.

Danke auch für den Hinweis auf Stackexchange und Programmierforen, da frage da auch manchmal, wenn ich will. Ich fühle mich hier halt wohl. Wer hier im Stummiforum solche Sachen nicht diskutieren will, muss ja nicht.

Die Frage, welche der beiden Methoden besser ist, habe ich mir selber beantwortet. In der Arduino.h steht:

1
2
3
 

#define bitClear(value, bit) ((value) &amp;= ~(1UL &lt;&lt; (bit)))
 
 



Was das richtig programmieren betrifft - geschenkt. Sehe ich genauso. Leider bin ich bisher ohne durchs Leben und durchs Hobby gekommen, da das zusammenpfuschen immer schneller ging. Und deshalb ist Arduino und Python mehr mein Fall als C. PICs habe ich aber bisher nur in Assembler programmiert (kleine Sachen), also ich bin durchaus mit Registern und Bits usw vertraut.

Ich bin mehr der Generalist als Spezialist, aber mir ist völlig klar was mich von den Experten unterscheidet und die lass ich dann auch machen.


Grüße, Franz

Mitglied bei den Lundarallarna.
Avatar: MAN-Zugmaschine der Ottensener Industriebahn (Foto: Dr. Ullrich Huckfeld).


 
franz_H0m
InterCity (IC)
Beiträge: 552
Registriert am: 02.11.2008
Ort: Lund, Sweden
Gleise Tillig/Eigenbau
Spurweite H0m
Steuerung z21PG DCC
Stromart Digital


RE: Arduino / AVR / Atmega328p "Lern-"Fragen

#8 von MicroBahner , 11.04.2021 12:01

Hallo Franz,

Zitat

deshalb ist Arduino und Python mehr mein Fall als C

Arduino ist 'C' oder besser gesagt 'C++'. Und zwar in voller Schönheit - fast ohne Einschränkungen. Die EInschränkungen resultieren eher aus der beschränkten Leistungsfähigkeit der Prozessoren. Bei den 'besseren' sind auch die Einschränkungen kleiner. Das Ardino System deckt da durch vordefinierte Funktionen viel ab und vereinheitlicht die Handhabung verschiedener Prozessoren. Das erleichtert den Einstieg. Man kann aber auch gut 'unter die Decke' schauen - nichts ist wirklich verborgen.


viele Grüße
Franz-Peter
Ein 'elektromechanisches' Stellwerk
Der (ehemalige) 'Eisberg'


 
MicroBahner
Metropolitan (MET)
Beiträge: 2.833
Registriert am: 28.11.2012
Ort: Mittelfranken
Gleise Tillig Elite
Steuerung Eigenbau
Stromart Analog


RE: Arduino / AVR / Atmega328p "Lern-"Fragen

#9 von Klaus3 , 11.04.2021 13:01

Zitat

Hallo Franz,

Zitat

deshalb ist Arduino und Python mehr mein Fall als C

Arduino ist 'C' oder besser gesagt 'C++'. Und zwar in voller Schönheit - fast ohne Einschränkungen.




Also auf dem AVR ist C++ nur absolut minimalistisch einsetzbar!

Probleme:
Ein Designproblem im Compiler verlagert JEDE v-Table ins RAM. Da ist ganz schnell Ende mit der Herrlichkeit, wenn man ein paar Klassen mit virtuellen Funktionen definiert
Ein Designproblem im Compiler verlagert Switch/Case Sprünge ebenso ins RAM. Das kann schon mal dazu führen, daß man kaum Variablen hat, aber der Controller kein Ram mehr hat.

Allein diese beiden Probleme sind oft mal wirklich KO-Kriterien!

Des weiteren fehlt für AVR komplett die STL. Das man keine dynamischen Container auf einem AVR nutzen sollte, mag ja einleuchten, aber das es all die statischen Container/Klassen/Traits/Utilities nicht gibt, ist wirklich eine Katastrophe. Technisch gibt es dafür keinerlei Gründe. Einzig die "alles hängt von allem ab" Implementierung der GCC-STL läßt keine Nutzung zu. Wäre die STL für GCC saube, könnte man problemlos auch mal std::array, std::is_base_of usw nutzen, um mal willkürliche Beispiele zu nennen. Denn all das findet zur Compile-Zeit statt und würde viele viele Code-Zeilen sparen... aber nun ja, ist halt nicht.

Dann gibts eine ganze Reihe unglücklicher Defnitionen in der Avr-Libc. Die IO-Register Definitionen lassen sich nicht als Konstanten in Templates oder allen anderen "constexpr" Zusammenhängen verwenden.

Und noch so ein Salat:
Auf Grund eines Bugs lassen sich Interrupthändler nicht in Template-Klassen verwenden, also faktisch gar nicht. Also bastelt man immer C und C++ zusammen und das optimiert der Compiler dann auch noch sehr schlecht.

Nee, also AVR und C++ sind nicht wirklich ein glückliches Paar.

Aber ja, ein paar Zeilen C++ gehen, aber man kann halt keinerlei Features von C++ nutzen, die einem wirklich die Arbeit erleichtern würden. Es ist dann C mit Klassen und damit eigentlich C.

Gruß
Klaus


Klaus3  
Klaus3
InterCity (IC)
Beiträge: 564
Registriert am: 06.11.2015
Spurweite N
Stromart DC


RE: Arduino / AVR / Atmega328p "Lern-"Fragen

#10 von franz_H0m , 11.04.2021 17:17

Zitat

Arduino ist 'C' oder besser gesagt 'C++'. Und zwar in voller Schönheit - fast ohne Einschränkungen. Die EInschränkungen resultieren eher aus der beschränkten Leistungsfähigkeit der Prozessoren. Bei den 'besseren' sind auch die Einschränkungen kleiner. Das Ardino System deckt da durch vordefinierte Funktionen viel ab und vereinheitlicht die Handhabung verschiedener Prozessoren. Das erleichtert den Einstieg. Man kann aber auch gut 'unter die Decke' schauen - nichts ist wirklich verborgen.



Hallo Franz-Peter,

danke - offensichtlich habe ich den Eindruck erweckt einigermaßen ahnungslos zu sein, bin ich gar nicht so. Wobei ich vor allem weiss, was ich nicht weiss...

Mal sehen, wo uns das noch hinführt, meine Frage regt ja anscheinend viele Gedanken an.

Zitat

Also auf dem AVR ist C++ nur absolut minimalistisch einsetzbar!



Hallo Klaus,

danke für die Erklärungen. Ich glaube, so werde ich programmieren nicht mehr lernen. Ich verstehe die Hälfte von dem was Du schreibst (nicht). Sind STL static-link-libraries?


Grüße, Franz

Mitglied bei den Lundarallarna.
Avatar: MAN-Zugmaschine der Ottensener Industriebahn (Foto: Dr. Ullrich Huckfeld).


 
franz_H0m
InterCity (IC)
Beiträge: 552
Registriert am: 02.11.2008
Ort: Lund, Sweden
Gleise Tillig/Eigenbau
Spurweite H0m
Steuerung z21PG DCC
Stromart Digital


RE: Arduino / AVR / Atmega328p "Lern-"Fragen

#11 von Klaus3 , 11.04.2021 19:34

Zitat


Sind STL static-link-libraries?



Nee, STL steht für Standard Template Library, guckst Du hier; https://en.wikipedia.org/wiki/Standard_Template_Library

Die gehört "eigentlich" immer zu einer C++ Implementierung und macht erst den Komfort aus, den man in einer jeden Programmiersprache benötigt. Für AVR fehlt diese vollständig, nicht ein einziger Teil kann benutzt werden. Insofern kann man bei AVR auch nicht wirklich von C++ sprechen.

Zitat

Ich glaube, so werde ich programmieren nicht mehr lernen.



Aus einem Forum hat noch niemand programmieren gelernt und ganz sicher auch nicht aus einem Moba-Forum So ein Buch, so ein altmodisches, hilft ungemein

Und man kann vielleicht eine Programmiersprache lernen, aber das Programmieren kann man nicht lernen, daß kann man nur erfahren! Der Unterschied ist wichtig, denn nur beim Versuch eine Programmiersprache anzuwenden wird man Programmieren erlernen. Das ist der Unterschied zwischen Programmierern und Kodierern. Letztere findest Du in Fernost zu Dumpinglöhnen, wirkliche Programmierer eher nicht. Kodierer können fertige Algorithmen in eine Programmiersprache überführen, während ein Programmierer eine gestellte Aufgabe in einem System aus Hard- und Software zu einer anwendbaren Lösung bringt.

Gruß
Klaus


Klaus3  
Klaus3
InterCity (IC)
Beiträge: 564
Registriert am: 06.11.2015
Spurweite N
Stromart DC


RE: Arduino / AVR / Atmega328p "Lern-"Fragen

#12 von ubit , 11.04.2021 20:36

Bei all dem darf man aber nicht vergessen das auch professionelle Softwareentwicklung heute zu 90% aus der Verwendung fertiger Bibliotheken besteht... Und für viele Anwendungen, gerade auf der Moba, reicht das auch völlig.
Da spielt es dann auch keine Rolle ob man C, C++, Python oder sonstwas nutzt. Typische Projekte auf der Moba sind relativ klein und übersichtlich. Da besteht selten Bedarf an einer kompletten C++ Infrastruktur.

Ciao, Udo


ubit  
ubit
InterRegioExpress (IRE)
Beiträge: 304
Registriert am: 31.10.2012
Ort: Moers
Gleise Weinert "Mein Gleis"
Spurweite H0
Stromart DC, Digital


RE: Arduino / AVR / Atmega328p "Lern-"Fragen

#13 von Klaus3 , 12.04.2021 10:39

Zitat

Bei all dem darf man aber nicht vergessen das auch professionelle Softwareentwicklung heute zu 90% aus der Verwendung fertiger Bibliotheken besteht... Und für viele Anwendungen, gerade auf der Moba, reicht das auch völlig.
Da spielt es dann auch keine Rolle ob man C, C++, Python oder sonstwas nutzt. Typische Projekte auf der Moba sind relativ klein und übersichtlich. Da besteht selten Bedarf an einer kompletten C++ Infrastruktur.




Bemerkst Du Deinen Widerspruch?

Zitat
heute zu 90% aus der Verwendung fertiger Bibliotheken

zu

Zitat
selten Bedarf an einer kompletten C++

.

Bei AVR gibt es nicht mal die Standardbibliotheken, was das Programmieren da so verlangsamt, weil man wirklich jedes Bit von Hand einzeln anpacken muß. Wir reden nicht von "kompletter Bibliothek", wir reden von exakt 0!!! Nichts, keine einzige Funktion der STL steht zur Verfügung!

Daraus ergibt sich aber ein weiteres gravierendes Problem: Man kann heute auf allen möglichen Controllern Programmieren und die Software ist portabel. Natürlich, der Hardwarezugriff für den jeweiligen Chip nicht, alles andere schon. Nur auf AVR nicht, weil da eben 99% von C++ nicht verfügbar sind, zusätzlich die Harvard-Architektur zuschlägt, die nur mit Klimmzügen Datenzugriff direkt im Flash erlaubt. AVR ist 'ne absolute Krücke in Verbindung mit C++. Trotzdem verwende ich sie noch, weil der Rest an Infrastruktur ( Simulator und Co ) verfügbar sind, die für andere Systeme fehlt.

Zitat
Typische Projekte auf der Moba sind relativ klein und übersichtlich.



Ähhh nööö! Meine S60 Stellwerkssimulation inklusive GUI und allem drum und dran, also Fahrwegverfolgung, Busbrücken zu den diversen Controllern auf der Moba usw. ist mittlerweile ein ziemlicher Klotz geworden. Betrachtet man die Sourcen all der angeschlossenen Controller mit dazu, ist das ein ziemlich umfangreiches Software-Paket. Das doofe ist eben, daß für die Controller alles "anders" neu programmiert werden mußte, weil eben kein C++ zur Verfügung steht. Das Busprotokoll wäre Host- und Clientseitig natürlich gleich, also hätte man die selben Sourcen nehmen können. Nun aber, mußte alles in C + Klassen neu für AVR geschrieben werden. Das ist einfach sinnlos...

Gruß
Klaus


Klaus3  
Klaus3
InterCity (IC)
Beiträge: 564
Registriert am: 06.11.2015
Spurweite N
Stromart DC


   

LED 0,8 mm
?? Decoderdefekt Märklin ICE

  • Ähnliche Themen
    Antworten
    Zugriffe
    Letzter Beitrag
Xobor Einfach ein eigenes Forum erstellen
Datenschutz