Forum: Mikrocontroller und Digitale Elektronik IAR vs. GCC


von ChrisV (Gast)


Lesenswert?

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

von ChrisV (Gast)


Angehängte Dateien:

Lesenswert?

Jetzt zumindest...

von marvin (Gast)


Lesenswert?

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...

von ChrisV (Gast)


Lesenswert?

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

von Wolfram (Gast)


Lesenswert?

>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?.

von ChrisV (Gast)


Lesenswert?

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.

von antworter (Gast)


Lesenswert?

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 
:-)

von Wolfram (Gast)


Lesenswert?

9600 ist problemlos möglich ich mache 38400 bei 8 Mhz ohne Probleme.
deine 100us entsprechen der Bitzeit, wahrscheinlich laedst du falsch 
nach.

von ChrisV (Gast)


Lesenswert?

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

von ChrisV (Gast)


Angehängte Dateien:

Lesenswert?

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
Noch kein Account? Hier anmelden.