Forum: Mikrocontroller und Digitale Elektronik x Maschinenzyklen mit C-Code


von Karsten (Gast)


Lesenswert?

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.

von Lord Z. (lordziu)


Lesenswert?

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.

von Kevin K. (nemon) Benutzerseite


Lesenswert?

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.

von Hc Z. (mizch)


Lesenswert?

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

von M. B. (reisender)


Lesenswert?

Wozu zu sagen wäre, dass die erste Methode zu bevorzugen ist.

von Alter Hase (Gast)


Lesenswert?

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