Hallo, Hab jetzt mein Board bekommen und angefangen das Tutorial AVR zu lesen. Das einzige das ich bis jetzt verstanden habe ist das es das Programm mit main anfängt, und man mit DDRB=0xff; alle Pins auf Ausgang stellt. Ist das richtig?? Ich hoffe ihr könnt mir das so ein bisschen erkläre, da ich mir dem gut beschriebenen Tutorial nicht so ganz mit komme:-) MFG Dominik
Dominik H. wrote: > Hab jetzt mein Board bekommen und angefangen das Tutorial AVR zu lesen. Aha. Welches Board hast du denn? > Das einzige das ich bis jetzt verstanden habe ist das es das Programm > mit main anfängt, und man mit DDRB=0xff; alle Pins auf Ausgang stellt. > > Ist das richtig?? Ja. Die Bedeutung der Funktion main() ist in jedem C-Lehrbuch oder C-Kurs ganz ganz vorne erklärt. Im AVR-GCC-Tutorial wird dieses C Grundwissen vorausgesetzt. Die Bedeutung von DDRB ist im Datenblatt des verwendeten Mikrocontrollers erklärt. Was dort steht gilt. Bei AVRs stimmt deine Verständnis von DDRB=0xff; im grossen ganzen jedenfalls. Es werden nur die Pins an PORTB auf Ausgang gesetzt. Es gibt auch andere PORTs. Die sind durch diese Anwesiung nicht betroffen. Du merkst: In der µC Welt kommt es auf Feinheiten an. Was man in der Umgangssprache vermeidet, ist hier fast Pflicht. Jede Beschreibung, jede Anweisung ist auf die Goldwaage zu legen, weil der µC stur das macht (oder nicht), was man programmiert. http://de.wiktionary.org/wiki/jedes_Wort_auf_die_Goldwaage_legen > Ich hoffe ihr könnt mir das so ein bisschen erkläre, da ich mir dem gut > beschriebenen Tutorial nicht so ganz mit komme:-) Konkrete Fragen geben konkrete Anworten. Vielleicht helfen die Frage/Antworten auch das Tutorial zu verbessern. Aber das ganze Tutorial anders zu erklären, ist vertane Zeit.
Hab das Board 2.01 von Pollin. Jeder hat mal damit angefangen und ich versucht jetzt auch:-) PORTB ist ??
PORTB ist Port B ^^ Einer von mehreren Ports mit Ein- und Ausgängen, mit denen man arbeiten kann. Hast du dich grundsätzlich schon mit den Grundbegriffen der Programmierung vertraut gemacht? ;)
Dominik H. wrote:
> PORTB ist ??
In diesem Fall eine mit Ein/Ausgabe I/O (oder anderen) Funktionen
belegteGruppe von Pins. Sie sind im Datenblatt entsprechend benannt
PB0...PB7 (s. Anhang) und beschrieben.
Du hast jetzt noch 998 Fragen frei.
Nein. GND ist zweimal da. Einmal als Bezugspunkt für die reguläre Betriebsspannung Vcc und einmal als Bezugspunkt für die Betriebsspannung für den AD-Wandler (AVcc). 997
Also um mal sehr sehr sehr klein anzufangen möchte ich das wenn ich einen Taster drücke das Programm Startet und immer wieder von neuem anfängt. ( Lauflicht ) Taster = Start LED1 = An LED2 = An, LED1 Aus und so weiter, 4 Kanal. Ich hab jetzt mal so angefangen: int main (void) DDRB = 0xff; PORTB = 0x4; while (1) return 0; Das hab ich mal im Tutorial verstanden. int main (void) (heißt Anfang des Programms) DDRB = 0xff; (heißt alle Ports sind Ausgänge) PORTB = 0x4; (Wert der Ausgänge dar) while (1) (heißt Programmschleife die wiederholt wird. Da es leer ist immer wider von Vorne) return 0; ist das Programm ende. Alles so richtig ???
Dominik H. wrote: > Also um mal sehr sehr sehr klein anzufangen möchte ich das wenn ich > einen Taster drücke das Programm Startet und immer wieder von neuem > anfängt. Falsch. Dein Programm läuft, sobald der Prozessor Strom kriegt. > while (1) (heißt Programmschleife die wiederholt wird. Da es leer ist > immer wider von Vorne) Das ist nur die Schleifenbedingung. Aber was ist der Schleifenrumpf. In C zählt jedes Zeichen!
1 | while(1) |
2 | ;
|
Mache endlos, also immer wieder ... nämlich nichts (das ist mehr oder weniger die Bedeutung des einsamen ; in der nächsten Zeile. Er stellt eine leere Anweisung dar) > > return 0; ist das Programm ende. Wie kann ein Programm enden, wenn kurz davor eine Endlosschleife ist, aus der der Prozessor nicht mehr herauskommt? Ist ungefähr so, wie wenn du den Befehl bekommst: Mache irgendwas bis ans Ende des Universums und gleich danach gehst du zu Bett :-) Das return hier ist eigentlich nicht notwendig, weil es nie erreicht wird. Nun ist es aber so, dass bei der Funktionsdefinition von main() ein Returntyp von int angegeben wurde
1 | int main() |
2 | {
|
3 | ...
|
4 | }
|
d.h. hier wurde die Zusicherung gemacht, dass die Funktion einen int liefern wird. (So wie zb. die Funktion 'Sinus' ebenfalls einen Zahlenwert liefert. Drum kann man ja auch schreiben x = sin(y);) Eine Funktion, die eine derartige Zusicherung macht, muss daher auch einen int liefern, selbst dann, wenn sie in einer Endlosschleife hängt :-) Und die Angabe eines Returnwerts erfolgt nun mal mittels return Allerdings gibt es für main() eine Ausnahme. Auch wenn main() als int definiert ist, so muss man nicht unbedingt selbst einen return schreiben. Ist keiner angegeben, dann muss sich der Compiler selbst ein return 0; dazudenken
1 | int main() |
2 | {
|
3 | return 0; |
4 | }
|
und
1 | int main() |
2 | {
|
3 | }
|
sind daher gleichwertig und syntaktisch korrekt. Aber das gilt nur für main()! Bei einer anderen Funktion
1 | int foo() |
2 | {
|
3 | }
|
ist das ein Fehler: Die Funktion verspricht einen int zu liefern, tut es aber nicht.
Schnegge man kann nur eins mit einmal machen. -Erstens man kann C und möchte sich näher mit Mikrocontrollern Beschäftigen. -Zweitens man hat Ahnung von Mikrocontrollern und möchte diese jetzt mit C programmieren. Aber man kann C nicht mit Mikrocontrollern lernen, wenn man von denen keinen blassen Schimmer hat !!!! Lern C am Computer und setzt dich dann mit Mikrocontrollern auseinander. Deine Operation ist zum scheitern verurteilt. Es kommt nur Quark raus. Oder du stotterst die mit irgendwelchen C-Fetzen irgend was zusammmen....
> Alles so richtig ???
Nein. Der C Compiler wirft dir das um die Ohren. Probiere es aus.
Die Zahl der {} in deinem Programm ist NULL. Das ist sehr untypisch für
ein funktionierendes C-Programm. Es fehlt auch das lebensnotwendige
#include <avr/io.h> damit der C Compiler überhaupt weiss was DDRB und
PORTB sind...
Wenn du die LED1 und LED2 und die Taster vom Pollin-Board nutzen willst,
musst du dich mit DDRD und PORTD und PIND befassen. PORTB bringt da
nichts.
Den Taster würde ich erst im nächsten Programm einbauen. Vielleicht
magst du mal in die Artikelsammung schauen, was dort unter dem
Suchbegriff Pollin zu finden ist.
996
Wie gesagt: In C zählt jedes Zeichen. Und Sorgfalt und Sich_an_Regeln_halten ist das Um und Auf in der Programmierung.
1 | #include <avr/io.h> |
2 | |
3 | int main() |
4 | {
|
5 | DDRB = 0xFF; // alle Pins am Port B auf Ausgang schalten |
6 | |
7 | while( 1 ) // mache für immer ... |
8 | { // ...nämlich was? |
9 | PORTB = 0x04; // am Port B das Bitmuster für 0x04 ausgeben |
10 | // 0x04 == binär 00000100
|
11 | // also wird PB2 auf 1 gesetzt, alle anderen bleiben 0
|
12 | }
|
13 | }
|
while( 1 ) // mache für immer ... { // ...nämlich was? (heißt das was unten steht? PORTB) PORTB = 0x04; Ist das richtig Da hab ich mir aber was eingebrogt.:-))
am Port B das Bitmuster für 0x04 ausgeben // 0x04 == binär 00000100 Bitmuster für 0x04 ist??? binär 00000100 Heißt was? Ich hoff ich geh euch nicht auf den Seckel
wie schon jemand festgestellt hat, keine Ahnung von C und keine Ahnung von Mikrocontrollern. Da reichen die 997 freien Fragen gar nicht aus. Versuch es mal in Assembler, hier gibt es sehr gute Tutorials die von gaaanz klein anfangen. Außerdem ist Assembler leichter zu lernen. Aber du kannst natürlich weiterhin ausprobieren wie geduldug die Leute hier sind. Übrigens enspricht jeder Stelle im Bitmuster genau ein Pin eines Ports in deinem Fall sollte dann Pin 2 (PB2) auf high gehen.
Ok werde mal mit Assembler anfangen. Kennt Ihr ein sehr gutes Buch wo alle Befehle Beschrieben sind und erklärt?
Möchte mich anschliessen. So hat das wenig Sinn. Geh in die nächste Buchhandlung und besorg dir einführende Literatur zum Thema 'Programmieren in C'. Dann übst du mal auf einem PC (!) erste Programmierschritte. Und dann, nach einem halben Jahr, wenn du ein wenig Erfahrung in der Programmierung hast, wechselst du dann nochmal auf einen µC. Aber so hat das wenig Sinn. Keiner hier wird dir die ersten 50 Seiten eines C-Lehrbuches hier auseinandersetzen und haarklein erzählen. Zum einen steht das eh in besagten Buch drinnen, zum anderen können wir das hier nicht ausführlich genug in der Kürze der Zeit vorbringen. Da ist jedes Lehrbuch eindeutig besser, an dem der Autor jahrelang gefeilt hat und unzählige Leute Korrektur gelesen haben, damit nur ja alles in sich stimmig und logisch vom Einfachen zum Schwierigen aufgebaut ist.
Dominik H. wrote: > Ok werde mal mit Assembler anfangen. > > Kennt Ihr ein sehr gutes Buch wo alle Befehle Beschrieben sind und > erklärt? Wonach du verlangst ist eine Befehlsübersicht. Ist ungefähr so, als ob du sagen würdest, du möchtest gerne Chinesisch lernen und alles was du dazu brauchst ist ein Wörterbuch Deutsch-Chinesisch. Denn dort sind auch alle Wörter drinn beschrieben. Damit kannst du nichts anfangen. Was dir fehlt ist auch der zusammenhaltende Kit. Angefangen von Zahlensystemen, bis hin zu typischen Lösungsstrategien. Drum bin ich auch mit dem Vorschlag, das ganze mal in Assembler zu programmieren, nicht wirklich glücklich. Du musst dort nämlich noch viel mehr auf all die unzähligen Details aufpassen als in C, wo dir der Compiler schon mal viele Fallstricke abnimmt. Aber lass dich nicht abhalten. Das AVR-Tutorial hier auf dieser Seite ist nicht schlecht.
Dominik H. wrote: > while( 1 ) // mache für immer ... > { // ...nämlich was? (heißt das was unten steht? > PORTB) > PORTB = 0x04; > > Ist das richtig Nein. Der Vorschlag von Karl heinz Buchegger war richtig. Du hast ihn kaputt gemacht. Ich erinnere an das Posting bzgl. den {}... > Bitmuster für 0x04 ist??? 00000100 > binär 00000100 Heißt was? Bit7 bis Bit3 0, Bit2 1, Bit1 bis Bit0 0. > Kennt Ihr ein sehr gutes Buch wo alle Befehle Beschrieben sind Von Atmel gibt es die Beschreibung als AVR Instruction Set als PDF. > und erklärt? Nein, von denen auf dem Markt kenne ich keines selbst. 993
Ich würde Dir auch dringend raten, erst mal ein solides Fundament zu schaffen. Such Dir einfach hier was aus: http://www.onlinetutorials.de/c-index.htm Und schreib erst mal ein Hello-World. Viel Glück damit, netdieter
Ich würde immer noch raten mit Assembler anzufangen. Das hat den Vorteil, dass man den MC besser kennenlernt und auch versteht wie man addiert, dividiert usw. Für den Einstieg mit Assembler braucht man nicht viel. Es reicht im Prinzip das AVR Studio aus. Mit C ist das nicht mehr so einfach. Klar, man kann auch mit C am Computer anfangen, aber wer MCs programmieren will muss dann einen langen Atem haben. Die Befehlsreferenz und bie Beschreibung des AVRs sollte man sich genau anschauen, notfalls mehrmals lesen. Da ich ebenfalls Anfänger bin, spreche ich sozusagen aus Erfahrung. Das Problem ist natürlich, dass man später nicht um C herum kommt. Eine Alternative wäre noch Bascom, eine basicähnliche Sprache. Im Robotikforum arbeite sehr viele Leute damit. Ein gutes Buch ist mir bisher noch nicht untergekommen, ich hab mir mal eins gekauft, war aber schrecklich. Das Internet bietet schon einiges, hier zB: http://www.roboternetz.de/wissen/index.php/AVR_Assembler_Einf%C3%BChrung
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.