www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AT90CAN128 - CLKPR Prescaler nicht einstellbar?


Autor: André Wippich (sefiroth)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich ärgere mich gerade ziemlich mit dem System Clock Prescaler vom 
AT90CAN128 rum...

Das Problem: ich habe hier nur 16 MHz Quarze, aber ein per SPI 
anzusteuernder Chip erlaubt nur Datenraten von max 40 kHz. Da reícht der 
SPI Prescaler aber nicht aus - ich muss den Systemtakt auf 4 MHz 
vorteilen :-(

Ans ich dachte ich mir das ist kein großes Problem und wollte den 
Prescaler auf 4 setzen:
[c}
CLKPR = 0x80;
CLKPR = 0x02; [/c]

Aber der Code wird nur befolgt, wenn ich Optimierungen anhabe. Das stört 
aber eine Funktionsbibliothek die ich nutze (läuft dummerweise nur mit 
Optimierungsgrad "-O0", also keine Optimierung).

Wie kann es sein, dass der Prescaler nur geändert wird, wenn ich die 
Optimierung an habe? Bei zwei Zeilen in Folge sollte die Änderung doch 
mit oder ohne Optimierung innerhalb der besagten 4 Taktzyklen 
erfolgen...

Für einen Rat wäre ich sehr dankbar - sonst fliegt die Platine samt AVR 
aus'm Fenster... ^_^

Gruß, André

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
CLKPR = 0x80;
CLKPR = 0x02;

Die 1.Zeile wird wohl "wegoptimiert", da "sinnlos" :-)

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
André Wippich wrote:

> Das stört
> aber eine Funktionsbibliothek die ich nutze (läuft dummerweise nur mit
> Optimierungsgrad "-O0", also keine Optimierung).

Dann solltest du eher dort suchen. Der Code ohne Optimierung ist derart 
monströs, dass praktisch immer von eingeschalteter Optimierung 
ausgegangen wird (-Os beispielsweise). Manches, wie die 
delay-Funktionen, funktionieren in der avr-libc auch nur mit 
Optimierung.

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
auch so: inline Assembler sollte das Problem lösen.

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
crazy horse wrote:

> Die 1.Zeile wird wohl "wegoptimiert", da "sinnlos" :-)

Darf sie nur wenn CLKPR nicht volatile ist.

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich seh auch gerade, dass ich das Problem sowieso falschherum verstanden 
habe :-)

Autor: André Wippich (sefiroth)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Könnte mir jemand auf die schnelle den Inline Assembler Code für die 
beiden Zeilen posten? Ich habe mit Assembler schon seid Ewigkeiten 
nichts mehr gemacht und bei AVRs noch nie (bis auf das allseits beliebte 
*asm volatile("nop")*).

Das wäre sehr nett von Euch!

Es verwirrt mich ja auch, dass die Zeilen gerade bei aktivierter 
Optimierung funktionieren aber ohne Optimierung nicht.

Aber ich würde es gerne mal mit dem Assembler Code versuchen, um 
vielleicht so die Ursache besser einzgrenzen. Die Bibliothek will ich 
sopäter auch noch optimieren, dass sie mit Optimierung funktioniert, 
aber dafür fehlt grade die Zeit :-(

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
natürlich alles in den passenden Syntax passen (wie bei nop)
push r16
ldi r16, 0x80
out clkpr, r16
ldi r16, 0x02
out clkpr, r16
pop r16

Ich weiss jetzt aber nicht genau, ob das clkpr über die out-Befehle 
erreichbar
ist, evtl. musst sts benutzen.

Autor: André Wippich (sefiroth)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke! Musste wirklich sts benutzen

Autor: HRB (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also bei mir hat folgendes geholfen:

CLKPR = 0b10000000;
asm volatile("nop\n");
CLKPR = 0b00000010;

der Optimizer traut sich dann bei -Os nicht mehr die erste Zuweisung 
wegzuoptimieren.


PS:
Wollte das hier nur einhängen weil ich bei meiner Recherche auf diesen 
Beitrag gestoßen bin.

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.