Forum: Mikrocontroller und Digitale Elektronik at91sam7 - Hello World zu langsam ?


von Peter Pippinger (Gast)


Lesenswert?

Hallo NG,

nach langem hin und her und Hilfe hier aus dem Forum blinkt meine LED 
jetzt endlich! Ich habe allerdings das gefühl, dass sie das viel zu 
langsam tut (ca. 1x an und aus pro Sek.).

Weis jemand, was der auskommentierte Bereich "ENABLE PIT" bedeutet?

der Quelltext sieht so aus (IAR workbench):

        NAME    main

        PUBLIC  main

        COMMON  INTVEC:CODE
        CODE32

        B       main


        RSEG    ICODE:CODE
        CODE32

main:   NOP

// 
#######################################################################
//  It is assumed that a led is connected to PIOA17.
//  Adjust the code if your hardware is set up differently.
// 
#######################################################################

#define WDT_MR    0xFFFFFD44
#define WDT_MR_WDDIS  0x8000

#define PIT_MR    0xFFFFFD30
#define PIT_MR_PITEN_BIT  24
#define PIT_MR_PIV_BIT  0

#define PIOA_BASE    0xFFFFF400
#define PIOA_PER_P17  0x20000
#define PIOA_PER_OFFSET  0x0
#define PIOA_OER_OFFSET  0x10
#define PIOA_SODR_OFFSET  0x30
#define PIOA_PDSR    0xFFFFF43C
#define PIOA_CODR_OFFSET  0x34

// #define PIT_SR      0xFFFFFD34
// #define PIT_PIVR    0xFFFFFD38

// Startup code begin
// Disable Watchdog
// 
-----------------------------------------------------------------------
  ldr r0, =WDT_MR // load Watchdog address
  ldr r1, =WDT_MR_WDDIS // mask Disable bit
  str r1, [r0] // Watchdog disabled
// 
-----------------------------------------------------------------------
//Startup code end

// Enable PIT 
------------------------------------------------------------
//  ldr r0, =PIT_MR // PIT mode address
//  ldr r1, =1<<PIT_MR_PITEN_BIT|0xFFFFF<<PIT_MR_PIV_BIT
//  str r1, [r0]
// 
-----------------------------------------------------------------------

#define r0PIOA_BASE r0
  ldr r0PIOA_BASE, =PIOA_BASE

// PIO  control for pin 17
// 
-----------------------------------------------------------------------
  ldr r1, =PIOA_PER_P17 // mask Pin 17-20,24
  str r1, [r0PIOA_BASE,#PIOA_PER_OFFSET] //pin 17 PIO controlled
// 
-----------------------------------------------------------------------

// output for pin 17
// 
-----------------------------------------------------------------------
  ldr r1, =PIOA_PER_P17 // mask Pin 17
  str r1, [r0PIOA_BASE,#PIOA_OER_OFFSET] // pin 17 output
// 
-----------------------------------------------------------------------

loop:
// led on
// 
-----------------------------------------------------------------------
  ldr r1, =PIOA_PER_P17 // mask Pin 17
  str r1, [r0PIOA_BASE,#PIOA_CODR_OFFSET] // pins 17 on
// 
-----------------------------------------------------------------------

        ldr     r8, =0x1000

wait1:  subs    r8,r8,#1
        bne     wait1

// led off
// 
-----------------------------------------------------------------------
  ldr r1, =PIOA_PER_P17 // mask Pin 17
  str r1, [r0PIOA_BASE,#PIOA_SODR_OFFSET] // pins 17 off
// 
-----------------------------------------------------------------------

        ldr     r8, =0x1000

wait2:  subs    r8,r8,#1
        bne     wait2

        B loop

von Peter Pippinger (Gast)


Lesenswert?

Achso, ich habe noch vergessen zu sagen, dass der ARM mit 18MHz getaktet 
ist. Also sollten die Warteschleifen doch bei Weitem schneller 
abgearbeitet sein.

MfG
Peter

von Simon K. (simon) Benutzerseite


Lesenswert?

Äh, Ich kenn den at91sam7 jetzt nicht wirklich, aber das ist ein sehr 
großes Programm, nur um eine LED blinken zu lassen?

PS: Ich kann da was von wait-Schleife sehen. Möglicherweise hast du das 
Programm von irgendwoher kopiert? Welche Taktfrequenz hatte derjenige 
für die Schleifen gerechnet?

von gerhard (Gast)


Lesenswert?

@peter,
dein at91sam7 läuft mit dem sog. slow clock (~32khz). dieser ist nach 
den reset aktiv.

sieh dir mal die iar beispielprogramme an. dort findest du eine funktion 
namens AT91F_LowLevelInit. dieser kannst du die notw. schritte zur init. 
des clock-systems entnehmen.

gruss
gerhard

von romanua (Gast)


Lesenswert?

Peter,

PIT = periodic interval timer

Deine Schaltung laeuft nicht mit 18Mhz sondern mit rund 33kHz (slow 
clock).
Fuer schneller solltest du Clock Generator einstellen.

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.