www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Verständnisfrage C-Code


Autor: Alexander (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!
Ich bin gerade dabei, den folgenden C- Code zu verstehen, dabei bin ich 
auf ein kleines Problem gestoßen, wo mir auch google nicht wirklich 
weiterhelfen konnte.

Es geht um diesen Code:
volatile register unsigned char PWM_BYTE_ON asm("r16");   // preserve r16 for pwm_data_on
volatile register unsigned char PWM_BYTE_OFF asm("r17");  // preserve r17 for pwm_data_off

//ISR ROUTINES

ISR(TIMER2_COMP_vect, ISR_NAKED)           // no other registers will be altered
{
  //write PWM_BYTE_OFF to PORTB
  asm volatile("out 0x18, r17" "\n\t"      //write PORTB
               "reti" "\n\t"
               :: );
}//end of ISR(TI...)

ISR(TIMER2_OVF_vect, ISR_NAKED)           // no other registers will be altered
{
  //write PWM_BYTE_ON to PORTB
  asm volatile("out 0x18, r16" "\n\t"     //write PORTB
               "reti" "\n\t"
               :: );
}//end of ISR(TI...)


Also so wie ich das sehe, wird PWM_Byte_OFF und PWM_Byte_ON direkt in 
ein Register geschrieben.
danach mit dem ISR(TIMER2_COMP_vect ... ) sollte man doch einstellen, 
welchen Comparewert der TIMER 2 bekommt oder?, ich verstehe also nicht, 
wieso man plötzlich in den PORTB einen Wert hineinschreibt, und nicht in 
das Register für den Comparewert?

Das gleiche beim Overflow Wert.

Kann mir jemand sagen wie ich das verstehen soll?

Schöne Grüße
Alexander

Autor: Tim Seidel (maxxie)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Timings (also alles was sich ums wann? dreht) werden beim 
Initialisieren des Timers eingestellt, nicht erst, wenn dieser "feuert". 
In dem Moment kannst du davon ausgehen, dass die eingestellte Zeit 
vergangen ist und einfach die eigentliche Handlung ausführen. Sprich den 
Zugriff auf die Ports um die LED zu schalten.

Autor: Björn B. (elmo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Alexander,

der Code macht folgendes:
Beim Auftritt des Compare Interrupts von Timer 2 wird der aktuelle Wert 
von PWM_BYTE_OFF an PortB angelegt.
Beim Timer 2 Overflow Interrupt passiert das Gleiche mit dem Wert der in 
PWM_BYTE_ON steht.
Der Comparewert von Timer 2 kann auch an ganz anderer Stelle gesetzt 
werden. Es reicht ja auch, wenn das einmal passiert.

Gruß
Björn

Autor: Alexander (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!
Danke für die schnellen Antworten.
Leider habe ich noch nicht ganz verstanden wie das funktioniert.
Also eigentlich müsste es doch das gleiche machen wie zb. das hier:

  ICR1 = 0x6FFF;
  Top Wert


  OCR1A = 0x3FFF;
  Comparewert

Aber diese Werte schreibe ich doch in die Register meines Timers, und 
nicht an den PORTB ?

Und außerdem steht doch in den beiden variablen PWM_BYTE_OFF und 
PWM_BYTE_ON garnichts drinnen oder ? Also einfach nur irgendein Wert der 
gerade zufällig im Register steht?

Oder sehe ich da was Grundlegendes falsch?

Lg
Alexander

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alexander schrieb:
> Hallo!
> Danke für die schnellen Antworten.
> Leider habe ich noch nicht ganz verstanden wie das funktioniert.
> Also eigentlich müsste es doch das gleiche machen wie zb. das hier:
>
>   ICR1 = 0x6FFF;
>   Top Wert
>
>
>   OCR1A = 0x3FFF;
>   Comparewert

Nein.
Wie kommst du darauf?

> Aber diese Werte schreibe ich doch in die Register meines Timers, und
> nicht an den PORTB ?

An den PortB wird da gweschrieben, weil da wohl irgendeine Hardware 
drann hängt, die über PWM vom Timer gesteuert werden soll.

Wahrscheinlich hatte der Erbauer die eigentlich für PWM vom Timer 
vorgesehenen Pins nicht mehr frei und muss sich jetzt so helfen.

> Und außerdem steht doch in den beiden variablen PWM_BYTE_OFF und
> PWM_BYTE_ON garnichts drinnen oder ? Also einfach nur irgendein Wert der
> gerade zufällig im Register steht?

Im Prinzip ja.
Allerdings ist das gezeigte Codestück ja auch kein vollständiges 
Program.

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.