Hi Leute, ich bin Anfänger was die Programmierung von µCs betrifft und brauche eure Hilfe. Ich benutze einen 8051 (SAB80C517A) und als IDE benutze ich Keil µVision3. Jetzt möchte ich z.B. eine LED mit 10 Hz blinken lassen. Das bedeutet alle 50 ms muss sich der Zustand ändern (entspricht 46083 Maschinenzyklen). Mit Assembler war das ganze kein Problem (man guckt ins Datenblatt, wie viele Maschinenzyklen die jeweiligen Befehle benötigen und baut sich dann mit Schleifen einen kleinen Algorithmus) Jetzt kommen wir zu meiner eigentlichen Frage: Wie setze ich das ganze in C um? Wie kann ich im Code sagen, dass sich der PinX alle 46083 Maschinenzyklen ändern soll? Hat jemand vllt. ein Link zu einem Tutorial parat oder kann es kurz erklären? Ich habe gegooglet und wurde nicht wirklich fündig. Habe nur herausgefunden, dass man Timer (TMOD?) und interrupts benutzen muss (aber kA wie das funktioniert). Bin für jede Hilfe dankbar.
Karsten schrieb: > Wie kann ich im Code sagen, dass sich > der PinX alle 46083 Maschinenzyklen ändern soll? Du denkst verkehrt herum. Du kannst nicht sagen, der Pin soll sich alle x Zyklen ändern, sondern alle x Zyklen kannst du eine Aktion ausführen, z.B. den Pin ändern. Was du brauchst, ist ein Timer mit Interrupt. Funktioniert in etwa so: Ein Timer ist ein interner Zähler im µC. Der zählt bei jedem Prozessortakt um eins weiter. Wenn du den genauen Takt deines µC kennst, weißt du, wie oft in einem bestimmten Zeitintervall gezählt wird. Zum Beispiel (aus der Luft gegriffen) zählt dein Timer 15000 Takte in 1 ms. Damit hast du die Verbindung zwischen Takten und realer Zeit. Das zweite Konzept das zum Einsatz kommt sind Interrupts. Das sind spezielle Funktionen, die bei bestimmten Bedingungen aufgerufen werden und deinen Code unterbrechen. Man kann einen Timer so einstellen, dass er beim Erreichen eines bestimmten Wertes (in unserem Fall bei 15000) einen Interrupt auslöst. Damit hast du also eine Funktion, die alle 15000 Takte, sprich jede ms aufgerufen wird. Wenn du nun in einer Variable die Anzahl der Interrupt-Aufrufe mitzählst, hast du schon fast eine "Stoppuhr", die dir sagt, wieviele ms der Controller läuft. Im Hauptprogramm kannst du dann mit dieser Variablen arbeiten. Sie zum Beispiel solange abfragen, bis sie deine gewünschten 100ms erreicht hat. Dann kannst du deinen Pin ändern. Schau dir mal hier das AVR-Tutorial an. Das ist zwar für AVR-Controller gemacht, aber das Prinzip ist gleich und es hilft beim Verständnis.
es gibt die Funktion delay_ms(xxx) und delay_us(yyy), die, nachdem du den CPUTakt definiert hast, so viele Wartepausen einlegt, bis die angegebene Zeit verstrichen ist. In der Forensuche und bei Google findest du mehr Infos dazu.
> es gibt die Funktion delay_ms(xxx) und delay_us(yyy)
In Keils C51? Lang ist's her, aber soweit ich mich erinnere, hatte der
das nicht.
Hallo Karsten, die "Methode Interrupt" ist mit Sicherheit die Beste für Dein Vorhaben. Ich kenne zwar nur µVision 2, da waren einige Beispiele für Interrupt gesteuerte Timer dabei. Bei der 8051-Family sind die Timerfunktionen Standard-Funktionen, also kannst Du auch bei einem "nicht Siemens Teil" aus den Beispielen fündig werden. Wie die Register heißen, verrät Dir das Datenblatt, bei der 2-er Version von µVison mußte man nur noch den richtigen Ziel-µP-Typ aussuchen und es war OK. Die Beispiele waren damals auch in der Code-begrenzten Free-Version compilierbar- warum soll das bei der µVison 3 nicht auch gehen. Ich würde einfach per Interrupt-Funktion alle 50ms ein Flag setzen, das im Hauptprogramm abfragen und die LED schalten. (Natürlich kannst Du auch die LED statt das Flag zu setzen im Interrupt toggeln - weniger schön, geht aber auch)
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.