mikrocontroller.net

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


Autor: Peter Pippinger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Pippinger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: gerhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: romanua (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.