Delayzeit stimmt nicht

OP #921253
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());
  }
}
Persönliche Seite #921259
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.
Gast #921278
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 :)
OP #921320
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
Gast #921342
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren