Forum: Mikrocontroller und Digitale Elektronik Atmel Befehlssatz


von Matze (Gast)


Lesenswert?

Guten Abend

Ich lerne seid einiger Zeit das Programmieren von Microcontrollern in 
meiner Schule und bin nun soweit das ich Zuhause mein erstes kleines 
Projekt aufbaue.

Mein Problem ist eigentlich recht "grundsätzlich"

Wir Programmieren in der Schule einen 8051 von Atmel mit der Software 
RIDE7
Zuhause habe ich einen ATTINY13 und ich habe mir die Software Atmel 
Studio 6.2 geladen.
Wir Programmieren in C

In der Schule werden uns für Problemstellungen die Bibliotheken 
vorgegeben...
Nun möchte ich gerne einmal wissen mit welcher bibliothek, die man mit 
#include einbindet, man welche Befehle benutzen kann.
Gibt es für C Listen die sowas beinhalten. Im Datenblat steht das ne 
Tabelle für Assambler...aber die hilft mir leider nicht.

Bitte korregiert mich wenn ich falsch liege...
Die Programmsprache C ist doch Standartisiert.

z.B können wir bei RIDE durch einfügen einer bibliothek einzelne 
Ausgänge schalten "P3_7"
oder wir defenieren den benutzten Port nie als Eingang oder Ausgang. Ich 
habe schon mal gesehen das andere das machen müssen.
oder uns steht eine sogenante "delay" Funktion beim 8051 nicht zur 
verfügung aber die ATTINY sollen sowas können. Das muss ja auch irgendwo 
stehen welche bibliothek man einfügen muss um einen "delay" befehl zu 
benutzen. Dort sollte dann auch die korekte Syntax stehen ^^

Ich hoffe ihr könnt in etwa nachvollziehen wo mein Problem liegt.

Mein Programm was ich eigentlich schreiben möchte soll eine LED nur 
blinken lassen. Das ist ja im Grunde nicht schwer.
Die oben genannten Punkte sind mit aufgefallen als ich im Netz dann 
diesen CODE für das Atmel Studio fand.

#define F_CPU 20000000UL
#include <util/delay.h>
#include <avr/io.h>

int main(void)
{
    DDRD=0b01100000;
  while(1)
    {


    PORTD=0b01111111;
    _delay_ms(10);
    PORTD=0b00000000;
    _delay_ms(10);



    }
}

Danke im Vorraus :)

von Hellseher (Gast)


Lesenswert?

Matze schrieb:
> Danke im Vorraus :)

Wofür? Was willst Du eigentlich wissen?

von Christian K. (the_kirsch)


Lesenswert?

Bezüglich AVR

Jedes Hardwareregister (nachzuschlagen im Datenblatt) wird über die 
AVR-Lib als gleichnamiger Variable (ein Pointer) zur Verfügung gestellt, 
um darüber lesend und schreibend zuzugreifen.

Es gibt die C-STD-Lib, die es quasi für alle Plattformen gibt. Must du 
mal googlen.

Natürlich fehlen beim AVR z.B. die Funktionen für Datei- und Konsolen 
ein und Ausgabe, da der AVR sowas nicht hat.

von Nil (Gast)


Lesenswert?

Jetzt nimmst du dir erstmal ein C-Buch und liest genau nach was es mit 
dem include auf sich hat.
Dann schaust du dir die Unterschiede zwischen den AVR und dem 8051 an 
(besonders die Unterschiede im Bereich I/O). Dann wird dir schon klar 
warum du beim 8051 nirgends "einstellen" musst, ob der entsprechende Pin 
als Eingang oder Ausgang arbeiten soll.

von Lothar (Gast)


Lesenswert?

Matze schrieb:
> Wir Programmieren in der Schule einen 8051 von Atmel

Warum der Umstieg auf AVR es gibt eine große Auswahl von 8051 nicht nur 
von Atmel. Zudem werden die 8051 mit Bootloader ausgeliefert so dass 
kein teurer Programmer erforderlich ist, nur USB-seriell-Kabel.

Matze schrieb:
> uns steht eine sogenante "delay" Funktion beim 8051 nicht zur
> verfügung aber die ATTINY sollen sowas können

Beim 8051 nimmt man üblicherweise einen globalen Timer als Zeitbasis 
z.B. 100 us dann ist z.B. 1 ms 10 ticks. Man kann aber auch grob ein 
delay machen und die Laufzeit messen bis es passt:

void delay(volatile unsigned short cnt)
{
  while (--cnt);
}

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Christian K. schrieb:
> Jedes Hardwareregister (nachzuschlagen im Datenblatt) wird über die
> AVR-Lib als gleichnamiger Variable (ein Pointer) zur Verfügung gestellt

Das ist nicht ganz korrekt. Hier ist keine "AVR-Lib" im Spiel, das sind 
alles nur Deklarationen in einer Headerdatei.

Die #include-Anweisung bindet keine Libraries ein, sondern 
Headerdateien. Und Headerdateien sind keine Libraries.

Eine Headerdatei enthält Macros (#define-Anweisungen) und Deklarationen, 
d.h. Funktionsprototypen, was so viel heißt, "Die Funktion heißt X, hat 
Argumente Y und den Rückgabewert Z".

Eine Library ist hingegen eine Sammlung bereits compilerter 
Funktionen, die vom Linker je nach Bedarf zum Programm hinzugefügt 
wird.

Ein Beispiel dafür ist die libm, die mathematische Funktionen wie 
sin/cos enthält.

Libraries und Headerdateien kommen oft als Paar - in der Headerdatei ist 
lesbar beschrieben, was in der Library enthalten ist.

Um aber eine Library zu verwenden, genügt es nicht, nur die 
Headerdatei mit einer #include-Anweisung einzubinden, sondern sie muss 
dem Linker als Kommandozeilenargument übergeben werden. Das macht 
entweder die Projektverwaltung der verwendeten IDE oder aber, 
beispielsweise bei gcc, die Angabe des Parameters -l in der 
Kommandozeile mit dem abgekürzten Namen der Library (-lm für libm.a).
Das aber ist compiler- bzw. linkerspezifisch, andere Systeme nutzen 
andere Kommandozeilenparameter und andere Namenskonventionen für 
Libraries.


Um auf den Ausgangspunkt zurückzukommen:
Um auf Hardwareregister des AVR zugreifen zu können, genügen die 
#define-Anweisungen in der jeweiligen Headerdatei, hier ist keine 
Library beteiligt.

von Peter D. (peda)


Lesenswert?

Matze schrieb:
> oder wir defenieren den benutzten Port nie als Eingang oder Ausgang.

Im standard 8051 gibt es das nicht, da sind Portpins auf high, d.h. mit 
pullup auch als Eingang nutzbar.
Einige 8051 können aber auch auf push/pull Ausgang konfiguriert werden.

Es gibt standard Libs, die muß jeder C-Compiler enthalten. Bei manchen 
freien Demoversionen ist neben der Codebeschränkung auch keine float-Lib 
enthalten.

Daneben ist für jedes Derivat noch eine Register-Lib enthalten, die die 
Hardware-Bits und -Bytes bekannt macht.

Bei den AVRs sind noch Libs enthalten, z.B. für Delay, Watchdog, EEPROM, 
die kein Standard sind.

von Stefan F. (Gast)


Lesenswert?

Die Doku der AVR Library findest du hier: 
http://de.wikipedia.org/wiki/Byte-Reihenfolge

Darüber hinaus stehen Dir alle Register des jeweiligen Chips zur 
Verfügung. Deren Namen stehen im Datenblatt.

Die Namen der Registe werden durch die io.h bereit gestellt:
1
#include <avr/io.h>

Schau da mal rein, dann wirst du sehen, dass diese Datei wiederum auf 
andere *.h Dateien verweist, je nach eingestelltem Chip Typ.

Du könntest für den Atmega8 auch schreiben:
1
#include <avr/mega8.h>

Aber dann müsstest du den Source-Code auf jeden Fall ändern, sobald du 
auf einen anderen Chip wechselst.

von Bitflüsterer (Gast)


Lesenswert?

Matze schrieb:
> Nun möchte ich gerne einmal wissen mit welcher bibliothek, die man mit
> #include einbindet, man welche Befehle benutzen kann.
> Gibt es für C Listen die sowas beinhalten. Im Datenblat steht das ne
> Tabelle für Assambler...aber die hilft mir leider nicht.

Zu jeder Biblothek gehört eine Dokumentation, welche Funktionen in ihr 
enthalten sind und auf welche Weise man sie verwendet. In Ausnahmefällen 
gibt es so eine Dokumentation nicht als selbstständige Datei (Word, PDF 
o.ä.) sondern die Beschreibung ist in der C-Datei enthalten, aus der die 
Bibliothek erzeugt wird.
Übrigens nennt man die "Befehle" in Bibliotheken nicht Befehle sondern 
"Funktionen". Es gibt z.B. Assembler-Befehle.

> Bitte korregiert mich wenn ich falsch liege...
> Die Programmsprache C ist doch Standartisiert.
Das Wort heißt übrigens "standardisiert", mit 'd' statt mit 't'.
Der Standard der Sprache C, beschreibt die Syntax und die Semantik der 
Sprache selbst und einige Bibliotheken. Aber nicht alle Bibliotheken.

> z.B können wir bei RIDE durch einfügen einer bibliothek einzelne
> Ausgänge schalten "P3_7"
Dann ist das so eine besondere Bibliothek, die evtl. (ich weiss es 
nicht konkret) mit RIDE zusammen geliefert und installiert wird - 
jedenfalls gehört sie nicht zum Standard.

> oder wir defenieren den benutzten Port nie als Eingang oder Ausgang. Ich
> habe schon mal gesehen das andere das machen müssen.
Wie schon von anderen Antwortetn erwähnt, hängt das vom Prozessor ab. 
Beim AVR stehen die Ports vom Reset an auf dem Zustand Eingang.

> oder uns steht eine sogenante "delay" Funktion beim 8051 nicht zur
> verfügung aber die ATTINY sollen sowas können. Das muss ja auch irgendwo
> stehen welche bibliothek man einfügen muss um einen "delay" befehl zu
> benutzen. Dort sollte dann auch die korekte Syntax stehen ^^
Die Syntax ist Teil des C-Standards und kann nicht geändert werden. 
Die Syntax beschreibt, in welcher Weise die Zeichen so kombiniert werden 
können, dass das Ergebnis ein Ausdruck der Sprache C ist. Mehr nicht. 
Was aber beschrieben ist, sind der Typ und Bedeutung des Rückgabewertes 
und Anzahl, Typ und Bedeutung der Parameter.

Eine /_delay_ms/-Funktion ist in der avrlibc enthalten - die übrigens 
nicht Teil des C-Standards ist sondern mit dem gcc für AVR 
mitgeliefert wird (so wie die oben schon erwähnte mit RIDE). Leider ist 
es so, dass Du Dir diese Information für jede Bibliothek einzeln 
heraussuchen musst. Es gibt kein zentrales Dokument dafür. Allerdings 
ist diese Beschreibung z.B. für die avrlibc enthalten wenn Du Dir das 
AVRStudio bzw. den gcc installierst. Beachte aber bitte, dass es 
Bibliotheken gibt, die nicht Teil eines Compiler-Paketes sind.

Ich hoffe, dass hilft Dir erstmal ein wenig weiter. Viele Aspekte haben 
ja auch schon die anderen Antworter abgedeckt.

von Christian K. (the_kirsch)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Das ist nicht ganz korrekt. Hier ist keine "AVR-Lib" im Spiel, das sind
> alles nur Deklarationen in einer Headerdatei.

Auch wenn die "Lib" nur aus Headerdateien besteht (und keinen Quellcode 
oder Vorkompilierten Code enthält) ist es für mich eine Library, da sie 
die Hardware spezifischen Eigenschaften über Defines und Makros für den 
Programmierer besser zugänglich macht.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Christian K. schrieb:
> Auch wenn die "Lib" nur aus Headerdateien besteht (und keinen Quellcode
> oder Vorkompilierten Code enthält) ist es für mich eine Library, da sie
> die Hardware spezifischen Eigenschaften über Defines und Makros für den
> Programmierer besser zugänglich macht.

Auch wenn Nudeln eigentlich nur aus Teig bestehen, ist es für mich 
Apfelkuchen, weil Nudeln auch zum Essen sind.

Sag mal, merkst Du was? Wenn Du alles im Leben einfach umbenennst, weil 
es Dir dann besser passt, wirst Du kaum noch mit jemandem kommunizieren 
können.

Heute klasse Schokolade! Keine Waffeln am Himmel!

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Frank hat das jetzt etwas provokant ausgedrückt, aber wo er Recht hat, 
hat er Recht.

Was eine Library ist, ist ganz klar definiert. Deine Interpretation

> ist es für mich eine Library, da sie die Hardware spezifischen
> Eigenschaften über Defines und Makros für den Programmierer besser
> zugänglich macht.

ist falsch.

von Peter II (Gast)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Was eine Library ist, ist ganz klar definiert. Deine Interpretation

ist es das? Was ist mit der STL die teilweise nur aus Headern besteht.

von Matze (Gast)


Lesenswert?

Hey Leute
Danke erstmal für die Zeit die sich jeder hier genommen hat.

Ich stimme dem zu das ich noch viel zu lernen und zu lesen habe ;D

So wie sich das anhört unterscheidet sich der C Code wohl etwas von 
einander, wenn man unterschiedliche Entwicklungsumgebungen nimmt. Kann 
man das so sagen? Da steckt dann wohl der jeweilige Hersteller hinter 
oder?

Wie man an den richtigen Code kommt um z.B beim Atmel Studio einen 
Ausgang setzt oder anderen Code in die richtige Syntax bekommt habe ich 
noch nicht so richtig verstanden. Habe schon mal im Netz nach einen 
Datenblatt von Atmel Studio 6 gesucht und schon in ein paar pdf s 
geblättert.

Eine Frage die mich nun beschäftigt wäre nochmal die Definition 
bezüglich der LIBs. Was dort nun genau hinter steckt. Sind das nicht 
schlicht Wörterbücher die dem Compiler unseren getippten Code 
verständlich machen.
Deswegen muss man doch die LIBs einfügen um bestimmte CODEs zu 
verwenden.
Bitte um detalierte Verbesserung;D

Achja wenn es den Rahmen nicht sprengt was ist den bei der 
Mikrocontroller programmierung der unterschied von C und C++ ?

Ich danke euch allen schonmal für jede Antwort :)

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Peter II schrieb:
> ist es das? Was ist mit der STL die teilweise nur aus Headern besteht.

Das ist C++, andere Baustelle. Denn dort ist es üblich, Code auch in 
Headerdateien unterzubringen. Der Begriff "Library" wird dort weiter 
gefasst, im engen technischen Sinne ist auch bei der Verwendung von C++ 
nur das eine Library, was dem Linker vorgeworfen wird und (bei 
Verwendung von gcc & Co.) auf .a endet.

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.