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é
CLKPR = 0x80; CLKPR = 0x02; Die 1.Zeile wird wohl "wegoptimiert", da "sinnlos" :-)
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.
auch so: inline Assembler sollte das Problem lösen.
crazy horse wrote:
> Die 1.Zeile wird wohl "wegoptimiert", da "sinnlos" :-)
Darf sie nur wenn CLKPR nicht volatile ist.
ich seh auch gerade, dass ich das Problem sowieso falschherum verstanden habe :-)
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 :-(
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.