Forum: Mikrocontroller und Digitale Elektronik PIO AT91SAM7


von Jürgen Graff (Gast)


Lesenswert?

hi Leute
Kann mir jemanden erklären, wie ich I/O Pins von AT91SAM7S256
konfigureiren kann
es gibt viele register(PIO_SODR,PIO_OSR....) und das macht mich
durcheinander
ich möchte nur 10 pins als outputs haben
vielen Dank

von Stefan G. (stefan8051)


Lesenswert?

Hallo,
ich arbeite mit WinARM und mache es so: Es sind nur 4 Routinen, ich
denke selbserklärend was sie tun, bzw steht ja auch drüber.


//##########################################################
//Ein Byte auf den Datenbus legen
void WRITE_DATA(char daten)
{
AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, LCD_DATAMASK ) ;
AT91F_PIO_SetOutput( AT91C_BASE_PIOA, daten * D0) ;
}

//##########################################################
//Datenbus auf Eingang schalten
void DATA_DIR_IN()
{
AT91F_PIO_CfgInput(AT91C_BASE_PIOA, LCD_DATAMASK);
}

//##########################################################
//Datenbus auf Ausgang schalten
void DATA_DIR_OUT()
{
AT91F_PIO_CfgOutput( AT91C_BASE_PIOA, LCD_DATAMASK | LCD_CONTROLMASK )
;
}

//##########################################################
//Datenbus lesen
char READ_DATA()
{
return (AT91F_PIO_GetInput( AT91C_BASE_PIOA ) / D0) ;// >>13
}


das dazugehörige Header File so:

/*-----------------*/
/* Port Definition */
/*-----------------*/
/*                                 PIO  */
#define D0            (1<<13)  /* PA13 */
#define D1            (1<<14)  /* PA14 */
#define D2            (1<<15)  /* PA15 */
#define D3            (1<<16)  /* PA16 */
#define D4            (1<<17)  /* PA17 */
#define D5            (1<<18)  /* PA18 */
#define D6            (1<<19)  /* PA19 */
#define D7            (1<<20)  /* PA20 */

#define LCD_DATAMASK    (D0|D1|D2|D3|D4|D5|D6|D7)

mfg
Stefan

von romanua (Gast)


Lesenswert?

#define r0PIOA_BASE r0
      ldr r0PIOA_BASE, =PIOA_BASE


      @;PIO or Perepherial Control->PIO------------------------
      ldr r1, =PIOA_PER_P17|PIOA_PER_P18
      str r1, [r0PIOA_BASE,#PIOA_PER_OFFSET]


      @;pull-up off--------------------------------------------
      ldr r1, =PIOA_PUDR_P17|PIOA_PUDR_P18

      str r1, [r0PIOA_BASE,#PIOA_PUDR_OFFSET]



      @;output for pins PIA 17-18------------------------------
      ldr r1, =PIOA_OER_P17|PIOA_OER_P18
      str r1, [r0PIOA_BASE,#PIOA_OER_OFFSET]

So geht es in ASM (Crossworks bzw GCC) fuer Pin 17 und 18.

von Stefan J. (Gast)


Lesenswert?

Das ist ja klasse!!! Genau das brauch ich auch. Könnt ihr das (brauch
nur einen Port) auch in ASM posten? C ist leider überhaupt nicht meine
Welt. Und wenn ich mir das Listing vom C - Code anschaue nach dem
compilen, dann verwirrt mich das nur. Ich lese da überhaupt nichts
heraus...

von Dietmar (Gast)


Lesenswert?

@Stefan J:

Ist beim C-Compiler die Option "Assembler-Listing" eingestellt?

Sonst sieht man da natürlich nichts....

von Stefan J. (Gast)


Lesenswert?

Also wenn ich den C-Code compiliere, öffnet sich bei mir automatisch ein
"Disassembly"-Fenster . Da hätt ich dann mein ASM-Code. Das Problem
ist nur, dass ich im ASM-Code keine menschliche Logik erkenne. Und das
Listing habe ich dann natürlich auch. Es ist wirklich nur so, dass ich
mit dem disassemblierten C-Code nichts anfangen kann. Ich bräuchte
einen geschriebenen Code. Das wäre klasse....nur find erst mal
einen....

von romanua (Gast)


Lesenswert?

Hallo,

Was genau willst Du in ASM haben?

von Stefan J. (Gast)


Lesenswert?

Hallo,

ich möchte eigentlich nur ein kleines Programm in ASM, welches den PORT
P0 AUF HIGH und wieder AUF LOW schaltet. Hab Erfahrung mit dem MSP430.
Da hatte ich keine Probleme mit der Peripherie. Jetzt möcht ich mich in
den AT91SAM7 reinarbeiten und bin doch überrascht wie unterschiedlich
seine Architektur ist. Auch sind mir diese Cstartup-Files neu. Beim
MSP430 brauchte ich ja keine. Ports initialisieren und fertig. Jetzt
übe ich grad mit dem Atmel µC, aber auf der Hardware geht gar nichts.
Das heißt, Programm läuft, aber der scheint auf seine Begehle nicht zu
reagieren.
Man muss aber auch sagen,ich hab NUR versucht einen Port zu init und
anzusteuren. Ich habe nichts mit diesen Startup-Files gemacht (hab sie
weggelassen weil ich meine, das läuft auch ohne, also mit
Standard-Einstellungen eben....außerdem weiß ich auch nicht was ich mit
diesen Startup-Files machen soll)

von mthomas (Gast)


Lesenswert?

Im Zweifel macht man mit den Startup-Files garnichs und nimmt sie
erstmal so wie sie sind aus Beispielen. Spaeter kann man immer noch
daran herumbasteln, wenn man etwas mehr gelernt hat. In den
Keil-Beispielen findet man "reinen" Assembler-Startup. Atmel trennt
in deren Beispielen die Initialiserung ueblicherweise in eine minimalen
Assembler-Teil und ruft sobald moeglich eine C-Routine fuer die restlich
Initialisierung. Fuer reine Assemblerentwicklung koennte statt BX main
seinen eigenen Assembler-Code reinbasteln bzw. eine Assembler-Routine
auszurufen (bx meine_routine, im asm-Code .global
meine_routine/.function maine_routine).
(Einen ARM/SAM7 aussschliesslich in Assembler zu programmieren, ist
schon eine anerkennenswerte Selbstkasteiung - viel Erfolg)

Martin Thomas

von romanua (Gast)


Lesenswert?

Hallo, mit startup scripts kann ich dir leider nicht helfen, weil ich
meine eigenen benutze.

Als minimal Startup, brauchst Du nur den Watchdog zu deaktivieren.

@---------------------------------------------------
#define PIO_BASE              xxx
#define PIO_CODR_OFFSET       xxx
#define PIO_SODR_OFFSET       xxx
#define PIO_OER_OFFSET        xxx
#define PIO_PER_OFFSET        xxx
@-----------------------------------------------------

@Disable Watchdog ----------------------------------------------
        ldr r0, =0xFFFFFD44                @; load Watchdog address
        ldr r1, =0x8000                    @; mask Disable bit
        str r1, [r0]                       @; Watchdog disabled
@-----------------------------------------------------------

@Zu P0:


      ldr r0, =PIO_BASE

      @PIO or Peripherial Control->PIO------------------------
      ldr r1, =1
      str r1, [r0,#PIO_PER_OFFSET]


      @pull-up off (wenn man das braucht)---------------------
      ldr r1, =1
      str r1, [r0,#PIO_PUDR_OFFSET]



      @P0 Als output konfigurieren --------------------------
      ldr r1, =1
      str r1, [r0,#PIO_OER_OFFSET]

@So jetzt ist P0 als output konfiguriert.

loop:
@Zum Setzen folgendes ausfuehren:

      ldr r1, =1
      str r1, [r0,#PIO_SODR_OFFSET]

@Zum Zuruecksetzen folgendes ausfuehren:

      ldr r1, =1
      str r1, [r0,#PIO_CODR_OFFSET]

b loop



/*Die Werte fuer  PIOA_CODR_OFFSET usw. musst Du in Manual anschauen*/

von Dietmar (Gast)


Lesenswert?

@mthomas:

Selbstmord auf Raten ist das!!! Aber, wenn man ARM Assembler als
Aufgabenstellung für ein Projekt hat?

Dachte auch erst, na super, RISC Befehlssatz, klein, kompakt, kannte
ich noch vom PIC. Und beim ARM: der Teufel soll es holen!!!
Vom PIC oder 8051 ist man da sehr verwöhnt. Aber gelegentlich muß man
schon mal was in Assembler schreiben, und wenn es z.B. ein direkter
Zugriff auf den ARM-Core ist (z.B. Anfügen der Spurious Interrupt
Behandlung direkt in der Startup.s am Interruptvektor, o.ä.).

Gruß

Dietmar

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.