Forum: Mikrocontroller und Digitale Elektronik Timerfrage AVR


von Frager (Gast)


Lesenswert?

Hallo liebes Forum,

möchte einfach mal an einem Beispiel nachfragen, ob folgendes in einem 
AVR Programm:

  PORTD |=(0x60);
  TCNT1=0x00;
  while(TCNT1<13);

  PORTD &=~(0x60);
  TCNT1=0x00;
  while(TCNT1<13);


genau so dusselig ist wie:

  PORTD |=  0x60;
  _delay_us(11);
  PORTD &=~ 0x60;
  _delay_us(11);


Gruß Toralf

: Gesperrt durch Moderator
von Thomas E. (thomase)


Lesenswert?

Nein. Noch dusseliger.

mfg.

: Bearbeitet durch User
von Amateur (Gast)


Lesenswert?

Mit beiden Ansätzen blockierst Du das System.

Dabei ist es egal, ob Du selber zählst (_delay..) oder zählen (while) 
lässt.

Etwas anderes ist es, wenn Du die Zeit sinnvoll nutzt, während Du zählen 
lässt.

von Frager (Gast)


Lesenswert?

ergo ISR?

Gruß Toralf

von Thomas E. (thomase)


Lesenswert?

Frager schrieb:
> ergo ISR?
>
> Gruß Toralf

Welche Verzögerungen willst du denn erreichen?
Für ein paar µs ist delay völlig OK. Ist ja nicht so, daß das 
Teufelszeug ist. Da kommt der Timer mit Interrupt gar nicht hinterher. 
Denn der Interrupt selbst braucht auch Zeit. Und vor allen Dingen nicht 
immer die gleiche Zeit. Mit _delay_us(11) erhältst du genau 11µs 
Verzögerung. Das sind bei 1MHz 11 Takte. Damit kann man auch ohne Timer 
leben. Solange nicht in einer Schleife eine Frequenz erzeugt werden 
soll. Dafür nimmt man dann einen Timer. Aber nicht mit Counter auslesen 
sondern im CTC- oder PWM-Mode. Zum LED-Blinken zählt man im 
Timer-Interrupt eine Variable rauf oder runter. Da geht es aber auch 
nicht um µs sondern um ein paar hundert ms.


mfg.

von Frager (Gast)


Lesenswert?

Danke für die schnellen Antworten!
@ Thomas
Genau darum geht es. In einer Schleife verschiedene Werte aus einem 
Array auszulesen, um einen ganzen Schwung Daten an eine IR LED und damit 
an ein Endgerät zu senden.
Diese Daten lese ich in einem Programm bereits in ein Array und möchte 
es dann wieder ausgeben.
Das aufgenommene Array enthält jeweils die Werte der Verzögerung jedes H 
und L Pulses in us.

Gruß Toralf

PS Ich merke es an mir selbst, dass die Fragesteller nur zögerhaft mit 
dem wirklichen Anliegen rausrücken.

von Frager (Gast)


Lesenswert?

Ach ja, mit H Wert einer FB ist die Modulationsfrequenz von 36 bis 38 
kHz im H-L Rhytmus gemeint. Alles klappt ja auch, wenn ich die Daten in 
einem Spaghettiprogramm übermittle.

Gruß Toralf

von Thomas E. (thomase)


Lesenswert?

Frager schrieb:
> Ach ja, mit H Wert einer FB ist die Modulationsfrequenz von 36 bis 38
> kHz im H-L Rhytmus gemeint. Alles klappt ja auch, wenn ich die Daten in
> einem Spaghettiprogramm übermittle.
>
> Gruß Toralf

Also du willst nur die 36-38KHz Trägerfrequenz erzeugen?
Das ist die Paradedisziplin für den PWM-Mode. Vor allen Dingen, wenn es 
darum geht, verschiedene Duty-Cycles, z.B. 25% High/75% Low, zu 
erzeugen.
Guck dir mal Mode 14 in der Tabelle "Waveform Generation Mode" vom 
Timer1 an. Die LED kommt dann an OC1A bzw. OC1B.

mfg.

von Frager (Gast)


Lesenswert?

Ich möchte halt flexibel sein, wenn ich so ein Array ausgeben möchte:

int 
f[]={9074,4409,624,1594,564,1649,649,459,564,539,629,1589,564,539,629,45 
4,649,454,569,1649,649,459,564,539,624,459,649,454,569,539,624,454,654,1 
589,624,1589,569,539,624,1589,569,1649,649,1589,624,459,649,1589,624,158 
9,569,1649,649,1589,624,1594,564,539,624,459,649,454,569,539,624,454,654 
,454,569,539,624,454,654,1589,624,1589,594,1624,649,1589,624,1589,594,16 
24,649,1589,624,22984};

Es ist ein FB-Code der mir noch nicht begegnet ist, 
13xGerät+13xGerät(neg)+8xDaten+8xDaten(neg) natürlich Start- und Endcode

Vielen Dank für die Antworten.
Ich arbeite an meinen Programmierkentnissen.
Danke ins Forum.
Gruß Toralf

Beitrag #6534922 wurde von einem Moderator gelöscht.
Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.