Hallo, ich versuche gerade auf einem ATtiny45 mithilfe dem USI eine serielle Schnittstelle ans laufen zu bekommen. Beschrieben ist das in der Appnote AVR307 von Atmel. Die Software ist allerdings für einen ATtiny26 und den IAR Compiler geschrieben. Jetzt habe ich die Software soweit umgeschrieben, nur laufen tut sie noch nicht so recht. Ich habe noch mit Timingproblemen zu kämpfen. Nachdem 5 Bits über das USI Schieberegister ausgegeben wurden, muss dieses nachgeladen werden. Genau an dieser Stelle benötigt das Programm, je nach Optimierungseinstellungen, unterschiedlich lange. In der Software für den IAR Compiler ist eine Zeile die da heisst: __no_init __regvar static unsigned char USI_UART_TxData @ 15; // Tells the compiler to store the byte to be transmitted in registry. Gibt es für den GCC auch einen Befehl, der ihn veranlasst die Variable in einem Register zu halten? Wenn ja wie heisst dieser? Falls sonst evtl. schon jemand ähnlich Probleme mit dieser Appnote hatte sind Vorschläge natürlich immer Willkommen. Den Quellcode habe ich auch mal noch angehängt. Danke, Christof
Guckst Du im GCC Forum und suchst nach "Variable Register". Eines der Ergebnisse: Beitrag "Variablen in Register halten" Außerdem könnte sowas auch im GCC - Tutorial drin stehen, falls nicht, sollte man es mal nachtragen...
Danke für den Hinweis. So wie es aussieht steht dass noch nicht im Tutorial. Mein code tut zwar immer noch nicht, aber zumindest weiss ich nun wie man Variablen in Registern hält. Grüße, Christof
>Nachdem 5 Bits über das USI Schieberegister ausgegeben wurden, muss >dieses nachgeladen werden. Genau an dieser Stelle benötigt das Programm, >je nach Optimierungseinstellungen, unterschiedlich lange. welche Ausgabegeschwindigkeit willst du den realisieren, daß Dir dies auf die Füße fällt?.
9600 Baud. Sollte laut Appnote auch gut machbar sein. Das Problem ist auch nicht, dass er da ein oder zwei µs länger braucht sondern zwischen etwa 100 und 300µs. Irgendwo scheint ihm da ein Interrupt verloren zu gehen.
ich hatte mal gelesen daß man z.B. mit register int a veranlassen kann, daß die Variable a in einem Register gehalten wird - aber ich glaube der gcc interpretiert das nur als einen "Vorschlag" - mit geringerer Priorität als seine eigenen "Ideen". Erinnere ich mich recht, so wurde mein "Vorschlag" vom gcc übergangen :-)
9600 ist problemlos möglich ich mache 38400 bei 8 Mhz ohne Probleme. deine 100us entsprechen der Bitzeit, wahrscheinlich laedst du falsch nach.
Habs rausbekommen. Da die Pinchange interrupts nicht nur auf RxD sondern auch auf TxD freigegeben waren, hat er sich beim Senden selber unterbrochen. Seltsam ist nur, dass die im Originalcode auch freigegeben sind. Muss mir das morgen nochmal genauer anschauen was Atmel sich dabei gedacht hat. Ich poste dann auch noch den funktionsfähigen code. Danke für die Anregungen, Christof
Hier noch der nun funktionierende Quellcode angepasst für einen ATtiny25/45/85. Weshalb in der Appnote die Pin Change Interrupts auf den anderen Pins freigegeben sind, erschließt sich mir zwar immer noch nicht, is aber auch egal.
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.