mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AVR-GCC Tutorial


Autor: Andreas Klepmeir (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Falkliebhaber (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mensch Falk, du hast "MfG Falk" vergessen...tzzzzz ;-)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.