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


von Alexander (Gast)


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:
1
volatile register unsigned char PWM_BYTE_ON asm("r16");   // preserve r16 for pwm_data_on
2
volatile register unsigned char PWM_BYTE_OFF asm("r17");  // preserve r17 for pwm_data_off
3
4
//ISR ROUTINES
5
6
ISR(TIMER2_COMP_vect, ISR_NAKED)           // no other registers will be altered
7
{
8
  //write PWM_BYTE_OFF to PORTB
9
  asm volatile("out 0x18, r17" "\n\t"      //write PORTB
10
               "reti" "\n\t"
11
               :: );
12
}//end of ISR(TI...)
13
14
ISR(TIMER2_OVF_vect, ISR_NAKED)           // no other registers will be altered
15
{
16
  //write PWM_BYTE_ON to PORTB
17
  asm volatile("out 0x18, r16" "\n\t"     //write PORTB
18
               "reti" "\n\t"
19
               :: );
20
}//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

von Tim S. (maxxie)


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.

von Björn B. (elmo)


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

von Alexander (Gast)


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

von Karl H. (kbuchegg)


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.

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.