Forum: Mikrocontroller und Digitale Elektronik AVR32 AT32UC3C0512C Bootloader Frequenz


von Peter M. (skybiker)


Lesenswert?

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

von Phil S. (zippi)


Lesenswert?

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.

von Martin H. (marrtn)


Lesenswert?

Was heisst "Ich möchte aber mit einer höheren Frequenz arbeiten."?
Du hast irgendeinen anderen Quarz, den Du unbedingt verwenden möchtest? 
Warum?

von Peter M. (skybiker)


Lesenswert?

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

von Martin H. (marrtn)


Lesenswert?

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.

von Peter M. (skybiker)


Lesenswert?

@ 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

von Arc N. (arc)


Lesenswert?

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

von Martin H. (marrtn)


Lesenswert?

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...

von Phil S. (zippi)


Lesenswert?

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ß

von Peter M. (skybiker)


Lesenswert?

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

von jerome o. (patladope)


Lesenswert?

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
}

von Phil S. (zippi)


Lesenswert?

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

von jerome o. (patladope)


Lesenswert?

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

von Martin H. (marrtn)


Lesenswert?

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.

von Phil S. (zippi)


Lesenswert?

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ß

von jerome o. (patladope)


Lesenswert?

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

von Martin H. (marrtn)


Lesenswert?

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 ;)

von Phil S. (zippi)


Lesenswert?

>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ß

von jerome o. (patladope)


Angehängte Dateien:

Lesenswert?

Hallo Zippi,
hier im Anhang ist der komplette Code. Danke im Voraus
Gruß
jerome

von Phil S. (zippi)


Lesenswert?

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.

von jerome o. (patladope)


Angehängte Dateien:

Lesenswert?

Hallo Zippi,
hier ist das Projekt als zip-Datei.
Danke nochmal
Gruß
Jerome

von Phil S. (zippi)


Lesenswert?

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
Noch kein Account? Hier anmelden.