Forum: Mikrocontroller und Digitale Elektronik ATtiny85 UART mit USI [ASM]: Wo liegt der Fehler?


von Ich (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich bin gerade mit einem Thermometer mit ATtiny85 beschäftigt, das per 
UART an den PC angebunden werden soll. Die Temperatursensoren (DS18S20) 
laufen später per 1-Wire-Bus, diese Funktionalität ist jedoch noch nicht 
implementiert.

Probleme macht mir zur Zeit der UART. Ich habe mich hauptsächlich an der 
Application Note AVR307 orientiert 
(http://www.atmel.com/dyn/resources/prod_documents/doc4300.pdf). Nun ist 
der Code (--> Anhang) schon seit Sonntag fertig, aber funktioniert immer 
noch nicht. Ich versuche bei 8 MHz Taktfrequenz und 300 baud (zum 
Testen, später mehr) ein einziges Byte zu übertragen.
Leider bin ich hardwaretechnisch etwas schlecht ausgerüstet, durch 
Verlangsamen der Übertragungsrate auf 1/64 und Anschließen einer LED an 
den TX-Ausgang konnte ich jedoch schon den Fehler ungefähr lokalisieren. 
Meine bisherigen Testergebnisse:

Nach der Übertragung der zwei "1"-Bits geht der AVR in die Routine 
USI_OVF_ISR_TX_FIRST_HF. Dort schaltet er die LED an PB3 ein. Statt die 
5 Bits zu übertragen, ruft er sofort die Routine uart_init_rx auf, die 
den Timer stoppt und das Senden abbricht. Es ist der rcall bei 
USI_OVF_ISR_TX, unter der Kommentarzeile "Beide Hälften übertragen?". 
Kommentiere ich diesen rcall aus, überträgt er sofort korrekt die zweite 
Hälfte, wie in USI_OVF_ISR_TX_SECOND_HF vorgesehen, ohne jedoch vorher 
die erste Hälte gesendet zu haben. Dennoch wird noch VOR der Übertragung 
der zweiten Hälfte LED1 eingeschlatet.

Ich vermute, es ist ein Problem beim Aufrufen der USI_OVF_ISR. Könnte 
bitte jemand mit mehr Erfahrung den Code durchschauen und mir einen Tipp 
geben, wo der Fehler liegen könnte?
Vielen Dank schon mal.

von Ich (Gast)


Lesenswert?

Bin leider immer noch nicht weitergekommen.
Der Fehler liegt meiner Meinung nach im allgemeinen Programmablauf oder 
in der Steuerung des USI_OVF Interrupts, nur sehe ich nicht wo.

Ich wäre euch dankbar, wenn nur jemand kurz drüberschauen könnte, 
vielleicht findet er ja mögliche Fehler.
Fragen, warum ich was wie gemacht habe, kann ich selbstverständlich 
gerne beantworten.

von Martin V. (oldmax)


Lesenswert?

Hi
Such mal nach OpenEye. Das Programm hab ich mir mal geschrieben, um dem 
Controller auf die Variablenwerte zu sehen. Da ist soweit ich es noch 
weiß, auch eine Anleitung für den UART drin, allerdings auf ATMEGA8 
bezogen. Trotzdem solltest du es dir mal anschauen. Kostet auch nix, hab 
ich zur freien Verfügung reingestellt. Ist aber schon ein Weilchen her.
Gruß oldmax

von Ich (Gast)


Lesenswert?

Vielen Dank, aber so wie ich das sehe, nutzt dein Programm den Hardware 
UART des Mega8. Den hat mein Tiny85 nicht, und erst wenn ich meinen 
Software-UART fertig habe, kann ich Daten mit dem PC austauschen. 
Ansonsten wäre es sicher hilfreich, nur kann ich es wie gesagt jetzt 
noch nicht einsetzen.

von Peter D. (peda)


Lesenswert?

Ich halte das USI für weitgehend unbrauchbar.
Ich mache dann lieber die UART komplett in Software:

Beitrag "Software UART mit FIFO"


Peter

von Ich (Gast)


Lesenswert?

Vielen Dank für den Link, aber ich habe mittlerweile genau das gemacht:
USI Counter in Software nachgebildet und in der TIM0_COMPA_ISR die Bits 
rausschicken.
Es waren noch andere Fehler drin, aber hauptsächlich lags am USI. Mit 
reiner Software funktionierts einwandfrei.

Danke an alle, die geantwortet haben.

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.