Forum: Mikrocontroller und Digitale Elektronik Delayzeit stimmt nicht


von Jonny O. (-geo-)


Lesenswert?

Hallo Zusammen,

ich bastel grade an einem einfachen Modem, mit dem ich Daten per PMR 
Funkgerät übertragen kann. Ich erzeuge für eine 1 einen Ton definierter 
Frequenz und für 0 eine Pause. Nun ist es aber so, dass die Tonfrequenz 
stark vom gewünschten Wert abweicht. Ich nutze AVR Studio 4 und der µC 
ist ein ATMEGA 8 der mit internem RC Oszi auf 8MHz läuft.

Die Funktion "void ton_an(uint16_t an)" erzeugt einen Ton mit 500Hz 
(zumindest soll sie das). High-Zeit und Low-Zeit müssen also jeweils 1ms 
dauern. Ich habe mit dem Oszi nachgemessen und messe jedoch 1,4 ms. Also 
wesentlich mehr. Mit der Toleranz des internen Oszillators kann dies 
nicht zusammenhängen (+-3% Toleranz). Das an/ausschalten eines Pins 
dauert doch nicht so lange oder? Würde mich jedenfalls wundern.

Ev. habe ich auch einen Denkfehler drinn. Wäre nett wenn mal einer 
drüberschauen könnte.

Hier ein Ausschnitt des Codes:


...
#define F_CPU 8000000UL
#include <util/delay.h>

//Delayfunktion für Sekunden

void delay_zentelsekunden (uint16_t time)
{uint16_t x;
time*= 10;
for(x=0;x<time;x++){_delay_ms(10);}
}

//Delayfunktion für ms
void delay_millisekunden(uint16_t ms)
{uint16_t x;

for(x=0;x<ms;x++){_delay_ms(1);}
}

//////////////////////////////////////////////////////////////////////// 
///

void portinit()
{
DDRB |= (1<<PB0); // Auf Ausgang schalten
PORTB &= ~(1<<PB0);
}

void ton_an(uint16_t an)
{uint16_t n;

an/=2;
  for (n=0;n<an;n++)
  {
  PORTB |= (1<<PB0);
  _delay_ms(1);
  PORTB &= ~(1<<PB0);
  _delay_ms(1);
  }

}

void senden(uint8_t wert)
{uint8_t n;

ton_an(300);

  for (n=1;n<=8;n++)
  {
    if(wert&(1<<n))
    {
    ton_an(40);
    }
    else
    {
    delay_millisekunden(40);
    }

  }


}

void main()
{
usartinit();
portinit();
  while(1)
  {
  senden('g'); // sendet zeichen g
  delay_zentelsekunden (30);
  //senden(Usart_Rx());
  }
}

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

Jonny Obivan wrote:

> Frequenz und für 0 eine Pause. Nun ist es aber so, dass die Tonfrequenz
> stark vom gewünschten Wert abweicht. Ich nutze AVR Studio 4 und der µC
> ist ein ATMEGA 8 der mit internem RC Oszi auf 8MHz läuft.

Was heisst es weicht "stark" ab? Dass der interne Oszillator sehr 
ungenau ist und auch noch stark mit der Temperatur driftet, ist Dir 
klar?

> High-Zeit und Low-Zeit müssen also jeweils 1ms
> dauern. Ich habe mit dem Oszi nachgemessen und messe jedoch 1,4 ms

Und? Klingt normal.

von yalu (Gast)


Lesenswert?

Wahrscheinlich ist der erzeugte Code dieses kleinen Progrämmchens
größer als 3KB, und in der Vielzahl der Compilermeldungen taucht
irgendwo der Satz "Compiler optimizations disabled; functions from
<util/delay.h> won't work as designed" auf :)

von Jonny O. (-geo-)


Lesenswert?

Hallo Michael,

> Was heisst es weicht "stark" ab? Dass der interne Oszillator sehr
> ungenau ist und auch noch stark mit der Temperatur driftet, ist Dir
> klar?

ist mir klar --> Oszi +-3%

> Und? Klingt normal.

40% Abweichung ist nicht normal.

Hallo yalu,

habe mal geschaut --> so eine Meldung kommt bei mir nicht.

Grüße
Jonny

von yalu (Gast)


Lesenswert?

> habe mal geschaut --> so eine Meldung kommt bei mir nicht.

Ich wollte damit auch nur auf etwas umständliche Art und Weise fragen,
ob du beim Compiler die Optimierung (mindestens -O1 oder -Os) aktiviert
hast. Bei 99% aller Delay-Fragen hier im Forum wurde das nämlich
vergessen, was zu riesigem Code und längerer Ausführungszeit führt.

von Jonny O. (-geo-)


Lesenswert?

@ yalu,

vielen Dank³! ;))

Nun klappt es.

von Malte Z. (saeckereier)


Lesenswert?

99% + 1 Fall ...

von Jonny O. (-geo-)


Lesenswert?

bekomme ich als 100 einen Preis? :))

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.