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


von André W. (sefiroth)


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é

von crazy horse (Gast)


Lesenswert?

CLKPR = 0x80;
CLKPR = 0x02;

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

von Andreas K. (a-k)


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.

von crazy horse (Gast)


Lesenswert?

auch so: inline Assembler sollte das Problem lösen.

von Andreas K. (a-k)


Lesenswert?

crazy horse wrote:

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

Darf sie nur wenn CLKPR nicht volatile ist.

von crazy horse (Gast)


Lesenswert?

ich seh auch gerade, dass ich das Problem sowieso falschherum verstanden 
habe :-)

von André W. (sefiroth)


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

von crazy horse (Gast)


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.

von André W. (sefiroth)


Lesenswert?

Danke! Musste wirklich sts benutzen

von HRB (Gast)


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.

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.