AT90CAN128 - CLKPR Prescaler nicht einstellbar?

OP #810552
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é
#810570
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.
OP #810614
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 :-(
Gast #810664
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.
Gast #2027986
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren