Forum: Mikrocontroller und Digitale Elektronik Erster Anfang zum Programmieren


von Dominik H. (super_flummy)


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

von Bascomfehler (Gast)


Lesenswert?

Das Forum hier ist falsch.
Richtig-> µC & Elektronik.

von Bascomfehler (Gast)


Lesenswert?

>Ist das richtig??
Ja, für PORTB

von Stefan B. (stefan) Benutzerseite


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

von Dominik H. (super_flummy)


Lesenswert?

Hab das Board 2.01 von Pollin.

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

PORTB ist ??

von Namtam (Gast)


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? ;)

von Stefan B. (stefan) Benutzerseite


Angehängte Dateien:

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.

von Dominik H. (super_flummy)


Lesenswert?

GND Rechts und Links am IC ist das + und -?

von Stefan B. (stefan) Benutzerseite


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

von Dominik H. (super_flummy)


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

von Karl H. (kbuchegg)


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

von ich (Gast)


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

von Stefan B. (stefan) Benutzerseite


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

von Karl H. (kbuchegg)


Lesenswert?

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
}

von Dominik H. (super_flummy)


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

von Dominik H. (super_flummy)


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

von pacer (Gast)


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.

von Dominik H. (super_flummy)


Lesenswert?

Ok werde mal mit Assembler anfangen.

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

von Karl H. (kbuchegg)


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.

von Karl H. (kbuchegg)


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.

von Stefan B. (stefan) Benutzerseite


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

von Dieter E. (netdieter) Benutzerseite


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

von Dominik H. (super_flummy)


Lesenswert?

jo danke

von pacer (Gast)


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_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
Noch kein Account? Hier anmelden.