mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Erster Anfang zum Programmieren


Autor: Dominik H. (super_flummy)
Datum:

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

Autor: Bascomfehler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Forum hier ist falsch.
Richtig-> µC & Elektronik.

Autor: Bascomfehler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Ist das richtig??
Ja, für PORTB

Autor: Stefan B. (stefan) Benutzerseite
Datum:

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

> 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.

Autor: Dominik H. (super_flummy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab das Board 2.01 von Pollin.

Jeder hat mal damit angefangen und ich versucht jetzt auch:-)

PORTB ist ??

Autor: Namtam (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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? ;)

Autor: Stefan B. (stefan) Benutzerseite
Datum:
Angehängte Dateien:

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

Autor: Dominik H. (super_flummy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
GND Rechts und Links am IC ist das + und -?

Autor: Stefan B. (stefan) Benutzerseite
Datum:

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

Autor: Dominik H. (super_flummy)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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!
   while(1)
     ;

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
int main()
{
  ...
}

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
int main()
{
  return 0;
}

und
int main()
{
}

sind daher gleichwertig und syntaktisch korrekt. Aber das gilt nur für
main()! Bei einer anderen Funktion
int foo()
{
}

ist das ein Fehler: Die Funktion verspricht einen int zu liefern, tut es 
aber nicht.

Autor: ich (Gast)
Datum:

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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie gesagt: In C zählt jedes Zeichen. Und Sorgfalt und 
Sich_an_Regeln_halten ist das Um und Auf in der Programmierung.
#include <avr/io.h>

int main()
{
  DDRB = 0xFF;       // alle Pins am Port B auf Ausgang schalten

  while( 1 )         // mache für immer ...
  {                  // ...nämlich was?
    PORTB = 0x04;    // am Port B  das Bitmuster für 0x04 ausgeben
                     // 0x04 == binär 00000100
                     // also wird PB2 auf 1 gesetzt, alle anderen bleiben 0
  }
}

Autor: Dominik H. (super_flummy)
Datum:

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

Autor: Dominik H. (super_flummy)
Datum:

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

Autor: pacer (Gast)
Datum:

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

Autor: Dominik H. (super_flummy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok werde mal mit Assembler anfangen.

Kennt Ihr ein sehr gutes Buch wo alle Befehle Beschrieben sind und 
erklärt?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

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

Autor: Dieter Engelhardt (netdieter) Benutzerseite
Datum:

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

Autor: Dominik H. (super_flummy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
jo danke

Autor: pacer (Gast)
Datum:

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

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.