Forum: Mikrocontroller und Digitale Elektronik AVR32 UC3 - Beispiel für Timer Interrupt


von Henry P. (henrylexx)


Lesenswert?

Hallo,

ich benutze das UC3_EK (bin im Praxissemester und soll mich darin 
einarbeiten).

Ein Interrupt über eine Taste habe ich hinbekommen.
Jetzt wollte ich eine LED über einen Timer-Interrupt blinken lassen,
nur mit der interrupt_avr32.h und der io.h

Hätte jemand einen BeispielCode für mich, die Beispiele von Atmel 
bringen mich da irgendwie nicht weiter.

Ich wäre euch wirklich sehr dankbar!

Beste Grüße
Henry

von Henry P. (henrylexx)


Lesenswert?

Kann mir wirklich keiner einen schnipsel kommentierten quellcode posten 
?!
argh:S

von Karl H. (kbuchegg)


Lesenswert?

> die Beispiele von Atmel bringen mich da irgendwie nicht weiter.

Was genau verstehst du denn daran nicht?

So ein Timer ist doch eine ganz einfache Sache. Zwar nicht für den 
AVR32, aber das Prinzip wird sich nicht so wahnsinnig davon 
unterscheiden:
FAQ: Timer

von cskulkw (Gast)


Lesenswert?

Henry P. schrieb:
> Kann mir wirklich keiner einen schnipsel kommentierten quellcode posten
> ?!

Henry,

welches EK hst Du denn? der L oder das C.

Ich habe ein AT32UC3C-EK. Und komme selbst nicht so voran, wie ich das 
den 8-Bittern gewohnt bin. (Klar, mein Problem ...)

Ich gehe davon aus, dass Du mindestens das AVR-Studio 5.x oder neuer 
benutzt. Darin kannst Du Dir Beispielprojekt aus dem ASF (atmel software 
framework) generieren lassen.

Damit solltest Du eigentlich in Fahrt kommen. Wenn Du etwas ändern 
willst, wirst Du nicht umhin kommen, Dir mühsam alle Defines und 
Deklaration herauszusuchen. Die Doku des ASF ist in dem Punkt nicht sehr 
benutzerfreundlich. Man sei aber dran, es zu verbessern.

Wenn Du Interrupts beim UC3x nutzen willst, dann kommst DU nicht darum, 
den Interruptcontroler mit minimalen Einstellungen zu konfigurieren. Die 
Benutzung der interrupt_avr32.h und io.h allein wird Dich nicht 
weiterbringen. Übrigens hat jeder AVR32 seine eigene ioxxxx.h, die über 
Defines entsprechend selektiert wird.

Wenn Du eine präzise Schilderung Deiner Ausgangslage abgibst, wird man 
Dir sicherlich zielführend weiterhelfen.

...

von Henry P. (henrylexx)


Lesenswert?

Hey,

also ich benutze das selbe Board wie du. - AT32UC3C-EK
ch bin schon seit zwei tagen am googlen und ausdrucken.
Hab mir die Beispiele und auch tc.c/tc.h angeschaut.
In der AVR32119 steht beschrieben wie der Interrupt Handle ausehen 
sollte (für den einfachen timer).

Mein Problem ist jetzt nur wie solle ich diesesn Timer konfigurieren. 
Muss  ich die Waveformen initialisieren wenn ich einfach nur ein 
overflow interrupt haben will ? Eigentlich nicht.
Ich muss Ihm doch aber sagen was ich haben will, wie mach ich das ?


Wie sieht der Start für den Timer aus, so:

AVR32_TC0.channel[0].ccr = 1;

aktiviere ich auch so gleichzeitig den overflowinterrupt ?


und was hat es mit

AVR32_TC0.channel[0].rc auf sich ? /// hier soll sich der aktuelle Wert 
befinden, laut  application not

das sind bisher so die schnippsel dich mir aus dem Timer/Counter Example 
und der tc.c zusammen gesucht habe... ich weiß ich kann lesen aber mir 
ist der zusammen hang zwischen diesen werten nicht klar. was macht das 
ganze..

Ich hab mir das Timer Tut hier angeschaut und versucht das zu übertragen 
aber so wirklich geht das nicht.

Grundsätzlich ist mein ziel, eine LED nicht über eine Funktion mit einem 
delay blinken zu lassen sondern über einen Timer-Interrupt.

meine ISR sieht bisher so aus:

__attribute__((_interrupt_))
static void timer1(void)
{

    //Toggle LED0
  AVR32_GPIO.port[0].ovrt =  1 << AVR32_PIN_PA08;
  //Clear Interrupt Flag
  AVR32_TC0.channel[0].sr;
}

Wahrscheinlich kommt für mich erschwerend hinzu, dass ich allgemein mit 
den UC erst anfange (ich wurde quasi ins kalte wasser gestoßen =) ), und 
der INPUT ist absolut überwältigent...
konntet ihr mir folgen ?

von Henry P. (henrylexx)


Lesenswert?

Ach ja ich benutze:

AVR Studio 5 (wollte eigentlich schon längst auf 6 umsteigen)
und nen JTAG...

von Henry P. (henrylexx)


Lesenswert?

Das channel control register - ccr, beinhaltet:

0: clken - enables the clock
1: clkdis - disabel the clock
2: und swrt- asserts a software trigger if set.

warscheinlich muss ich dann bei clken eine 1 reinschreiben,

dann ist hier noch das channel mode register - cmr-
hier kann man wohl entscheiden obman den

"capture mode" oder
"wave mode" verwenden will,

wobei hier auch wieder etlicht abkürzungen enthalten sind die nicht 
erläutert werden.

von Karl H. (kbuchegg)


Lesenswert?

Henry P. schrieb:

> wobei hier auch wieder etlicht abkürzungen enthalten sind die nicht
> erläutert werden.


Vielleicht könnte dir dieses Dokument helfen
http://www.atmel.com/Images/doc32012.pdf
ein wenig Ordnung in die Abkürzungen zu bringen.

Zumindest kommt das Channel Control Register da drinn vor und auch die 
CLKEN, CLDIS bzw. der Trigger Assert werden angesprochen.

So wie ich das verstehe, hat das UC3 Framework da einfach nur eine 
Softwareschicht drüber gestülpt. Solche Dinge haben aber die Eigenart, 
dass die ursprünglichen Bezeichnungen meistens noch in der einen oder 
anderen Form durchscheinen.

von Henry P. (henrylexx)


Lesenswert?

Das stimmt natürlich, sie AussageKraft ist wahrscheinlich wirklich 
durchsichtiger.
Das Dokument welches du aufführst liegt vor mir ausgedruckt =) ist 
eigentlich auch garn nicht so verkehrt beschrieben, man kann allerhand 
mit dem uc3 anstellen =).... ich hänge glaube mir fehlt einfach das
"wie packe ich diese ganzen information in meinen quellcode" und "welche 
brauche ich überhaupt"

hab hier was gefunden und versuche das mal zu übertragen und anzupassen.

http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=112813


ich weiß man soll eigentlich keinen code kopieren, weil dann das 
verständnis wahrscheinlich viel geringer sein wird. :(

von cskulkw (Gast)


Lesenswert?

Hallo Henry,

oh Mann. Du scheinst ja richtig verzweifelt zu sein.

So, Du benutzt also das AVR-Studio 5.0. Da gibt es unter File/New die 
Möglichkeit Create example from ASF. Danach mußt Du suchen.

Dann mußt die Suchfilter UC3C eingeben und Du erhälst nur die 
Beispielprogramme, die für Dein Board implementiert sind.

Also, es hat keinen Sinn kopflos den Timer zu aktualisieren. Der Timer 
muß mit einem Taktgenerator verbunden werden. Dazu mußt Du wissen, dass 
das Modul PM in Kombination SCIF die Quellen zur Verfügung stellen.
Für den Interrupt mußt Du - wohl oder über - den Interruptcontroler mit 
aktivieren. Denn hier mußt Du eine Adresse zu einem Stück Code anmelden, 
damit der Interrupt zweckmäßig ausgelöst wird.

Das ist nicht wie bei ATmega, wo die Interrupt fest Ansprungadressen im 
Flash haben.

Außerdem muß ein Interruptlevel zugewiesen werden. Auf der Seite 185 / 
186 findest Du die Kanalzuordnung der Timer/Counter. Sie sind der Gruppe 
33 und 34 zugeordnet.

Schau Dir eines der vielen Beispiele an. Da wird ganz genau gezeigt, wie 
alles zusammen hängt.

Sag mal, hast Du das SCIF konfiguriert?
Wenn nein, dann läuft Dein UC3C mit dem internen RC-Oszilator auf 150 
kHz.

Wie gesagt das Ding kann viel. Und man kann viel verstellen. Du wirst 
Dich damit abfinden müssen, dass erst andere Funktionen aktiviert werden 
müssen, bevor Du das ursprüngliche Ziel benutzen kannst.

Du machst Praxissemester? Warum gibt man Dir die Aufgabe ohne Betreuung 
diesen Prozessor zum Laufen zu bekommen? Wo soll die Reise hingehen? CAN 
?

Ich habe den Eindruck, dass Du mal die Gurke zum Fliegen bringen sollst, 
weil andere keine Lust haben, den Controler richtig auf die Reise zu 
schicken.

...

von cskulkw (Gast)


Lesenswert?

Und übrigens ohne Debugger zu programmieren ist möglich, aber sehr sehr 
mühsam. ...

von Henry P. (henrylexx)


Angehängte Dateien:

Lesenswert?

das ist bisher meine main (siehe Anhang, aber irgendwas fehlt noch oder 
habe ich falsch...) wahrscheinlich dass mit dem level...

nein ich habe das scfi nicht konfiguriert, ich schau noch mal in die 
beispiele, danke für den hinweis, da sollte das ja drinne stehen...

von Henry P. (henrylexx)


Lesenswert?

Also ich hab das AT32UC3C-Ek mit dem AT32UC3C0512C mit nem JTAG hier 
liegen.... ( der JTAG ist doch zum debuggen da, oder ?)

ich hab jeden falls immer über breakpoints und dann über die I/O View 
meine register kontrolliert.

es soll eigentlich dahin führen dass ich nene Schrittmotor ansteurn 
soll. eine alternirende bewegung, mit unterschiedlichen frequenzen und 
unterschiedlchen schritten

von Henry P. (henrylexx)


Lesenswert?

irgendwie fehlt auch noch die rechnung... omg :S naja ich muss 
optimistisch bleiben...

von cskulkw (Gast)


Lesenswert?

Henry P. schrieb:
> Also ich hab das AT32UC3C-Ek mit dem AT32UC3C0512C mit nem JTAG hier
> liegen.... ( der JTAG ist doch zum debuggen da, oder ?)

Hi Henry,

mit JTAG meist Du ein elektronisches Gerät, dass über USB mit dem PC und 
einem Pfostenverbinder an der JTAG-Schnittstelle am UC3C-EK verbunden 
ist. Dann wird da wohl ATJTAGICE mkII drauf stehen, oder. Ansonsten hast 
Du nur einen Programmer. Der kann den Prozessor nicht steuern.

static void timer1 (void)
{
    tc_tick++;

    AVR32_GPIO.port[0].ovrt = 1 << AVR32_PIN_PA08; // Toggle LED 0

    AVR32_TC0.channel[0].sr; // Clear the Interrupt Falg
  }
}

Hier ist mir aufgefallen, dass Du das Statusregister aufführst, aber 
nirgends zuweist. So wird es vermutlich nicht gelesen und kann somit 
nicht zum RÜcksetzen bewegt werden.

Jedenfalls hast Du die Interruptroutine den Umständen entsprechend 
ordentlich angemeldet.

Hast Du mal einen Break-Point auf die Interruptroutine gesetzt, um zu 
überprüfen, ob der Prozessor dort hineinspringt?

...

von Henry P. (henrylexx)


Lesenswert?

Guten Morgen,

genau ein ATJTAGICE mkII  nutze ich.

Mit zuweisung des Statusregisters meinst du bestimmt so was:

xy_var = AVR32_TC0.channel[0].sr;

laut Beispiel- Timer/Counter Example 3:
(http://support.atmel.no/knowledgebase/avr32studiohelp/AT32UC3A_Software_Framework/DRIVERS/TC/EXAMPLE3/DOC/html/a00009.html#l00182)

static void tc_irq  ( void    )  [static]
 {
   // Increment the ms seconds counter
   tc_tick++;

   // Clear the interrupt flag. This is a side effect of reading the TC 
SR.
   tc_read_sr(&AVR32_TC, TC_CHANNEL);

   // specify that an interrupt has been raised
   print_sec = 1;
  // Toggle GPIO pin 3 (this pin is used as a regular GPIO pin).
   gpio_tgl_gpio_pin(AVR32_PIN_PA03);

wobei in der tc.c steht:

int tc_read_sr(volatile avr32_tc_t *tc, unsigned int channel)
{
  // Check for valid input.
  if (channel >= TC_NUMBER_OF_CHANNELS)
    return TC_INVALID_ARGUMENT;

  return tc->channel[channel].sr;
}

also brauch ich nur das Statusregister aufrufen, im Timer Tutorial für 
8bit uc wurde eine zuweisung gemacht stimmt... aber hier ist wohl keine 
nötig...


http://www.atmel.com/Images/doc32078.pdf (AVR32119 Getting Stated with 
32-bit AVR UC3...) und hier auf Seite 8 steht auch noch mal so etwas;



Ich hab ein Breakpoint in die Routine gesetzt, aber er springt nicht 
rein, das heißt also dass bei der Initialisierung noch etwas nicht ganz 
richtig ist oder die konfiguration des Times ist nicht korrekt.

...

von Henry P. (henrylexx)


Lesenswert?

Um zu überprüfen ob mein zähler überhaupt zählt, habe ich direkt nach 
der initialisierung des timers eine zuweisung des countervalue gemacht 
und siehe da, erzählt nicht, :S

obwohl ich mir ziemlich sicher bin das meine maskierung stimmt, muss ich 
diese noch mal überprüfen:

AVR32_TC0.channel[0].ier= AVR32_TC_COVFS_MASK | AVR32_TC_CPCS_MASK;

AVR32_TC0.channel[0].ccr= AVR32_TC_CLKEN_MASK | AVR32_TC_SWTRG_MASK;

AVR32_TC0.channel[0].cmr= 
AVR32_TC_TCCLKS_TIMER_CLOCK1|AVR32_TC_WAVE_MASK;

von cskulkw (Gast)


Lesenswert?

Moin Henry,

also wenn Du das Beispiel des TC3 aus dem ASF zitierst, warum bitte 
verwendest Du es nicht?

Henry P. schrieb:
> laut Beispiel- Timer/Counter Example 3:
> (http://support.atmel.no/knowledgebase/avr32studioh...)

Die Beispiele aus dem ASF funktionieren. Da kannst Du dann auch Stufe 
für Stufe überprüfen, was dort gemacht wird und bei Dir fehlt. Mit dem 
Debugger ist das kein Problem.

Ist das hier Dein erster Versuch, µCs zu programmieren?

Henry P. schrieb:
> (AVR32119 Getting Stated with
> 32-bit AVR UC3...)

Also diese App-Note beschreibt die UC3A-Linie. Vorsicht! Ich habe jetzt 
nicht alles gelesen. Aber die UC3Ax's kennen z. B. kein System Control 
Interface SCIF! Das ist ein UC3C-Artefakt.
Auch müssen nicht alle Register genau wie bei UC3Cx vorhanden sein. Man 
muss da leider sehr genau hinschauen.

Kannst Du mir helfen? Ich suche den CDC-Treiber für XP um die VCP vom 
UC3C-Board nutzen zu können.

...

von Clemens M. (panko)


Lesenswert?

Kann es sein, daß du die Timer Clock 1 im Power Manager noch setzen 
musst?

P.S. Ich hab grad mal für den ap7000 nachgeschaut. clk1 ist dort der 32 
kHz Oszillator, ich meine die uc3 haben den nicht notwendigerweise, weil 
die doch den internen rc Oszillator zum starten haben. (das ist 
geraten!) Versuch doch mal clock2 o.ä.

von Henry P. (henrylexx)


Lesenswert?

Mir sind in der TSE_3 zu viele sachen drinne die ich gar nicht 
brauche... aber ich werde mal versuchen mich daran zu hängen.

ich hatte jetzt mal dem counter value vom register eine zuweisunge 
gegeben und sie da, erzählt gar nicht.. also scheint was mit den 
einstellungen des zählerst nicht zu stimmen. also das regeister - 
channel modul register -
wenn ich diese zeile:

AVR32_TC0.channel[0].cmr= 
AVR32_TC_TCCLKS_TIMER_CLOCK1|AVR32_TC_WAVE_MASK;

hinter den defines verbirgt sich folgendes:
AVR32_TC_TCCLKS_TIMER_CLOCK1  0x00000000
AVR32_TC_WAVE_MASK            0x00008000

gegen diese austauche:

AVR32_TC0.channel[0].CMR.capture.tcclks = 1;

zählt er. was ja wirklich eigenartig ist... aber gut ich finde das schon 
irgendwie raus.

Leider kann ich dir bei deinem Problem nicht helfen. Ich habe google mal 
eben gefragt und irgendwie gibt es wohl treiber, aber ich vermute die 
seiten hast du auch schon gelesen aber konnten dir nicht weiter 
helfen...

von Henry P. (henrylexx)


Lesenswert?

so wie es aussieht hilft es wenn ich es aufschreibe.

das define:
AVR32_TC_TCCLKS_TIMER_CLOCK1  0x00000000

stimmt so wie es aussieht nicht mit meinem register überein, es muss 
eine 1 am anfang stehen...

verdammt wie geil... und jetzt geht es auch... und er springt auch in 
die routine... ich sortiere das gleich mal und stelle dann den code noch 
mal in den anhang rein...

von Henry P. (henrylexx)


Angehängte Dateien:

Lesenswert?

das ist jetzt der Quellcode, compiliert und übertragen auf das UC3C_EK,

ergebnis eine dauerbrennende LED, ist ja auch klar, der zähler ist so 
schnell das der ISR ständig ausgelöst, jetzt muss ich nur noch die 
frequenz einstellen...

Hey Clemens wie meinst du das mit dem Timer im Power Manager? das müsste 
doch irgendwie  dann so was sein:

AVR32_PM_....

von Clemens M. (panko)


Lesenswert?

Das ist im Grunde Blödsinn, hätte ich rausnehmen können / sollen. Ich 
dachte der P.S. macht das deutlich.
Ich dachte, daß Timer_clock_1.. im pm noch aktiviert werden muss. Hab 
dann im ap7000 Datenblatt nachgeschaut und dort ist beschrieben, welcher 
Takt welcher "clock_source" entspricht. clock1 ist beim ap7000 der 32 
kHz, clock2 pbb/2 usw.
Meine Vermutung war, daß du clock1 gewählt hast und evtl keinen 
Uhrenquarz dran hast (weil der uc3 meine ich mit seinem rc Oszillator 
hochläuft und der 32 kHZ daher nicht nötig ist).
Da du aber ja mit clock1 nun einen laufenden Timer hast ist wohl alles 
in Butter.

tut mir leid - ein guets Beispiel, nur zu posten, wenn man sich seiner 
Sache sicher ist. Gut gemeintes Gerate erzeugt nur Rauschen und 
bestenfalls Verwirrung.

von Henry P. (henrylexx)


Lesenswert?

da hatte ich wohl ziemlich Glück das ich den genommen habe, sonst hätte 
ich wohl noch länger gebraucht...

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.