Forum: Mikrocontroller und Digitale Elektronik AVR-GCC Tutorial


von Andreas Klepmeir (Gast)


Lesenswert?

Morgen!
Nachdem ich mich grad durch das Tutorial arbeite und bei den Interups 
angekommen bin (feine Sache wenn man vorher auf Borland C++ Builder 
gearbeitet hat) sind mir da zwei "Schwierigkeiten" aufgefallen:

Zuerst mal ein Stolperstein:
Im Tutorial wird Bezug genommen auf die "alten" AT90xxx, dort werden die 
Interups INT0 und INT1 im Register GIMSK gesetzt, das Register gibts 
aber bei den ATMega xxx nicht mehr, da heisst es dann GICR.

Danach noch ein Problem: Um die Interrups zu nutzen muss man ja Bit 7 
(Global Interrupt Enable) im Register SREG setzen, laut Datenblatt wird 
dieses Bit mit "I" bezeichnet, aber mit I als Konstante lässt sich der 
Code nicht Compilieren.
Heisst:
SREG |= (1<<I); //klappt nicht, Errordings
SREG |= (1<<7); //So klappts, muss man aber erst mal drauf kommen.


Zum Schluss noch etwas (hoffentlich) konstruktive Kritik:
Dieses doofe Bytegeschiebe ist meiner Meinung nach mit Abstand das 
umständlichste beim Umstieg von C/C++ auf diese Mikrocontroller..
Wär nicht schlecht wenn man darauf Anfangs beim Tutorial ein bisschen 
tiefer darauf eingehen kann, aber das sollten besser Profis schreiben, 
Bitschieben ist nicht meine Stärke. Braucht man auf dem PC auch nicht 
wirklich oft, in C++ hab ich ja meinen bool-Datentyp.

Ansonsten schönes Tutorial, stramm gehalten, aber is ja auch kein 
C-Tuorial.

von Johannes M. (johnny-m)


Lesenswert?

Andreas Klepmeir wrote:
> Danach noch ein Problem: Um die Interrups zu nutzen muss man ja Bit 7
> (Global Interrupt Enable) im Register SREG setzen, laut Datenblatt wird
> dieses Bit mit "I" bezeichnet, aber mit I als Konstante lässt sich der
> Code nicht Compilieren.
> Heisst:
> SREG |= (1<<I); //klappt nicht, Errordings
> SREG |= (1<<7); //So klappts, muss man aber erst mal drauf kommen.
Dafür gibt es die Pseudo-Funktion sei() aus der interrupt.h. Vom SREG 
selber sollte man als C-Programmierer i.d.R. die Finger lassen! 
Manipulationen können unerwünschte Folgen haben. sei() und sein 
Gegenstück cli() fügen jeweils direkt den entsprechenden 
Assembler-Befehl ein. Da kann dann auch nicht viel schief gehen. 
Abgesehen davon sind sei() und cli() atomar, die o.a. Variante aber 
nicht.

Müsste aber auch alles im Tutorial stehen...

> Bitschieben ist nicht meine Stärke. Braucht man auf dem PC auch nicht
> wirklich oft, [...]
Klar, auf dem PC programmiert man ja auch weit entfernt von der Hardware 
und muss keine Low-Level-Konfigurationen machen...

> [...] in C++ hab ich ja meinen bool-Datentyp.
Wenn man so viel Speicher zur Verfügung hat, dass man für jedes Flag ein 
ganzes Byte oder evtl. sogar mehr opfern kann, dann kann man bool auch 
auf µCs verwenden... Oder eine Implementation "bauen", wie es bei 
kommerziellen Embedded-Compilern oft gemacht wird, indem man mit Hilfe 
von Makros so tut, als würde man auf einzelne Bits zugreifen, und der 
Compiler macht im Hintergrund die entsprechende Schieberei, ohne dass 
der Programmierer da viel von mitbekommt.

von Falk B. (falk)


Lesenswert?


von Falkliebhaber (Gast)


Lesenswert?

Mensch Falk, du hast "MfG Falk" vergessen...tzzzzz ;-)

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.