Software UART mit ATTiny45 auf Timer 1 und Timer 0

Gast #3151099
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.
Angehängte Dateien:
Moderator Persönliche Seite #3151126
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.
Gast #3151132
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.