Hallo, ich bearbeite derzeit ein Projekt mit einem AT91SAM7S-EK (bestückt mit AT91SAM7S256). Ich bin schon relativ weit gekommen, habe allerdings an diversen Stellen einige, mir nicht nachvollziehbare Probleme. Ich habe mich damit auch an den Tech. Support von Atmel gewendet. Die Antwort ist in der Regel immer: "Das Problem ist kein bekannter Bug, installier das Softpack und schau in den Beispielen nach". Ich habe mein Projekt allerdings auf Basis eines IAR Beispielcodes gestartet (BasicTools). Das Softpack von Atmel verwendet allerdings eine andere Libary etc, anderen Startup-Code... Um für die Zukunft gerüstet zu sein würde mich interessieren, ob und wenn ja welche fertige Library / Startup-Code etc. Ihr verwendet?!
hallo johannes, im wesentlichen stammen alle beispiele von atmel (auch die IAR Beispiele). allerdings gab es soweit mir bekannt 3 verschiedene "philosophien" wie solche software packages aufgebaut sind. wenn du ewarm v5 verwendest solltes due die software packages von atmel verwenden. gruss gerhard
das hatte ich vergessen: Ich verwende Die Embedded Workbench 5.0
Kickstart.
>> 3 verschiedene "philosophien"
Das Trifft es schon sehr gut und genau das ist mein Problem. Es gibt
verschiedene Beispiele die von Atmel zitiert werden bzw. in den
verschiedenen Foren kursieren und alle passen nicht richtig zusammen.
Das Softpack (also die lib) des BasicTools-Beispiels das ich jetzt
einsetze ist mit dazu passender HTML-Doku sehr gut dokumentiert. Die
jetzigen Code-Beispiele die mir Atmel genannt hat sind allerdings ganz
anders aufgebaut: Es gibt jetzt "peripheral"-Ordner, in der die ganzen
Lib-Funktionen aufgeteilt sind...
hallo, aus meiner sicht ist die lib-lösung (lib_AT91SAM7Sxxx.h bzw. AT91SAM7Sxxx.h) auch in ordnung da (wie du schon erwähnt hast) die html-doku die lib ausreichend beschreibt. fehler sind meiner erfahrung nach keine in der lib. welche probleme hast du denn? gruss gerhard
gerhard wrote:
> welche probleme hast du denn?
Ich denke meine Probleme liegen nicht an der Lib. Ich wollte nur mein
jetziges Projekt in die "neue Machart" des Atmel Softwarepack
integrieren, um nachzuvollziehen ob die Probleme eventuell am falschen
Startup oder dergleichen liegen.
Derzeit habe ich zwei Probleme:
1) Der PWM Kanal wechselt seine Polarität
Das Problem ist in der Errata beschrieben: Wenn man 0 oder 1 als Duty
Cycle vorgibt (im left aligned mode) wird die Polarität unter umständen
getauscht. So nicht schon schlecht genug: Bei mir macht er das auch,
wenn ich den Maximalwert eingebe. In meinem Fall 1024.
Ich habe mir jetzt so beholfen, dass ich nur Werte zwischen 2 und 1023
einstelle. Schön ist das nicht und zudem liegt laut Atmel das mit der
oberen Grenze an mir.
2) Interrupt, speziell beim PIT
Ich habe den Code für Wait() bzw. Timestamp-Funktionen etc. aus einigen
Beispielen zusammengenommen (pit.c von Atmel etc.). Ich werte in einigen
Funktionen den Timestamp, der von einer ISR des PIT erhöht wird aus. Ich
denke das Beispiel ist bekannt.
Das hat auch ganz wunderbar funktioniert, ich habe allerdings manchmal
das Problem, dass der Interrupt nicht abgearbeitet wird. Beim AIC ist
allerdings auch alles richtig eingestellt, soweit ich das beurteilen
kann.
Ich habe als Anhang einen Screenshot der betreffenden Register. Man
sieht genau das der Interrupt ansteht (PITC_PITS = 1), aber er wird
nicht bearbeitet, dadurch hängt sich die erste Warteschleife auf und das
ganze Programm läuft nicht.
Wie gesagt: Das mysteriöse ist: Es hat bereits alles funktioniert, ich
habe seitdem auch nicht wirklich etwas verändert. Das letzte was ich
machen wollte war das Verwenden des PWMC-Interrupts (ich will eine
Strommessung mit dem PWM-Signal synchronisieren). Aber den neuen Code
habe ich komplett wieder auskommentiert.
Es geht einfach nichtmehr. Am Anfang hatte ich das auch, da ging es
allerdings (auch wie von Geisterhand) wieder. Ich weiß: Ein Controller
macht nicht's von Geisterhand, ich habe glaube ich nur ein Brett vor dem
Kopf.
Was ich mir vorstellen könnte: Generell sind die Interrupts
abgeschalten, aber am Startup-Code etc. habe ich definitiv nichts
geändert...
Falls du Code brauchst kann ich den gerne posten.
Vielen Dank schonmal für die Hilfe.
hallo, zu 1) da kann ich nichts dazu sagen zu 2) das problem mit dem pit könnte an der initialisierung liegen. unbedingt folgende zeilen in deine init.funktion einfügen (bevor der interrupt freigegeben wird):
1 | dwstatus = AT91C_BASE_PITC->PITC_PIVR; |
2 | AT91C_BASE_AIC->AIC_EOICR = dwstatus; |
gruss gerhard
Code eingefügt, und siehe da: Es geht. Hoffentlich líegt es auch daran und nicht wieder an der "temporären Geisterhand". Kurze Farge zu dem Code-Schnippsel: Kannst du erklären was das soll? ich meine. PIVR: aktueller Zählwert des PIT und das EOICR Register: End of Interrupt Command Register, laut Datenblatt: The End of Interrupt Command Register is used by the interrupt routine to indicate that the interrupt treatment is complete. Any value can be written because it is only necessary to make a write to this register location to signal the end of interrupt treatment. Frage 1): Warum schreiben wir einen Wert da rein? Wir wollen (entschuldige mein bescheidenes technisches Englisch): "das Ende der Interrupt-Behandlung anzeigen"?! Frage 2): Laut text ist es egal welcher Wert geschrieben wird, richtig? Frage 3): Muss man das bei jeder Interrupt-Initialisierung machen? Danke schon mal vielmals!
>Code eingefügt, und siehe da: Es geht. >Hoffentlich líegt es auch daran und nicht wieder an der "temporären >Geisterhand". das funkt jetzt bis in alle ewigkeit! >Frage 1): Warum schreiben wir einen Wert da rein? >Frage 2): Laut text ist es egal welcher Wert geschrieben wird, richtig? >Frage 3): Muss man das bei jeder Interrupt-Initialisierung machen? die antworten auf deine fragen findest du unter folgendem link, 3. letztes posting: http://www.at91.com/samphpbb/viewtopic.php?f=15&t=1040&hilit=PITC_PIVR gruss gerhard
Hallo nochmal, ich stehe etwas auf dem Schlauch. Mein eigentliches vorhaben den PWMC Interrupt zu verwenden scheitert an der selben stelle. Ich denke das ich da noch einen Fehler mit dem "Debuger-Fix-Code" habe:
1 | void PWMC_ConfigureChannelInterruptStandard( unsigned int channel ) |
2 | {
|
3 | |
4 | int channel_id; |
5 | int dwstatus; |
6 | |
7 | switch(channel) { |
8 | case 0: channel_id = AT91C_PWMC_CHID0; |
9 | break; |
10 | case 1: channel_id = AT91C_PWMC_CHID1; |
11 | break; |
12 | case 2: channel_id = AT91C_PWMC_CHID2; |
13 | break; |
14 | case 3: channel_id = AT91C_PWMC_CHID3; |
15 | break; |
16 | }
|
17 | |
18 | // EOICR Register mit einem Wert beschreiben
|
19 | dwstatus = AT91C_BASE_PWMC->PWMC_CH[channel].PWMC_CCNTR; |
20 | AT91C_BASE_AIC->AIC_EOICR = dwstatus; |
21 | |
22 | AIC_DisableIT(AT91C_ID_PWMC); |
23 | AIC_ConfigureIT(AT91C_ID_PWMC, AT91C_AIC_PRIOR_LOWEST, ISR_PWMC); |
24 | AIC_EnableIT(AT91C_ID_PWMC); |
25 | PWMC_EnableChannelIt(channel_id); |
26 | |
27 | }
|
Sobald ich die Funktion aufrufe geht alles wieder nicht mehr, da er die Interrupts nicht abarbeitet. Was mache ich falsch? Die PWM-Channels werden in einer anderen Funktion initialisiert. Hier nur der Interrupt.
Hallo nochmal, kann mir irgendjemand weiterhelfen? Ich hänge leider immer noch an der Sache und alles was ich probiert habe funktioniert nicht. Habe auch nichts mehr im Internet gefunden. Vielen Dank für eure Hilfe Gruß Johannes
hallo, anbei ein älteres atmel-beispiel in dem pwm und interrupts verwendet weren. gruss gerhard
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.