Hallo Zusammen, ich versuche gerade die Basics von der µC-Programmierung in C zu begreifen. Dazu habe ich ein Xplained128A1 (Xmega128A1) einen 8 Bit LED Zähler programmiert um die Pin Ansteuerung zu üben. Als nächstes möchte ich die den Oszillator unterschiedlich einstellen. Dazu habe ich folgenden Code gefunden: OSC.CTRL |= OSC_RC32MEN_bm; while(!(OSC.STATUS & OSC_RC32MRDY_bm)); CCP = CCP_IOREG_gc; CLK.CTRL = CLK_SCLKSEL_RC32M_gc; Programm (siehe unten Läuft!) !!! Wenn ich jedoch auf 2 MHz gehen möchte blinken meine LEDs (Zähler) (siehe Programm unten) immer noch gleich schnell!!????? OSC.CTRL |= OSC_RC32MEN_bm; while(!(OSC.STATUS & OSC_RC32MRDY_bm)); CCP = CCP_IOREG_gc; CLK.CTRL = CLK_SCLKSEL_RC32M_gc; Wo habe ich den Fehler/ Gedankenfehler? Hier der gesamte Programmcode: #include <asf.h> unsigned int k,n,start; char TastenD = 0; void wait_sinnfrei (void) { k = 0; while (k<10000) { k++; } } int main (void) { OSC.CTRL |= OSC_RC32MEN_bm; while(!(OSC.STATUS & OSC_RC32MRDY_bm)); CCP = CCP_IOREG_gc; CLK.CTRL = CLK_SCLKSEL_RC32M_gc; PORTE.DIR = 0xff; while (1) { n = 0; while (n<255) { PORTE_OUT = n; n++; wait_sinnfrei(); } } } Vielen Dank für die Hilfe !!!! Stefan
Ich meine im zweiten Block natürlich: OSC.CTRL |= OSC_RC2MEN_bm; while(!(OSC.STATUS & OSC_RC32MRDY_bm)); CCP = CCP_IOREG_gc; CLK.CTRL = CLK_SCLKSEL_RC2M_gc; also statt 32 einfach nur 2
Ich habe auch das Problem ! Der µC läuft auch ohne Clock Initialisierung allerdings weiß ich nicht mit welcher Frequenz. Die Änderung habe ich so gemacht wie Stefan Sie beschrieben hat. Ebenfalls ohne merkliche Auswrkungen auf die Geschwindigkeit bei der Programmausführung. Weiß jemand Bescheid? Martin
Martin schrieb: > Weiß jemand Bescheid? Ja, dass Datenblatt... der µC läuft standardmäßig mit 2 MHz los... Für Clockeinstellung benutz ich die ASF... ist mir zu mühsam das mit "Hand" zu machen, aber wenn du was lernen willst. Analysiere z.B. den Code der ASF... muss ich auch tun, wenns mal nicht so läuft wie ich will...
Schon mal Danke für den Tipp... Was meinst du mit ASF? Wo kann ich nachlesen was es ist und wie es geht? Kannst du mir vieleicht ein Beispiel geben? Merci Stefan
Stefan schrieb: > while(!(OSC.STATUS & OSC_RC32MRDY_bm)); wartest du hier wirklich auf den 2MHz RC ?
Ja da muss man warten. Aber nicht auf den RC, sondern bis der richtig in der PLL eingerastet ist. Steht im Datenblatt. Schau dir mal das hier an: CLK_SCLKSEL_RC2M_gc Das ist ja auch nur eine Bitmaske. Die findest du im Header zum Controller. Findest du über die IO.h und musst dich durchhangeln. Dann nimmst du das Datenblatt und schaust, ob das mit den Bitdefinitionen übereinstimmt. Ich vermute mal nicht. So wie ich mich erinnere ist das der Prescaler für den Clock. Gruß, Jens
@Jens, er wartet aber auf den 32MHz RC und nicht den 2MHz RC, das ist es worauf ich hinaus will.
Stimmt da ist ein Fehler ich warte ja auch 2Mhz habe aber 32Mhz geschrieben. Das ist richtig. OSC.CTRL |= OSC_RC2MEN_bm; while(!(OSC.STATUS & OSC_RC32MRDY_bm)); CCP = CCP_IOREG_gc; CLK.CTRL = CLK_SCLKSEL_RC2M_gc; Damm müsste er aber in der while-Schleife while(!(OSC.STATUS & OSC_RC32MRDY_bm)); hängen bleiben. Warum kommt er da jemals raus. Die Bedingung wird ja nie erfüllt ???? Anscheinend aber doch. WARUM?
Also mein Atxmega128A3 bleibt "wie gewünscht" bei "while(!(OSC.STATUS & OSC_RC32MRDY_bm));" hängen. Mache aber nichts anders als du. 1:1 gleich. Achja, damit das
1 | CCP = CCP_IOREG_gc; |
2 | CLK.CTRL = CLK_SCLKSEL_RC32M_gc; |
funktioniert musst die die optimierungen an schalten, denn sonst sind zwischen CCP = CCP_IOREG_gc; und CLK.CTRL = CLK_SCLKSEL_RC32M_gc; mehr als 4 Takte (und dann geht das setzen von CLK.CTRL nicht mehr)
Oh die Optimierung !!!! Daran habe ich gar nicht gedacht! Das war die Ursache! Jetzt läuft es wie es soll mit 32MHz oder 2MHz. Danke vielmals!!!!! Gruß Stefan
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.