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
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
#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.
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...
@Stefan J: Ist beim C-Compiler die Option "Assembler-Listing" eingestellt? Sonst sieht man da natürlich nichts....
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....
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)
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
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*/
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.