Forum: Mikrocontroller und Digitale Elektronik AVR32 AVR32UC3C2


von Christian S. (vivus)


Lesenswert?

Hallo,

ich versuche gerade SPI0 mit dem AVR32UC3C2 (64 Pin) zu nutzen.
MOSI liegt auf PIN 47 (PD00) und die GPIO Funktion ist A

Dh.
1
AVR32_GPIO.port[3].pmr0 = ??;
2
AVR32_GPIO.port[3].pmr1 = ??;
3
AVR32_GPIO.port[3].pmr2 = ??; // Mode A

Nun habe ich im Wiki gelesen, dass man die Register pmr0 bis pmr2 
beschreiben soll:

Im Wiki hier auf mikorocontroller.net steht foglendes:
(Hier der Artikel: 
https://www.mikrocontroller.net/articles/AVR32-Tutorial)

>Beispielcode um auf Pin A17 den Mode B und auf Pin B05 den Mode D zu bekommen:
1
AVR32_GPIO.port[0].pmr0 = 1<<21;
2
AVR32_GPIO.port[0].pmr1 = 0;
3
AVR32_GPIO.port[0].pmr2 = 0; //mode B
4
5
AVR32_GPIO.port[1].pmr0 = 1<<5;
6
AVR32_GPIO.port[1].pmr1 = 1<<5;
7
AVR32_GPIO.port[1].pmr2 = 0; //mode D

Dieses Beispiel ist für mich absolut unverständlich. Ich schätze mal, 
dass nichtd 1<<21 sondern 1<<17 gemeint ist. Aber warum pmr1 = 0 und 
pmr2 = 0 um auf den Mode B zu kommen ist mir nicht verständlich. Auch 
beim zweiten. Warum hier auf einmal pmr1 = 1<<5 sein soll.

Könnte mir das jemand erklären? Würde mich sehr freuen. :)

Schöne Grüße

: Bearbeitet durch User
von D. F. (Firma: EDF) (derdan)


Lesenswert?

Hast du dir nicht einfach mal überlegt eines der ASF Beispielprogramme 
zu nutzen?

Die verstehst du zwar vielleicht auch nicht, aber die funktionieren dann 
wenigstens.

mfg

von D. F. (Firma: EDF) (derdan)


Lesenswert?

Christian S. schrieb:

>
> https://www.mikrocontroller.net/articles/AVR32-Tutorial)
>
>>Beispielcode um auf Pin A17 den Mode B und auf Pin B05 den Mode D zu bekommen:
>
>
1
AVR32_GPIO.port[0].pmr0 = 1<<21;
2
> AVR32_GPIO.port[0].pmr1 = 0;
3
> AVR32_GPIO.port[0].pmr2 = 0; //mode B
4
> 
5
> AVR32_GPIO.port[1].pmr0 = 1<<5;
6
> AVR32_GPIO.port[1].pmr1 = 1<<5;
7
> AVR32_GPIO.port[1].pmr2 = 0; //mode D
>

Das Besipiel ist fehlerhaft !

von Christian S. (vivus)


Lesenswert?

D. F. schrieb:
> Das Besipiel ist fehlerhaft !

Super, danke für die Hilfe!

Wie wäre es, wenn du mir sagst, wie es korrekt ist, sodass ich es 
nachvollziehen kann.

Erstmal muss man das GPIO Enable Register des gewünschten Pins auf 0 
setzen.
PMR0 auf 0
PMR1 auf 1
Aber was macht man mit PMR2? Die Tabelle im Dateblatt auf S. 468 ist 
mich nicht ganz klar.

von D. F. (Firma: EDF) (derdan)


Lesenswert?

zieh dir doch ein ASF Beispiel, und schau dort nach was die machen.

Im Beispiel wird nicht PA17 sondern PA21 auf Funktion "A" konfiguriert.



Warum du die Beschreibung im Datenblatt nicht nachvollziehen kannst, 
kann ich nicht nachvollziehen.

Um einen der 8 möglichen Peripheral Function je Pin auszuwählen muss man 
die passende Kombination in PMR0 bis PMR2 schreiben. (8 Möglichkeiten = 
3 Bit)

Grüße

: Bearbeitet durch User
von Christian S. (vivus)


Lesenswert?

Dh. für MOSI
AVR32_GPIO.port[3].gperc = 1 << 0;
AVR32_GPIO.port[3].pmr0 = 0 << 0;
AVR32_GPIO.port[3].pmr1 = 0 << 0;
AVR32_GPIO.port[3].pmr2 = 0 << 0; // Mode A


Wenn ich auf Pin PD01 USART0 RXD haben will also:
AVR32_GPIO.port[3].gperc = 1 << 1;
AVR32_GPIO.port[3].pmr0 = 0 << 1;
AVR32_GPIO.port[3].pmr1 = 0 << 1;
AVR32_GPIO.port[3].pmr2 = 1 << 1; // Mode E

von D. F. (Firma: EDF) (derdan)


Lesenswert?

Jo,

das sieht gut aus.

Wobei du natürlich aufpassen musst das du nicht die eben gesetzten 
Register wieder überschreibst. Dein Code macht die Einstellungen für SPI 
Kaputt sobald der USART gesetzt wird.

Aber warum die nicht die ASF Funktionen nimmst ist mir ein Rätsel:
1
uint32_t gpio_enable_module_pin(uint32_t pin, uint32_t function);
2
3
4
//Aufruf
5
6
gpio_enable_module_pin(AVR32_PIN_PD01, 4);




mfg

: Bearbeitet durch User
von Christian S. (vivus)


Lesenswert?

Weil ich mit den ASF Fkt. einfach nur Fktionen rausdonner und nit so 
richtig weiß, was ich tue. Ich würd das ganze gern ohne ASF erlernen.
Ist zwar ziemlich umständlich wie mir scheint, aber ich werds erstmal 
weiter versuchen... :)

Mit dem Überschrieben ist logisch, die jeweiligen Pins gibts ja nur 1x 
:)

Dank für deine Hilfe!

von D. F. (Firma: EDF) (derdan)


Lesenswert?

Hallo,

ich möcht jetzt nicht die ASF sonst wie loben, aber sie funktioniert. 
Lernen kann man auch mit ASF eine Menge. Ich denke aber der Frust ist 
geringer als wenn man die Register alle direkt selber rausfummeln muss.

In der Zeit in der du hier Beiträge verfasst wurde dein SPI schon Daten 
senden / empfangen, wenn du die ASF genommen hättest.

Wenn dann dein Projekt mal läuft kannst du immer noch schauen ob du was 
mit direktem Registerzugriff machen willst. Besser wird das dadurch aber 
bestimmt nicht. Für ungenutzte Rechenleistung oder Flash erhältst du 
kein Geld vom Hersteller zurück. Für aufgewendete Zeit für das Ideal 
jedes Register beim Namen zu kennen entlohnt dich auch niemand. Und wenn 
du auf einen anderen Prozessor wechseln willst oder musst ist das Wissen 
auch nahezu nutzlos.

Aber deine Entscheidung.

Neulich musste ich zu meinem Projekt ein DAC Ausgabe hinzufügen. Einfach 
ASF Explorer DAC hinzugefügt, ein ASF DAC Beispielprojekt angeschaut, 
ein paar Funktionen aufgerufen und schon blubbern am Ausgang analoge 
Werte raus.

Mfg

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.