mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik IAR vs. GCC


Autor: ChrisV (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: ChrisV (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Jetzt zumindest...

Autor: marvin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: ChrisV (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Wolfram (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?.

Autor: ChrisV (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: antworter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 
:-)

Autor: Wolfram (Gast)
Datum:

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

Autor: ChrisV (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: ChrisV (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.