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 :)
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.
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.
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);
}
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.
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.
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.
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.
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.
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!
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.
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.
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 :)
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.