Forum: Mikrocontroller und Digitale Elektronik Arduino tone() bzw. delayMicroseconds() zu lang


von YannikW (Gast)



Lesenswert?

Hi,

ich habe ein kleines Problem, dass ich jetzt mit meinem neuen kleinen 
Oszi entlich entlarven konnte. (DSO138 von BG - nettes kleines Spielzeug 
und für viele sicher ausreichend :P )

Aber zum eigentlichen Problem.
Für ein Infrarot Sender & Empfänger möchte ich mein eigenes IR Signal 
"bauen".

Damit der Empfänger das Signal wahrnimmt ist es 38kHz codiert. Die Daten 
werden dann einfach duch die Puls-/Pausenlängen übertragen. Dazu brauche 
ich Pulslängen im Bereich ~300-500µS.

Testweise habe ich es mal mit 1mS Pulslänge probiert.

hier der Code :
1
void loop() {
2
  tone(3, 38000);
3
  delayMicroseconds(1000);
4
  noTone(3);
5
  delayMicroseconds(1000);
6
}

Da kommt nun leider das raus was ihr auf dem Bild "38kHz Puls 500Hz 
delaymicroseconds" seht. Die Pause passt, der Puls ist aber etwa 2,3ms 
lang..

Selber Code mit
1
delay(1);
 liefert ein besseres Ergebnis, aber so richtig passt es immernoch 
nicht, siehe "38kHz Puls 500Hz delay"

Ein mit digitalWrite und delayMicroseconds erzeugtes 500Hz 
Rechtecksignal passt perfekt.

Es scheint also, als würde tone() nicht mit delayMicroseconds() zusammen 
funktionieren. Kann das sein??

Hätte da einer ne Idee, wie man das beheben könnte? :)

von Basti B. (basti195) Benutzerseite


Lesenswert?

Die Funktionen müssen irgend woher wissen was du für ein Taktsignal 
einspeist.
bei _delay_ms(xy); übergibt man dem Programm durch
#define F_CPU 16000000
das es sich um ein 16mhz takt handelt.

von YannikW (Gast)


Lesenswert?

Bei Arduino sollte das nicht extra nötig sein, oder?

von ooOoo (Gast)


Lesenswert?

Sebastian B. schrieb:
> das es sich um ein 16mhz takt handelt.

Millihertz - wie süß :-)

von YannikW (Gast)


Angehängte Dateien:

Lesenswert?

Habe eine Lösung gefunden.. Bzw einen anderen Weg ;)

Habe jetzt für das 38kHz PWM einfach einen CTC Timer genommen.

Damit klappt es einwandfrei :)
1
void setup() 
2
{
3
  pinMode(3, OUTPUT);
4
  
5
  //clear Timer2
6
  TCCR2A = 0;
7
  TCCR2B = 0;
8
  
9
  //set timer2 on 76kHz (2*38) toggle Pin D3
10
  TCCR2A |= (1 << COM2B0);    //Toggle OC2B on compare match
11
  TCCR2A |= (1 << WGM21);     //CTC Mode
12
  
13
  TCCR2B |= (1 << CS20);      //No Prescaler
14
  
15
  OCR2A = 209;                //(16000000 / 76000) - 1
16
}
17
18
void loop()
19
{
20
  enableSignal();
21
  delayMicroseconds(1000);
22
  disableSignal();
23
  delayMicroseconds(1000);
24
}
25
26
void enableSignal()
27
{
28
  TCCR2B |= (1 << CS20);    //Enable Timer
29
  TCCR2A |= (1 << COM2B0);  //Eable toggle OC2B on compare match
30
}
31
32
void disableSignal()
33
{
34
  TCCR2B &= ~(1 << CS20);    //Disable Timer
35
  TCCR2A &= ~(1 << COM2B0);  //Get access for manualy set OC2B to low
36
  PORTD &= ~(1 << 3);        //Set D3 to low
37
}

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.