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
Kann mir wirklich keiner einen schnipsel kommentierten quellcode posten ?! argh:S
> 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
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. ...
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 ?
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.
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.
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. :(
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. ...
Und übrigens ohne Debugger zu programmieren ist möglich, aber sehr sehr mühsam. ...
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...
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
irgendwie fehlt auch noch die rechnung... omg :S naja ich muss optimistisch bleiben...
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? ...
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. ...
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;
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. ...
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.ä.
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...
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...
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_....
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.