Forum: Mikrocontroller und Digitale Elektronik AT91 SAM7X EK I/O-Problem


von Tobias (Gast)


Lesenswert?

Hallo ich möchte ein AT91SAM7X EK Board mit einem AT91SAM7X256 in Betieb
nehmen. Habe bisher nur mit 8 Bit Controllern gearbeitet (STK 500).
Will erstmal nur die LED's ansteuern und etwas über die USART
rausschicken usw.
Später muss ich dann über USB die SD-Speicherkarte beschreiben...

Jetzt scheitert es schon bei der Ansteuerung der parallelen I/O Ports.
Mein Problem:
Ich kannte es bisher, dass man ein Datenrichtungsregister schreiben
musste und dann konnte man die Ausgänge setzen.

PDDRA=0xFF;
PORTA=0xAB;

Jetzt sind da gleich 18 Register die beschrieben werden wollen. Und mit
den Erklärungen aus dem Datenblatt komme ich auch nicht so recht
weiter.

Habe mir jetzt erstmal eine Header und ein .c geschrieben um auf die
Register zuzugreifen.

#define START 0xFFFFF600
  volatile int* MY_PIOB_PER   = (volatile int*)(START+0x0000);
  volatile int* MY_PIOB_OER   = (volatile int*)(START+0x0010);
  volatile int* MY_PIOB_SODR  = (volatile int*)(START+0x0030);
  volatile int* MY_PIOB_ODSR  = (volatile int*)(START+0x0038);
  volatile int* MY_PIOB_OWER  = (volatile int*)(START+0x00A0);

Dann habe ich folgende Register wie folgt gesetzt:
  // LED's PB19-PB22
  *MY_PIOB_PER  = 0xFFFFFFFF; // Alle enabled
  *MY_PIOB_OER  = 0xFFFFFFFF; // Ausgang ???
  *MY_PIOB_OWER = 0xFFFFFFFF; // Das ich die beschreiben kann ???
  *MY_PIOB_SODR = 0x00300000; // Wert den ich ueber den Parallelport
ausgeben moechte


Im Debugger (C-Spy [IAR]) sehe ich, dass die Register "richtig"
gesetzt werden. Aber wenn ich das Programm auf den Controller schreibe
(SAM-BA 1.8) fangen die LED's leider nicht an zu leuchten.

Es wäre super wenn mir jemand sagen könnte, welche Register ich wie zu
beschreiben habe.
Gruß Tobias

von speretti (Gast)


Angehängte Dateien:

Lesenswert?

wertz

von Nils (Gast)


Lesenswert?

Hallo Tobias,

warum willst Du das Rad neu erfinden? Die Header gibt es doch schon
alle. Schau doch mal auf

http://www.at91.com/

Da findest Du ein 'Getting Started' und diverse Beispielprojekte
genau für Dein Board und IAR.

Gruß, Nils

von Nils (Gast)


Lesenswert?

Kleiner Nachtrag:

- Hast Du den Watchdog disabled?
- Hast Du den Master Clock eingestellt?
- Hast Du den Clock für PIOA eingestellt? Schau mal in das Kapitel 26
  des Manual (Power Management Controller), PIO funktioniert nur, wenn
  es eingeschaltet ist.
  PIOA hat die Periphal ID 2:
  => PMC_PCER = 0x02;

Nur so ein paar Gedanken.

Nils

von Tobias (Gast)


Lesenswert?

@Nils Erstmal Danke für Deine Antwort.
Hatte in der Header erst nur so ein Strukt gesehen und wusste nicht,
wie ich damit umzugehen hab. Habe jetzt auch die direkten zeiger auf
die Register gefunden.


Zu:

- Hast Du den Watchdog disabled?
- Hast Du den Master Clock eingestellt?
- Hast Du den Clock für PIOA eingestellt?

Nein, nein, nein. Wußte nicht das man dort so viel beachten und
einstellen muss, wenn man nur ein Par Portausgänge setzen möchte.

Okay dann schau ich jetzt nochmal in das Kapitel 26 und zu den
Beispielprojekten.

Vielen Dank für Deine Hilfe.
Das ist alles doch schon ein wenig komplizierter als bei einem 8-Bit
AVR-Controller...

Gruß Tobias

von Tobias (Gast)


Lesenswert?

Hatte jetzt diese ganzen Einstellungen vorgenommen und auch noch eine
Cstartup.c mit eingebunden und es hat sich immer noch nichts getan.
Dann habe ich einfach mal das .bin-file aus einem Beispiel
(BasicIAR)mit SAM-BA auf den Controller geschrieben. In dem Beispiel
sollen die LED's blinken. SAM-BA hat das .bin-file in den Flash
geschrieben und wenn ich danach den Flash mit meinem .bin vergleichen
lasse stimmen sie überein. Aber es Passiert immer noch nichts auf dem
Board.
Muss ich nach dem Programmieren noch etwas beachten? USB abziehen oder
so???
Bin auch schon das getting started für SAM-BA und das Testprogramm
durchgegangen. Bin der Meinung, dass ich das auch alles so gemacht
habe.
Vielen Dank für Eure Hilfe!!!
Gruß Tobias

von Nils (Gast)


Lesenswert?

Hallo Tobias,

soweit ich weiß, sind die Beispiele von IAR für das Board mit dem
SAM7S64. Beim SAM7S256 ist der Flash anders organisiert (64: 512 pages
á 128 bytes / 256: 1024 pages á 256 bytes).

Ist nur eine Idee, aber vielleicht paßt deshalb das .bin-file nicht,
das Du in den Flash geschrieben hast.

Leider benutze ich nicht IAR, deshalb kann ich Dir da wenig Tipps
geben. Aber versuche doch mal, den Beispielcode auf das wesentliche zu
reduzieren und in ein neu erstelltes IAR 256er Projekt zu kopieren.
Also wirklich nur die Routinen für:

-Watchdog disablen
-MCK einstellen
-Periphal Clock einstellen
-PIOA Ports setzen

Kannst Du debuggen? Hast Du einen JTAG-Adapter? Ich habe den hier aus
dem Shop, der läuft super mit Rowley Crossworks.

Gruß, Nils

von Tobias (Gast)


Lesenswert?

Habe leider keinen JTAG Adapter. Kann die Projecte in einem Debugger der
bei IAR dabei ist debuggen (C-Spy). Habe hier vorgeschlagen, dass wir
uns einen JTAG Emulator kaufen. Hatte im Internett einen von
www.segger.com gefunden (J-Link ARM).
Kannst Du mir sagen, wo der Vorteil bei diesen J-TAG Emulatoren
(Kästen) zu den einfachen Verbindungskabeln zwischen Parallelport und
ISP Schnittstelle liegen?

Gruß, Tobias

von Tobias (Gast)


Angehängte Dateien:

Lesenswert?

Habe jetzt eine Anleitung bekommen (Anhang). Hatte vergessen das
Fuse-Bit zu setzen, dass angiebt, dass der Controller aus dem Flash
booten soll.

von Jens D. (Gast)


Lesenswert?


von Tobias (Gast)


Angehängte Dateien:

Lesenswert?

Danke für den Link.

So, dass sollen jetzt auch hoffentlich die letzten Fragen sein...
Kann mir jemand sagen, was hinter folgenden Funktionen aus der
"lib_AT91SAM7X256.h" steckt. Machen die noch mehr außer den
übegebenen Wert ins zugehörige Register schreiben?

z.B.
AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << 2 ) ;

Ich weiß, warum das Rad neu erfinden... Aber ich verstehe einfach
nicht, warum mein Programm nicht läuft, wenn ich den Wert direkt über
einen Zeiger in das Register schreibe. Ich soll für dieses Projekt
nämlich eigentlich auch keine "fremden" header benutzen.
Ich will das Register wie folgt beschreiben.

*MY_PMC_PCER = (1<<2);

Und MY_PMC_PCER ist der Zeiger mit der Adresse von PCER. Siehe
Deklaration:

#define STARTPMC 0xFFFFFC00
volatile int* MY_PMC_PCER  = (volatile int*)(STARTPMC+0x0010);

Wenn ich mein Programm debugge, sehe ich auch, dass in das Register
PCER der Wert 4 geschrieben wird. Aber auf dem Board leuchten die
LED's nicht mehr.

Was mach ich da denn falsch???

Vielen Dank für Eure Unterstützung

Gruß Tobias

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.