Forum: Mikrocontroller und Digitale Elektronik Software UART mit ATTiny45 auf Timer 1 und Timer 0


von chuck (Gast)


Angehängte Dateien:

Lesenswert?

Hallo allerseits,

ich arbeite momentan an einem Projekt bei dem ich ein PWM Signal das ich 
von einem 433MHz Reciever bekomme demodulieren will und dann über ein 
Software UART an ein PC Senden will.

Dazu benutze ich eine leicht modifizierte Version eines Software UART 
mit Timer 1 den ich im Internet gefunden habe. Dieser hat auch wunderbar 
funktioniert, bis ich jetzt zur demodulierung auch noch Timer0gestartet 
habe. Jetzt kommt statt dem fehlerfreien "Hallo" über 115200Baud/s 
nurnoch
1
ìoaììoÈaLhoHaìhoˆAlìoHalloÀalloHahloHalhïaìhoclhoaìloÀAhìþHalhoa\loHaìhoaìhoHahloalìoHaìloÀAhlîHalhoHalhoaìloÀAhìîHalhïaìhoclhoAììoHahlîHalhoàè|oHalhoHaìhoclhoHalloÀAèlHahlîHallHahìþHalhïaì|oaìhocl|HaìHoAlìo@ahl~aììoAììoalloÀalloalìoHA\hoÀalloaììoHal|oallo
aus dem Serial Port. Sobald ich den TIMER0_COMPA_vect aus dem TIMSK 
entferne kommt alles wieder fehlerfrei an.

Den Sourcecode habe ich mal in den Anhang gepackt. Der ATTiny45 läuft 
mit 8MHz auf dem Int. Osz.

Ich stehe jetzt etwas auf dem Schlauch, da ich beide Timer brauche. 
Bitte um Hilfe.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

115200 Baud mit dem internen Oszillator ist schon recht sportlich. Ich 
vermute, dass Du in der 2. Interrupt-Routine (Timer 0) derart viel Zeit 
verbrätst, dass Du das UART-Timing nicht mehr einhalten kannst.

Zwei Möglichkeiten:

- Einen Quarz verwenden, um das Timing genauer hinzubekommen
- Deine Timer0-ISR optimieren, dass sie weniger Zeit verbrät

Nach Einblick in den Source:

Du inkrementierst eine volatile int Variable "i" in der Timer0-ISR. Du 
benötigst allerdings nur Werte bis maximal 240. Dann reicht ein

    volatile unsigned char i;

Das sollte Deine ISR erheblich verkürzen.

von chuck (Gast)


Lesenswert?

OK, danke die 240 waren nur ein Wert um mir das anzuschauen. ich habe 
jetzt das i als uint8_t. Das hat die Geschichte schonmal ganzschön 
verbessert. Danke dafür. Um das Timing aber einhalten zu können muss ich 
den Prescaler mindestens auf 8 setzen. Muss die Mathematik also nochmal 
neu machen :)

Aber danke für den Tipp. hätte nicht gedacht dass UART so Timingsensitiv 
beim senden ist.

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.