Hallo ich bin gerade an einem Projekt mit einem AT32UC3C0512C. Ich benutze den internen Bootloader, dieser funktionier auch ganz gut, aber er erkennt nur die Quarzfrequenzen 8 und 12 und 16 Mhz. Ich möchte aber mit einer höheren Frequenz arbeiten. Hat schon mal jemand den Bootloader auf eine höhere Frequenz umgestellt ? Gruß von Peter
Hi, Was möchtest du damit bezwecken? Der Bootloader braucht den Quarz, weil er über USB arbeitet und in der SOftware so konfiguriert ist, dass er nur mit 8,12 oder 16 Mhz arbeitet. Außerdem hat es keinen sinn einen größeren Quarz als 16 Mhz am UC3 zu betreiben.
Was heisst "Ich möchte aber mit einer höheren Frequenz arbeiten."? Du hast irgendeinen anderen Quarz, den Du unbedingt verwenden möchtest? Warum?
Ja laut Datenblatt macht die CPU bis zu 66 Mhz, und bis 33 Mhz ohne wait states für das interne flash. Handbuch auszug "• Up to 49 DMIPS Running at 33 MHz from Flash (0 Wait-State)" Ausserdem benutze ich 4 Usarts, wenn ich eine andere Frequenz benutze läuft der Usart ohne Fehler . Z.B. bei 24.576.000 Mhz Quarz und 38400 Bd = 0% Fehler bei 12.000 Mhz Quarz und 38400 Bd sind das immerhin 2,4 % Fehler . Bei den Quarz Frequenzen 8 , 12 und 16 Mhz laufen die Usarts bei 9600 Bd und 38400 Bd immer mit Fehler ! Gruß von Peter
Die Quarz-Frequenz hat erstmal nicht wirklich was mit der CPU-Frequenz zu tun. Der UC3C kann übrigens nur mit Quarzen bis max. 20MHz umgehen. Du solltest Dir die Kapitel zum PM und SCIF im Datenblatt nochmal genauer anschauen. Der/die/das "Source Clock" im USART-Kapitel ist auch nicht unmittelbar der Clock von einem der Quarzozillatoren, da ist noch einiges dazwischen... Hast Du wirklich Übertragungsfehler oder ist das nur der Fehler, der auf dem Papier steht. Normalerweise können UARTS mit einigen Prozent an Abweichung von der nominellen Frequenz durchaus umgehen. Da dürfte noch was anderes im Argen sein... Ich hab' bei mir einen 16MHz Quarz drauf, die CPU läuft auf 64MHz und der USB bekommt auch noch seine 48MHz. Den USART hatte ich mit 115200 Baud ohne Probleme am laufen - brauch ich aber jetzt nicht mehr. Wenn Du schon beim nachlesen bist, solltest Du Dir auch noch die USB-Device-Geschichten anschauen. Ich hab' mal einen halben Tag in das hid_generic investiert und will gar keinen USART mehr ;-) Auf der PC-Seite ist das deutlich einfacher (mit pywinusb). Den ganzen Protokolloverhead (z.B. Prüfsummen und Wiederholung bei Fehlern) macht USB von alleine.
@ Martin H. danke für deine Erklärungen. Ich hatte bisher 16 Bit CPU ' s im Einsatz. Dies ist jetzt das erste Projekt mit dem AT32UC3C, daher muss ich mich jetzt erst mal ein bischen einarbeiten und ein paar ( dumme ) Fragen stellen. Ich habe auf den Labortische keine Übertragugsfehler auch nicht bei 2,4 % Abweichung. Ich setze aber RS 485 Schnittstellen ein. ( galvanisch getrennte ) Die sind dann bis zu 1000 Meter lang. Und hierbei kommen dann noch weitere Fehler dazu. Bisher habe ich immer geschaut das wenigstens die usarts mit 0 % Fehler laufen. Wenn du einen 16 MhZ Quarz hast dann wirst du wahrscheinlich den CPU Clock von 64MHz über eine PLL erzeugen ? und für den USB die andere PLL einsetzen ? Nimmst Du dann für den PLL Eingang die 16 Mhz vom Quarz oder einen anderen internen OSC ? mfg Peter
Da gibt's mehrere Möglichkeiten: - Mehr als 64 Pins? Dann beide Oszillatoren mit unterschiedlichen Quarzen verwenden, ansonsten externe einsetzen. - RC-Oszillator kalibrieren (Frequency Meter ist ja eingebaut) und/oder - Fractional Baud Rate Generator http://asf.atmel.com/docs/2.9.0/avr32.components.memory.sdmmc.spi.unit_tests.uc3c_ek/html/usart_8c.html
PLL0 versorgt die CPU und Busse und PLL1 den USB. Beide PLLs werden vom OSC0 (mit 16MHz-Quarz) "gefüttert". Ich "bastle" schon eine ganze Weile mit dem UC3C und entdecke trotzdem immer wieder "was neues". Er ist halt doch umfangreicher als die 8-/16-Bitter und auch manche 32-Bitter, mit denen ich bisher unterwegs war. Ich bin mir nicht 100%ig sicher, aber ich glaube, dass die PBA/B/C-Clocks immer vom CPU-Takt abgeleitet sind und damit auch der Clock für den USART. Vielleicht habe ich ja auch was übersehen. Also entweder Du lässt Deine CPU mit einem krummen Takt laufen - was ja auch kein Problem ist, wenn die PLL den hinbekommt - oder Du musst mit einem kleinen Fehler leben. Bei 32MHz und 38400 Bd ist der ja gerade mal 0.16%. Ich würde erwarten, dass diese 0.16% unabhängig von der Kabellänge kein Problem darstellen - sofern nicht nur "Matsch" am anderen Ende rauskommt...
Hey, Genau die USART Schnittstelle braucht keine 0% Fehlerrate, das hat damit was zu tun, das die Startbit überwachung beim Empfänger meist mit 8Facher oder 4Facher Bautrate arbeitet und du ja immer nur 8bit überträgst. Damit er also mal ein Bit falsch erkennt, müsste die Fehlerrate schon sehr hoch sein. Schau erstmal wie du die PLL konfigurieren musst. Standardmäßig läuft der Controller ohne PLL auf den 125khz intern. Falls du ein Beispiel brachst, kann ich dir eins geben. Später kannst du dann auch die Clocks divider für PBA/B/C einstellen. Am einfachsten machst du alle auf 1, dann laufen alle Peripherien mit der CPU Frequenz. Gruß
Hi, vielen Dank für die Tips. Ich habe einen 12 Mhz Quarz drauf, und verwende jetzt PLL1 mit 32Mhz Ausgang für den CPU Clock. Habe verschieden Baud Rates getestet. 9600, 38400, 115200 Läuft alles Prima Gruß von Peter
hallo, Bitte kann mir mal jemand helfen mit einem funktionierenden CPU-Clock Code. Ich speise auch mein Microkontroller mit einem externen Quartz (12 Mhz), aber der Mikrocontroller macht nichts. ich habe alle Einstellungen, die im Datenblatt waren genau geschrieben, aber funktioniert nicht. ich bedanke mich im Voraus für ein Beispiel. Hier ist mein Code:
1 | #include <avr32/io.h> |
2 | #define QUARZ_FREQ 12 // Quartz Frequency is 12MHz, it is the External Quartz
|
3 | #define CPUCLOCKMHZ 24
|
4 | |
5 | void CpuClockInit(int iClockMHz) |
6 | {
|
7 | /*PLL Multiply Factor*/
|
8 | int iPllMul; |
9 | |
10 | /*Multiplikationsfaktor des PLLs berechnen*/
|
11 | iPllMul = (iClockMHz/(QUARZ_FREQ/2)) - 1; |
12 | |
13 | /*1- PM Oscillator*/
|
14 | AVR32_PM.oscctrl0 = (AVR32_PM.oscctrl0 | 0x00000407); |
15 | |
16 | /*3- Auswahl Oscillator*/
|
17 | AVR32_PM.mcctrl = AVR32_PM_OSC0EN_MASK; // AVR32_PM_OSC0EN_MASK = 0x0000004 |
18 | |
19 | /*4- Wait for Oscillator to be stable*/
|
20 | while((AVR32_PM.poscsr & AVR32_PM_POSCSR_OSC0RDY_MASK)== 0); //AVR32_PM_POSCSR_OSC0RDY_MASK = 0x00000080 |
21 | |
22 | /*5- PLL 0 konfigurieren*/
|
23 | AVR32_PM.pll[0] = 0 << AVR32_PM_PLLOSC_OFFSET | // Oscillator 0 is the source for the PLL |
24 | 1 << AVR32_PM_PLLDIV_OFFSET | // div = 1 |
25 | iPllMul << AVR32_PM_PLLMUL_OFFSET | // multi clock z.b. if clockh = 10 (10+1)*12=132/2Fvc = 66Mhz |
26 | 5 << AVR32_PM_PLLOPT_OFFSET; // 80MHz<fvco<180MHz / fPLL = fvco / Wide Bandwidth Mode disabled |
27 | /*6- Clock Select und PBB-PBA-CPU-HSB Division*/
|
28 | AVR32_PM.cksel = 0x80808080; |
29 | |
30 | /*7- PLL starten*/
|
31 | AVR32_PM.pll[0] |= AVR32_PM_PLLEN_MASK; // PLL enable |
32 | |
33 | /*8- Wait for pll to be stable*/
|
34 | while(!(AVR32_PM.poscsr & AVR32_PM_POSCSR_LOCK0_MASK)); |
35 | |
36 | if(iClockMHz>30) |
37 | AVR32_FLASHC.fcr |= 1 << AVR32_FLASHC_FWS_OFFSET; // The flash is read with 1 wait state. |
38 | |
39 | /*9- PLL as Main Oscillator*/
|
40 | AVR32_PM.mcctrl |= 2 << AVR32_PM_MCSEL_OFFSET; |
41 | }
|
Hi, der Code ist soweit ok, sollte gehen, mein uc3A läuft mit den gleichen einstellungen. Woher weißt du denn, dass die CPU nicht läuft? Hast du schonmal versucht eine LED blinken zu lassen? Ein Typischer Fehler, den man bei den AVR32 anfangs macht, ist auch, dass man vergisst das trampolin file einzubinden, bzw. das Linkerskript zu ändern. gruß Zippi
Hallo Zippi, Vielen dank nochmal für deine Antwort. Auf deine Frage: 1- Woher weißt du denn, dass die CPU nicht läuft? Antwort 1: wenn ich versuche ein Pin ein und aus anzusteuern und das ganze mit einem Logic analyser anzugucken, da stelle ich fest, dass es kein Signal generiert wurde, aber wenn ich den interne RC-Oscillator als main CPU-Clock auswähle, da kann ich mal die Signale ansehen. Ich weiß es nicht Vielleich konnte es an meine Schaltung liegen, aber ich es bezweilfe. Es könnte Vielleich an dem Quartz liegen. Es ist ein ganz normaler 12 MHz Quartz und wurde mit 2x 18PF Keramik-Kondensatoren zusammengeschaltet. Letzte Frage: Bitte was ist ein trampolin file ? ich benutzte den AtmelStudio 6.0 und als Programmiergerät ein STK600. Sobald ich meiner Code kompiliere, starte ich das STK600-Board und damit programmiere ich mein Mikrocontroller problemlos. Bitte Vielleich kannst du mir mal sagen was ich noch zusätzlich machen soll und was ich Vielleich vergessen habe. Ich bedanke mich nochmal im Voraus Gruß jerome
Hast Du schonmal mit dem Debugger geschaut, ob in den Registern auch das drinsteht, was Du gerne drin hättest? Irgendwie fehlt mir da das Schreiben ins UNLOCK Register. Aber ich habe scheinbar eine andere io.h - bei mir gehören die ganzen Register wie z.B. oscctrl zum SCIF und nicht zum PM. 0x00000407 im oscctrl0 bei 12MHz-Quarz sollte wahrscheinlich gehen ist aber nicht Datenblatt-Konform - die eingestellte Gain ist für Quarze > 16MHz. Wird irgendwo OSCEN im OSCCTRL gesetzt? Ansonsten kannst Du natürlich lange warten, bis der Oszillator bereit ist. Warum verwendest Du teilweise Makros aus irgendwelchen Headern und teilweise "handcodierte" Zahlen? Das macht das Ganze nicht unbedingt lesbarer.
Hi, Die Idee mit dem Debugger wäre gut. Du scheinst ja den internen Bootloader nicht zu benutzen, deswegen hat sich das mit dem Trampolin file erledigt. @ Martin H >0x00000407 im oscctrl0 bei 12MHz-Quarz sollte wahrscheinlich gehen ist >aber nicht Datenblatt-Konform - die eingestellte Gain ist für Quarze > >16MHz. Was für ein Datenblatt hast du? Folgender text aus dem Aktuellen Datenblatt vom AT32UC3A3 Seite 62
1 | MODE: Oscillator Mode |
2 | Choose between crystal, or external clock |
3 | 0: External clock connected on XIN, XOUT can be used as an I/O (no crystal) |
4 | 1 to 3: reserved |
5 | 4: Crystal is connected to XIN/XOUT - Oscillator is used with gain G0 ( XIN from 0.4 MHz to 0.9 MHz ). |
6 | 5: Crystal is connected to XIN/XOUT - Oscillator is used with gain G1 ( XIN from 0.9 MHz to 3.0 MHz ). |
7 | 6: Crystal is connected to XIN/XOUT - Oscillator is used with gain G2 ( XIN from 3.0 MHz to 8.0 MHz ). |
8 | 7: Crystal is connected to XIN/XOUT - Oscillator is used with gain G3 ( XIN from 8.0 Mhz). |
>Wird irgendwo OSCEN im OSCCTRL gesetzt? Ansonsten kannst Du natürlich >lange warten, bis der Oszillator bereit ist. Im OSCCTRL gibt es kein OSCEN, aber im mmctrl, das setzt er auch. AVR32_PM.mcctrl = AVR32_PM_OSC0EN_MASK; Welchen Controller hast du genau jerome? Eventuell mal schauen, ob er in einer while hängen bleibt. gruß
Hallo Zippi, ich benutze ein AT32UC3A0128 von Atmel. Ich verstehe bisher nicht warum es mit einem externen Quartz (12 MHz) nicht funktioniert. Der Code scheint in Ordnung zu sein, Aber ich weiß nicht was ich noch einstellen soll. Wie ist das bei dir gewesen? hast du zusätzlich zu dem Code noch andere Maßnahmen oder einstellungen getroffen. Was muss ich noch mal einstellen, damit es funktioniert. Danke im Voraus jerome
Sorry, ich hab' verpasst, dass wir von einem UC3A reden... Ich rede vom UC3C, was ja bei dem Topic auch Sinn macht. Wenn schon Threads gekapert werden, sollten sie vielleicht auch ansatzweise passen ;)
>Sorry, ich hab' verpasst, dass wir von einem UC3A reden... Ich rede vom >UC3C, was ja bei dem Topic auch Sinn macht. Hey, Danke, finde es interessant und vorallem gut zu wissen, dass die da etwas geändert haben beim UC3C. Habe mit den noch nix gemacht nur mit den UC3A, UC3A3 und UC3B. @jerome Mach mal einen richtigen Chip Erase(kann sein, dass der Bootloade noch auf deinem Chip ist). Wenn das nix bringt, dann lade mal dein Projekt hoch und ich schau mir das dann an. Hast du das Board selber entwickelt? gruß
Hallo Zippi, hier im Anhang ist der komplette Code. Danke im Voraus Gruß jerome
Lad mal bitte den ganzen Projektordner den dir ATMEL Studio erzeugt hoch, dann kann ich mir auch die Einstellungen ansehen. Kannst du mir aber auch gerne via e-mail schicken.
Hallo Zippi, hier ist das Projekt als zip-Datei. Danke nochmal Gruß Jerome
Also ich sehe da kein Problem, sollte eigentlich funktionieren, was passiert denn, wenn du ein break machst im debugger modus. Hängt der dann, hast du mal Einzelschrittbetrieb gemacht?
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.