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()); } }
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.
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 :)
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
> 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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.