mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Delayzeit stimmt nicht


Autor: Jonny Obivan (-geo-)
Datum:

Bewertung
0 lesenswert
nicht 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());
  }
}

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :)

Autor: Jonny Obivan (-geo-)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jonny Obivan (-geo-)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ yalu,

vielen Dank³! ;))

Nun klappt es.

Autor: Malte Zacharias (saeckereier)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
99% + 1 Fall ...

Autor: Jonny Obivan (-geo-)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bekomme ich als 100 einen Preis? :))

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.