Forum: Mikrocontroller und Digitale Elektronik Einstieg in die C-Programmerung für µC


von Torsten B. (andi638)


Angehängte Dateien:

Lesenswert?

Hallo!

Ich bin im Moment dabei ein Referat über dei C-Programmerung zu 
schrieben, leider habe ich aber nicht sehr viel Ahnung, ich kenne mich 
zwar einigermaßen mit CPP und Assembler aus, Schleifen usw sind kein 
Problem aber welche Bibliotheken ich includen muss und wie Interrupts in 
C funktionieren ist mir ein Rätsel.
Habe schon einigermaßen recherchiert aber leider finde ich nichts zu dem 
Controller den ich verwenden muss, das ist der AT89C51ED2, so ein 
datenblatt hab ich mal angehängt. Also es soll eben für einen 8051 sein.
Außerdem noch eine Frage: Muss jeden Port den ich benutze vorher auf 
Ein- oder Ausgabe schalten? Wenn ja, wie geht das?

MFG und vielen Dank!

von Lehrer (Gast)


Lesenswert?


von Torsten B. (andi638)


Lesenswert?

Danke aber hat leider auch nichts mit dem 8051 zu tun, hab ich auch 
schon einen Teil gelesen aber ist Vieles dabei mit dem ich Nichts 
anfangen kann.. :-(

von Tippgeber (Gast)


Lesenswert?

Besorg Dir eine Eval vom Keil-Compiler für den 8051 und
schau Dir die Beispiele an.

Wenn das nicht reicht gibt es von anderen Firmen
auch noch Eval-Versionen mit vielen Beispielen.
z.B. IAR Embedded Workbench for MSC-51

> aber welche Bibliotheken ich includen muss und wie Interrupts in
> C funktionieren ist mir ein Rätsel.

Das ist auch sehr vom Compiler abhängig.

Zum selber frickeln gibt es den SDCC incl. Quelle.

von einer (Gast)


Lesenswert?

Portpins die als Input arbeiten sollen müssen auf 1 gesetzt werden 
(S.15).

von Torsten B. (andi638)


Lesenswert?

einer wrote:
> Portpins die als Input arbeiten sollen müssen auf 1 gesetzt werden
> (S.15).

Also mal vielen Dank soweit, hab mit den Keil besorgt und werd nachher 
reinschauen.
Wie meinst du auf 1 setzen? Was muss ich auf 1 setzen? Seite 15 wovon?
THX

von Johannes L. (joejoe)


Lesenswert?

die 8051 treiben normal gegen GND...gegen VCC wird der Pegel nur durch 
einen Pullup gezogen. Setzt du den Pin auf 1, so kann eine externe 
Quelle den Pin auf 0 oder auf 1 ziehen ;)

von Torsten B. (andi638)


Lesenswert?

Okay gut, macht Sinn aber wie sieht das in C aus? was muss ich da Setzen 
und wie? Sorry hab keine Ahnung :-(

von hust (Gast)


Lesenswert?

1
P0SKIP  = 0x0F;    // 0000 1111 genutzt durch Xbar = 0, sperren = 1
2
P0MDIN  = 0xFF;    // 1111 1111 0 = analog (in XBar sperren), 1 = digital
3
P0MDOUT = 0x90;    // 1001 0000 push pull = 1, open drain / Eingang = 0
4
P0      = 0xFF;    // 1111 1111 Port initialisieren
5
                    // bei Eingaengen muss Px-Bit auf 1, open drain

Das ist zum Beispiel ein Teil einer Init Funktion von mir, ist aber für 
den C8051F410 von Silicon Labs. Bei dir wirds aber so ähnlich sein denk 
ich.

Erst überlegen was soll der Pin machen, dann im SFR- Register für den 
Port die richtigen Bits setzen.

von Rufus (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Torsten,
versuchs man hiermit. Eine gute Beschreibung zur Programmierung von 8051 
in C.

Gruß
Rufus

von Peter D. (peda)


Lesenswert?

hust wrote:
> Das ist zum Beispiel ein Teil einer Init Funktion von mir, ist aber für
> den C8051F410 von Silicon Labs. Bei dir wirds aber so ähnlich sein denk
> ich.

Nö, die Crossbar haben nur die Silabs.

Bei anderen 8051 muß man garnichts machen. Alle Ports sind nach Reset 
auf 0xFF (außer P0, der ist open drain).

Daher dran denken, daß die Lasten low-aktiv sind, sonst geht alles an 
nach Power-On.


Peter

von einer (Gast)


Lesenswert?

Soll sagen Seite 15 vom Handbuch AT89C51ED2.pdf

von R. W. (quakeman)


Lesenswert?

@Torsten:
Wie es aussieht scheinst du nicht viel Ahnung von der 8051er Architektur 
zu haben. Deshalb kann ich dir nur empfehlen, als erstes ein Buch zu 
dieser Controllerfamilie zu besorgen. Und wenn du die Architektur 
verstanden hast an die C-Programmierung heranzugehen. Andernfalls fällt 
es teilweise nicht leicht die Controller spezifischen Befehle zu 
verstehen.

Ich persönlich finde die Bücher auf www.c51.de sehr gut. Damit habe ich 
damals den Umstieg von Assembler auf C für die 8051er gemacht und ich 
bin damit sehr zufrieden. In manchen dieser Büchern wird vor allem 
gleich die Architektur sowie deren C Programmierung erklärt.

Ciao,
     Rainer

von Torsten B. (andi638)


Lesenswert?

Da hast du wahrscheinlich Recht, kenne mich nur soweit aus wie ich es im 
Unterricht hatte, also nichts mit Analog oder sonst was, nur eben 
Assembler mit Timer Interrupts usw aber wenig Praktisches.. Nur leider 
muss ich am freitag irgendetwas präsentieren können zu dem Thema und das 
muss eben der Einstieg in C sein, mit Interrupts und Vergleich zwischen 
Assembler und C bzw wie der Compiler C in Assembler ausgibt.

Danke an Rufus, ist zwar nicht alles so dass ich es verstehe aber hilft 
mir echt weiter.

von Torsten B. (andi638)


Lesenswert?

ok bin jetzt grad dabei das Zeugs zu schrieben, aber will ncohmal 
sichergehen: Wenn ich eine Warteschleife [z.B. for (x=0; x==1000; x++)]
wie lange wird die Zeit dann verzögert? 1000 Maschienenzyklen?

von Andreas H. (Gast)


Lesenswert?

> for (x=0; x==1000; x++)

Diese Schleife wird genau Null mal ausgeführt.

von Torsten B. (andi638)


Lesenswert?

... wieso das? ok klaro es muss <= heißen aber sonst passt alles oder?

von Andreas H. (Gast)


Lesenswert?

>> for (x=0; x==1000; x++)

>>Diese Schleife wird genau Null mal ausgeführt.

>... wieso das?

Schau' dir mal die Schleifenbedingung genau an. Diese Schleife in 
normales Deutsch übersetzt:

Setze x auf den Wert Null. Solange x gleich groß wie 1000 ist, erhöhe x 
um eins.

Wie oft ist die Schleifenbedingung wahr?

von Torsten B. (andi638)


Lesenswert?

ja klaro hab ja schon geschrieben dass es x<=1000 heißen muss...ist mir 
schon soweit klar.. aber funktioniert es dann so? Und wie lange ist die 
Verzögerung?

von Andreas H. (Gast)


Lesenswert?

>aber funktioniert es dann so? Und wie lange ist die Verzögerung?

Das kommt darauf an, welchen Mikrocontroller du benutzt. Ein 
8051-kompatibler wird für die gleiche Schleife eine andere Zeitspanne 
benötigen als ein AVR.

Um genau festzustellen, wie lange eine bestimmte Schleife dauert, musst 
du dir ansehen, wie das Assembler-Listing aussieht, das dein Compiler 
aus deinem C-Code macht. Im Datenblatt zu deinem Mikrocontroller kannst 
du dann nachlesen, wieviele Taktzyklen für welchen Assembler-Befehl 
benötigt werden.

Abhängig von der Taktfrequenz kannst du dir dann deine Schleifenzeit 
ausrechnen. Wie lange ein bestimmtes Stück C-Code braucht, hängt also 
von drei Variablen ab:

Compiler, Mikrocontroller und Taktfrequenz. Eine allgemeine Aussage kann 
man da nicht machen.

Weiters musst du beachten, dass dir dein Compiler möglicherweise Teile 
deines Codes wegoptimiert. Wenn du also z.B. eine leere Schleife 
vorsiehst in der nur die Kontrollvariable hochgezählt wird und sonst 
rein gar nichts passiert, kann es gut sein, dass der Compiler diese 
Schleife im kompilierten Programm komplett weglässt. Dann hast du exakt 
gar keine Verzögerungszeit.

von Stefan H. (abudun)


Lesenswert?

Hallo

Für die 8051er gibt es auch ein Family-Sheet bei dem z.b. die Ports 
beschrieben sind.
Leider ist das Datenblatt richtig gut versteckt und ich muss jedes mal 
aufs neue etliche Minuten suche ;-)

http://www.atmel.com/dyn/resources/prod_documents/doc4316.pdf
// der aktuelle Link zum Atmel 8051 Microcontrollers Hardware Manual

Vllt hilft dir das ja auch ein bisschen weiter

Grüsse

von Stefan H. (abudun)


Lesenswert?

>Weiters musst du beachten, dass dir dein Compiler möglicherweise Teile
>deines Codes wegoptimiert. Wenn du also z.B. eine leere Schleife
>vorsiehst in der nur die Kontrollvariable hochgezählt wird und sonst
>rein gar nichts passiert, kann es gut sein, dass der Compiler diese
>Schleife im kompilierten Programm komplett weglässt. Dann hast du exakt
>gar keine Verzögerungszeit.

Solltest du den Keil wie vorgeschlagen nützen ist es extrem 
warscheinlich dass dieser in der Std.-Einstellung leere Schleifenbodies 
wegoptimiert!!

Das Optimierungslevel kannste jedoch einstellen. Sicherste Variante ist 
ein "nop()" im Body der Schleife. Wie genau dieser Inline Assembler 
auszusehen hat bei Keil ist in der Hilfe leicht zu finden :-)

Grüsse

von Torsten B. (andi638)


Lesenswert?

Wieder mal Danke an alle!
das mit den ports müsste klappen hab mittlerweile die "reg51rd2.h" 
gefunden da sind die bereits Definiert und ich kann sie wie gewohnt 
nutzen.

Hab da aber noch eine Frage zu den Interrupts:
hab im Keil Beispielprogramm (HELLO.C) folgenden abschnitt:
1
#ifdef MONITOR51                         /* Debugging with Monitor-51 needs   */
2
char code reserve [3] _at_ 0x23;         /* space for serial interrupt if     */
3
#endif                                   /* Stop Exection with Serial Intr.   */
4
                                         /* is enabled

Im Hauptprogramm wird später der Timer Initialisiert, das ist soweit 
kein problem. Mir ist acuh klar, dass hier die stelle 0x23 freigehalten 
werden soll aber wie das funkioniert verstehe ich leider nicht. Wie muss 
ich das machen wenn ich z.b. den Timer0 (000Bh) benutzen will?

von Torsten B. (andi638)


Lesenswert?

Wird schon so passen...
aber wo genau in programm muss dieser teil stehen?

von Rufus (Gast)


Lesenswert?

Hallo Torsten,
mach es Dir doch ganz einfach, um die Verzögerungszeit zu messen:
Direkt VOR der Schleife setzt Du einen Port-Pin auf log.0, direkt NACH 
der Schleife setzt Du den Port-Pin auf log.H.
Dann schließt Du ein Oszilloskop am Port-Pin an und kannst an der Breite 
des Low-Impulses direkt die Zeitverzögerung ausmessen (+/- 1-2µs) und 
dann wunderbar mit anderen Schleifenwerten exakt einstellen.
Einfacher gehts nicht, vor allen ohne Rechnerei und ohne notwendiges 
Wissen, wie der Compiler irgendetwas übersetzt.

Gruß
Rufus

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.