mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AVR32 UC3 Beispielscode


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Manuel Z. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Zusammen

Ich habe ein eigenes Board erstellt, auf welchem ich den AT32UC3C064C 
32-Bit Controller von Atmel verwende. Nun suche ich einen Beispielcode 
fürs Atmel Studio 6, mit welchem ich jeder IO's nur als GPIO verwenden 
kann.

Ich kenne mich nur mit den 8bit Controllern von AVR aus und komme mit 
den 32bit Controllern überhaupt nicht zu schlag. Mit dem Atmel Framework 
und den dazugehörigen Beispielen komme ich auch nicht viel weiter. Zudem 
sind auch im Internet sehr wenige (für mich geeignete) Tipps vorhanden.

Vor allem die korrekte Initialisierung (CPU, Clock etc) gibt mir zu 
schaffen.

Immerhin wird der uC schon einmal via JTAG am PC erkannt. Für weitere 
Details, bzw uC Belegung (quarz, power etc) kann ich gerne Auskunft 
geben.

Hat jemand von euch bereits so einen verwendbaren und übersichtlichen 
Code oder hilfreiche Tipps? Am liebsten wäre mir ein Projekt dazu.

Ich wäre euch sehr dankbar.
Freundliche Grüsse Manuel

Autor: Basti B. (basti195) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sers,
ich hatte das Selbe Problem. Deshalb habe ich mein erarbeitet Wissen in 
einem Tutorial zusammengefasst :)
http://www.mikrocontroller.net/articles/AVR32-Tutorial
Jedoch habe ich versucht komplett auf das ASF zu verzichten.
Hoffe das hilft dir soweit weiter und sollte dir was einfallen, wie man 
es verbessern könne melde dich einfach

Grüße
basti

: Bearbeitet durch User
Autor: Manuel Z. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sebastian B. schrieb:
> Sers,
> ich hatte das Selbe Problem. Deshalb habe ich mein erarbeitet Wissen in
> einem Tutorial zusammengefasst :)
> http://www.mikrocontroller.net/articles/AVR32-Tutorial


Besten Dank schon einmal dafür!
Ich werde mich heute damit befassen.

Danke & Gruss
Manuel

Autor: Manuel Z. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nochmals Hallo Basti

Ich habe kurz dein tolles Tutorial angeschaut.
Viele Infos waren mir nützlich, allerdings würde mich gerne 
interessieren wie du dein uC initialisiert hast. Welcher Clock-Eingang 
(Quarz etc.) hast du verwendet und welche #includes sind notwendig?
Hast du eine Vorlage dazu fürs Atmel Studio 6? Ich scheitere schon an 
der Erstellung eines entsprechenden Projekts.

Ich wäre dir sehr dankbar
Gruss Manuel

Autor: Holger K. (holgerkraehe)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Manuel Z. schrieb:
> (Quarz etc.) hast du verwendet und welche #includes sind notwendig?
> Hast du eine Vorlage dazu fürs Atmel Studio 6? Ich scheitere schon an
> der Erstellung eines entsprechenden Projekts.
>
> Ich wäre dir sehr dankbar
> Gruss Manuel

Hallo Manuel

Am besten du beginnst zuert mal damit eine LED Blinken zu lassen.
Wenn du es schon nicht fertig bringst, ein eigenes Projekt zu erstellen, 
dann wird das mit dem konfigurieren der Clocks nie was!

Ausserdem erwartest du mal wieder von der Community, dass diese dir 
alles auf einem Silbertablett serviert! "Vorlage für Studio 6"...

Arbeite dich erst einmal in die Grundlagen der Mikrocontroller ein.
Dazu nimmst du am besten einen Atmega8.

Wenn du diese einmal verstanden hast, dann kannst du dich mal an einen 
Atxmega heranwagen.

Und erst dann einen 32Bitter wie den UC3...

Erst krabbeln dann gehen!

Autor: lerner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nachtrag zur Register Repräsentation. Ich habe zwar statt des uc3 damals 
den ap7000 im Fokus gehabt, aber das sollte nichts ändern. Ich fand 
deine Beschreibung der Registerzugriffe etwas zu "handwerklich". 
Natürlich kannst du auch anders auf die Register zugreifen. Wenn du die 
Adresse weißt (sei es durch eigenes Ausrechnen oder sonstwoher)

Das Beispiel des Timers. Die Basisadresse von z.B. Timer0 steht im (ok 
jetzt falschen) ap7001.h: Da kannst du wenn du lustig bist schon mit 
auskommen.
#define AVR32_TC0_ADDRESS                  0xFFF00C00
#define AVR32_TC0                          (*((volatile avr32_tc_t*)AVR32_TC0_ADDRESS))

Um es leichter zu machen gibt es dann in den Perepherieheadern noch mal 
exaktere Strukturen zur Hardware. Für den Timer z.B. in tc_221.h:
typedef struct avr32_tc_t {
  avr32_tc_channel_t channel[3];//0x0
  union {
          unsigned long                  bcr       ;//0x00c0
          avr32_tc_bcr_t                 BCR       ;
  };
  union {
          unsigned long                  bmr       ;//0x00c4
          avr32_tc_bmr_t                 BMR       ;
  };
          unsigned int                   :32       ;//0x00c8
          unsigned int                   :32       ;//0x00cc
          unsigned int                   :32       ;//0x00d0
          unsigned int                   :32       ;//0x00d4
          unsigned int                   :32       ;//0x00d8
          unsigned int                   :32       ;//0x00dc
          unsigned int                   :32       ;//0x00e0
          unsigned int                   :32       ;//0x00e4
          unsigned int                   :32       ;//0x00e8
          unsigned int                   :32       ;//0x00ec
          unsigned int                   :32       ;//0x00f0
          unsigned int                   :32       ;//0x00f4
          unsigned int                   :32       ;//0x00f8
  union {
    const unsigned long                  version   ;//0x00fc
    const avr32_tc_version_t             VERSION   ;
  };
} avr32_tc_t;

Da siehst du dann direkt woher die Schreibweise kommt. das halte ich für 
besser als das als Kochrezept anzugeben.
Interessant/hilfreich/wichtig finde ich auf jeden Fall hinzuweisen, das 
in der Struktur avr32_tc_t ein Register in den Unions einmal groß- und 
einmal klein geschrieben auftaucht. Zu merken wäre, dass KLEINES 
Register dem 32 register entspricht und das Register in GROSS ein 
Bitfeld repräsentiert, wo die bits ausgeschrieben angeschprochen werden 
können.

also AVR32_TC0.chanel[1].ccr = 1<<8;
gegen AVR32_TC0.chanel[1].CCR.clken = 1;


Aber echt Daumen hoch fürs anpacken!!! Die avr32 sind wirklich etwas 
schlecht präsent für Ein- und Umsteiger. Halte ich für eine sehr gute 
Idee die auch im Wiki einzupflegen. Ich werde mit dem Framework von 
Atmel allerdings nicht so schrecklich warm (das mag an meiner 
Begriffsstutzigkeit liegen oder an der Art der Dokumentation und 
Erklärung oder an sonstwas - ist ja auch egal) und daher benutze ich sie 
gar nicht mehr.

Autor: lerner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Offsetadressen sind in Headern erfreulicherweise angegeben. Das kann 
man direkt mit den Angaben im User Interface vergleichen.

Bei einiger Hardware war die Beschreibung im Datenblatt was Kanäle und 
Adressen geht echt mäßig. Der Timer ist sehr gut zum Einstieg.

Autor: Manuel Z. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Holger Krähenbühl schrieb:
> Ausserdem erwartest du mal wieder von der Community, dass diese dir
> alles auf einem Silbertablett serviert! "Vorlage für Studio 6"...

Hallo Krähe Holger

Ich kenne mich mit den 8bit Controllern von Atmel mittel bis gut aus, 
jedoch habe ich nirgends geschrieben das ich eine Lösung ERWARTE.

Schon nur eine LED zu blinken, wie du vorschlägst, wäre mir extrem 
nützlich. Aber Atmel muss dafür ja zirka 100 .c & .h sowie diverse 
#includes verwenden, die einen Einstieg in die 32Bit Welt extrem 
erschweren.

Erst überlegen dann reklamieren!

Autor: lerner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So und als letztes: doch noch etwas vom uc3 gefunden :-) Ich hatte mir 
einmal so ein kleines Breakout Board von Alvidi gekauft. Aus o.g. 
Gründen ist das aber verstaubt.

Ich teile schon die Ansichten, dass man nicht alles aus dem Nichts 
können wollen kann. Aber ich weiß auch wie beschissen es ist wenn man 
hängt und Starthilfe braucht. Der Code benutzt aber das api. Also z.B. 
hinter configure_clocks stecjt eine ganze Menge.
Vielleicht kannst du mit dem Testprogramm was anfangen. Ich habe es 
nicht mehr durchgesehen. Aber besser als nichts.
#include <avr32/io.h>
#include "compiler.h"
#include "stdio.h"
#include "gpio.h"
#include "pm.h"
#include "flashc.h"
#include "intc.h"
#include "rtc.h"

#include "math.h"

volatile unsigned int ms_count;

__attribute__((__interrupt__))
static void rtc_int()
{
  volatile struct avr32_rtc_t* timer = &AVR32_RTC;

  ms_count++;
  timer->ICR.topi = 1;
}

void wait_ms(unsigned int time)
{
  unsigned int bla = ms_count + time;

  while(ms_count < bla){;}
}

void setup_ms_counter(void) //naja pseudo ms-Counter
{
  volatile struct avr32_rtc_t* timer = &AVR32_RTC;

  //Ich versuche mal die api Funktionen.
  rtc_init(timer, RTC_OSC_32KHZ,  0);
  rtc_set_top_value(timer, 16);
  rtc_enable(timer);

  Disable_global_interrupt();
  INTC_register_interrupt(&rtc_int, AVR32_RTC_IRQ, AVR32_INTC_INT3); //Prioritäten nachgucken
  Enable_global_interrupt();

  rtc_enable_interrupt(timer);
}
//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

void init(void)
{
//clocks
  pm_freq_param_t par = {
      .cpu_f = 60,
      .pba_f = 30,
      .osc0_f = 12,
      .osc0_startup = 128,
  };
  flashc_set_wait_state(1);
  pm_configure_clocks(&par);

  INTC_init_interrupts();

//timer for ms_tick
  setup_ms_counter();
}

int main(void)
{
  volatile avr32_gpio_port_t *gpio_port = &AVR32_GPIO.port[1];
  U32 bla=0x7, hin = 0x01;

  init();

  gpio_port->gpers = 0xffffffff;   //periph controller ist chef
  gpio_port->oders = 0xffffffff;   //init an
  gpio_port->ovrs  = bla;     //output driver 

  while(1){
    //for(i=0; i<CLK_CNT; i++);
    wait_ms(10);
    if(hin)
    {
      bla = bla << 1;
      if(bla >= 0x800000)
        hin=0;
    }
    else
    {
      bla = bla >> 1;
      if(bla <= 0x7)
        hin=1;
    }
    gpio_port->ovr = bla;
  }
}



Vielleicht etabliert sich der avr32 ja hier im Forum wie die 8 bitter. 
Vielleicht werde ich ja zu Kreuze kriechen und meinen Ausstieg von den 
Prozessoeren revidieren :-)

Autor: Manuel Z. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
lerner schrieb:
> So und als letztes: doch noch etwas vom uc3 gefunden :-) Ich hatte mir
> einmal so ein kleines Breakout Board von Alvidi gekauft. Aus o.g.
> Gründen ist das aber verstaubt.

Dankeschön! Schaue mir dies an
Gruss Manuel

Autor: Jerome M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@lerner

Die Include files welche du verwendest

lerner schrieb:
> #include "gpio.h"
> #include "pm.h"

Sind die aus den Atmel app notes?

Autor: Tom74 (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ahm,
ich schlage mich auch schon seit Monaten mit den AVR32UC3 rum. Hab hier 
ein ein EVK1100-Board von Atmel.

Wenn man das AtmelSoftwareFramework verwendet ist es ein wenig leichter, 
weil man in den AppNotes für alles Beispiele findet.

Prinzipiell funktioniert alles wie auf einem 8Bit-µc, es ist nur alles 
ein "wenig" komplexer. Man hat seine Register, beschreibt die und wenn 
man alles richtig gemacht hat funktioniert es. (Vielleicht)

Hab mal ein Projekt angehängt, welches nur LEDs steuert und Tasten 
abfragt. (Ja, die Tastenabfrage ist noch ohne Entprellung.)


@Sebastian:
Tolles Tutorial! Hätte mir ein Haufen Zeit gespart, wenn ich es gekannt 
hätte. Vor allem der rot umrahmte Hinweis bei Hardwarefunktionen den 
Gper-Pin zu deaktivieren. Ich war am verzweifeln, bis endlich die 
SPI-Schnittstelle lief.
Arbeitest du noch weiter an dem Tutorial?

Autor: Basti B. (basti195) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Damit du die Clock erst einmal initialisieren kann must du Verstehen, 
wie die Register aufgebaut sind. dann musst du dich mit dem Teils 
Schlecht dokumentieren Datenblatt herumschlagen.
hier der Code für den RC Oscillator:

  //Rc enable
  AVR32_SCIF.unlock =  0x0058 << AVR32_SCIF_UNLOCK_ADDR| 
0xAA<<AVR32_SCIF_UNLOCK_KEY;
  AVR32_SCIF.rc120mcr = 0xff; //enable 120mhz oszilator

  AVR32_PM.unlock = 0xAA << AVR32_PM_UNLOCK_KEY   | 0x004 << 
AVR32_PM_UNLOCK_ADDR;
  AVR32_PM.cpusel = 1<< AVR32_PM_CPUSEL_CPUDIV | 2<< 
AVR32_PM_CPUSEL_CPUSEL; //pba auf ein 6 von mainclock  hier ist auch twi 
drinnen

  AVR32_PM.unlock = 0xAA << AVR32_PM_UNLOCK_KEY  | 0x000 << 
AVR32_PM_UNLOCK_ADDR;
  AVR32_PM.mcctrl = 3; //clocksurce auf RC-oszilator umstellen

Autor: lerner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die header sind die, die damals in dem Framework enthalten waren.

Autor: lerner (Gast)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Und uc3a. Also wenn sich der thread um exklusive Hardware der Neueren 
dreht, natürlich irgendwie weniger hilfreich... Hoffe ich habe jetzt 
nicht noch Verwirrung gestiftet.

Autor: Manuel Z. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sebastian B. schrieb:
> Damit du die Clock erst einmal initialisieren kann must du Verstehen,
> wie die Register aufgebaut sind. dann musst du dich mit dem Teils
> Schlecht dokumentieren Datenblatt herumschlagen.
> hier der Code für den RC Oscillator:

Danke!

Tom74 schrieb:
> Hab mal ein Projekt angehängt, welches nur LEDs steuert und Tasten
> abfragt. (Ja, die Tastenabfrage ist noch ohne Entprellung.)

Vielen Dank dafür!



Hallo Zusammen

Ich habe es nun tatsächlich unter anderem dank Tom74's Code geschafft 
eine LED zum leuchten zu bringen.

Ich danke euch sehr für all eure Tipps & Tricks.
Nun sollte ich selbst zu schlag kommen mit den weiteren Pins (TWI etc.).

Gruss Manuel

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.