www.mikrocontroller.net

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


Autor: Torsten B. (andi638)
Datum:
Angehängte Dateien:

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

Autor: Lehrer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Torsten B. (andi638)
Datum:

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

Autor: Tippgeber (Gast)
Datum:

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

Autor: einer (Gast)
Datum:

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

Autor: Torsten B. (andi638)
Datum:

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

Autor: Johannes L. (joejoe)
Datum:

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

Autor: Torsten B. (andi638)
Datum:

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

Autor: hust (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
P0SKIP  = 0x0F;    // 0000 1111 genutzt durch Xbar = 0, sperren = 1
P0MDIN  = 0xFF;    // 1111 1111 0 = analog (in XBar sperren), 1 = digital
P0MDOUT = 0x90;    // 1001 0000 push pull = 1, open drain / Eingang = 0
P0      = 0xFF;    // 1111 1111 Port initialisieren
                    // 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.

Autor: Rufus (Gast)
Datum:
Angehängte Dateien:

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

Gruß
Rufus

Autor: Peter Dannegger (peda)
Datum:

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

Autor: einer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Soll sagen Seite 15 vom Handbuch AT89C51ED2.pdf

Autor: R. W. (quakeman)
Datum:

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

Autor: Torsten B. (andi638)
Datum:

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

Autor: Torsten B. (andi638)
Datum:

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

Autor: Andreas H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> for (x=0; x==1000; x++)

Diese Schleife wird genau Null mal ausgeführt.

Autor: Torsten B. (andi638)
Datum:

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

Autor: Andreas H. (Gast)
Datum:

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

Autor: Torsten B. (andi638)
Datum:

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

Autor: Andreas H. (Gast)
Datum:

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

Autor: Stefan H. (abudun)
Datum:

Bewertung
0 lesenswert
nicht 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/...
// der aktuelle Link zum Atmel 8051 Microcontrollers Hardware Manual

Vllt hilft dir das ja auch ein bisschen weiter

Grüsse

Autor: Stefan H. (abudun)
Datum:

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

Autor: Torsten B. (andi638)
Datum:

Bewertung
0 lesenswert
nicht 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:
#ifdef MONITOR51                         /* Debugging with Monitor-51 needs   */
char code reserve [3] _at_ 0x23;         /* space for serial interrupt if     */
#endif                                   /* Stop Exection with Serial Intr.   */
                                         /* 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?

Autor: Torsten B. (andi638)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wird schon so passen...
aber wo genau in programm muss dieser teil stehen?

Autor: Rufus (Gast)
Datum:

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

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.