www.mikrocontroller.net

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


Autor: Karsten (Gast)
Datum:

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

Autor: Lord Ziu (lordziu)
Datum:

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

Autor: Kevin K. (nemon) Benutzerseite
Datum:

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

Autor: Hc Zimmerer (mizch)
Datum:

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

Autor: M. B. (reisender)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wozu zu sagen wäre, dass die erste Methode zu bevorzugen ist.

Autor: Alter Hase (Gast)
Datum:

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

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.