Forum: Mikrocontroller und Digitale Elektronik AT91SAM7S Softpack


von Johannes B. (bender)


Lesenswert?

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?!

von gerhard (Gast)


Lesenswert?

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

von Johannes B. (bender)


Lesenswert?

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...

von gerhard (Gast)


Lesenswert?

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

von Johannes B. (bender)


Angehängte Dateien:

Lesenswert?

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.

von gerhard (Gast)


Lesenswert?

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

von Johannes B. (bender)


Lesenswert?

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!

von gerhard (Gast)


Lesenswert?

>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

von Johannes B. (bender)


Lesenswert?

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.

von Johannes Baier (Gast)


Lesenswert?

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

von gerhard (Gast)


Angehängte Dateien:

Lesenswert?

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
Noch kein Account? Hier anmelden.