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!
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.. :-(
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.
Portpins die als Input arbeiten sollen müssen auf 1 gesetzt werden (S.15).
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
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 ;)
Okay gut, macht Sinn aber wie sieht das in C aus? was muss ich da Setzen und wie? Sorry hab keine Ahnung :-(
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.
Hallo Torsten, versuchs man hiermit. Eine gute Beschreibung zur Programmierung von 8051 in C. Gruß Rufus
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
@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
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.
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?
> for (x=0; x==1000; x++)
Diese Schleife wird genau Null mal ausgeführt.
... wieso das? ok klaro es muss <= heißen aber sonst passt alles oder?
>> 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?
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?
>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.
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
>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
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?
Wird schon so passen... aber wo genau in programm muss dieser teil stehen?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.