Hallo liebe Mikrocontroller-Fans,
ich habe einen attiny2313 programmiert, um eine genaue Sekunde zu
erzeugen und über den USART an ein Terminal zu übermitteln.
In der main-Funktion findet ihr eine auskommentierte while-Schleife.
Innerhalb dieser Schleife teste ich den USART und sende einen Text.
Diese Datenübermittlung funktioniert problemlos.
Lässt man die Schleife aber auskommentiert, so werden ein Timer und ein
Compare-Interrupt aktiviert.
In einer weiteren Schleife werden die Daten über den USART gesendet.
Diese kommen jedoch nur noch selten fehlerfrei am Terminal an.
Ist die Lösung in diesem Fall einen externen Quarz zu verwenden oder
liegt der Fehler woanders?
Viele Grüße
Tobias
Tobi R. schrieb:> Ist die Lösung in diesem Fall einen externen Quarz zu verwenden oder> liegt der Fehler woanders?
Mit dem internen Oszillator kriegst du weder eine fehlerfreie
Datenübertragung noch eine genaue Sekunde hin. Also was soll der ganze
Aufwand? Natürlich brauchst du einen Quarz.
mfg.
Ich wunder mich nur, dass die Übertragung im einen Fall so perfekt
funktioniert trotz Verwendung des internen Oszillators.
Daher dachte ich, ich hätte im anderen Fall einen Fehler gemacht und es
läge eventuell nicht daran, dass ein externer Quarz fehlt.
Ändert sich die Frequenz des internen Oszillators dadurch, dass der
Timer angeschaltet wird?
Erhitzt sich der Mikrocontroller oder wie ist das zu erklären?
@ Tobi R. (Gast)
>In einer weiteren Schleife werden die Daten über den USART gesendet.>Diese kommen jedoch nur noch selten fehlerfrei am Terminal an.
Erstmal ist es sehr ungünstig, deine Uhr so zu zerreißen. Das Hochzählen
packt man besser in den Interrupt. Oder wenn schon, dann zählt man die
Sekunden KOMPLETT incl. Überlauf in der ISR und setz dann ein Flag,
welches von der Hauptschleife erkannt, ausgewertet und gelöscht wird.
Das ist solide, siehe Interrupt.
SIGNAL (SIG_OUTPUT_COMPARE1A)
Das ist absolut veraltet, nimm ISR().
>Ist die Lösung in diesem Fall einen externen Quarz zu verwenden oder
Ist anzuraten.
>liegt der Fehler woanders?
Wahrscheinlich.
Ersteinmal vielen Dank für die Tipps!
Ich habe den Code jetzt abgeändert und ISR verwendet.
Einen simplen Text per UART zu übermitteln klappt jetzt. Auch wenn der
Timer läuft und das Interrupt aktiviert ist.
Allerdings funktioniert der auskommentierte Code in der Hauptschleife
nicht.
Ich glaube, irgendwas läuft mit den String-Operationen schief.
@ Tobi R. (Gast)
>Ich habe den Code jetzt abgeändert und ISR verwendet.
Dort ist noch ein Fehler, ab minute==60, das muss noch in die vorherige
Klammerebene.
>Einen simplen Text per UART zu übermitteln klappt jetzt. Auch wenn der>Timer läuft und das Interrupt aktiviert ist.
Schon mal ein Fortschritt.
>Allerdings funktioniert der auskommentierte Code in der Hauptschleife>nicht.>Ich glaube, irgendwas läuft mit den String-Operationen schief.
Sieht erstmal OK aus. Was kommt den auf dem Terminal an?
Ach nee!
Die ERSTE Operation darf KEIN strcat sein! Sonst machst du deinen String
immer länger!
Das muss am Anfang stehen!
gesamtBuffer[0]=0; // String rücksetzen
Falk Brunner schrieb:> Ach nee!>> Die ERSTE Operation darf KEIN strcat sein! Sonst machst du deinen String> immer länger!>> Das muss am Anfang stehen!>> gesamtBuffer[0]=0; // String rücksetzen
Oder als erste Operation einen strcpy benutzen und keinen strcat