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 << ADSC)
//oder?
Und dann entsprechend:
1
2
3
4
5
bitClear (ADCSRA, ADSC);
//macht das gleiche wie
ADCSRA &= (0 << 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