mikrocontroller.net

Forum: Compiler & IDEs AT91SAM7A3 PWM Signal


Autor: -- -- (crolib)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

ich hoffe jemand kann mir bei der Fehlersuche helfen...
ich habe ein Sam7a3 Board und wollte auf PB16 und PB18 ein PWM
Signal ausgeben.
Leider kommt bei mir nur bei PB16 ein High-Signal heraus und
auf dem PB14 ist kein Signal ...
Hier ist mein Code:
#include "Board.h"

  //Variablendeklaration
AT91PS_PIO pPIO;
AT91PS_PWMC pPWM;
AT91PS_CKGR pCKGR;
AT91PS_PMC pPMC;
AT91PS_ADC pADC;
AT91PS_TC  pTC;

unsigned int PIO_Enable= 0x1554000;
unsigned int PIO_OER= 0x14000;
unsigned int PIO_ODR= 0x1540000;
unsigned int CID_L= 0x1;
unsigned int CID_G= 0x4;
unsigned int mode_pwm= 0x200;
unsigned int mode_pmc= 0x1;
unsigned int period= 0x56E10;
unsigned int duty_L= 0x6780;
unsigned int duty_G= 0x68F0;
unsigned int null= 0x0;
unsigned int mode_MCK= 0x1;
unsigned int mode_ADC= 0x100;



int main()
{
  //Initialisierung von PORTB
  AT91F_PIO_CfgPeriph(pPIO, null , PIO_Enable);
  AT91F_PIO_CfgOutput(pPIO,PIO_OER);
  AT91F_PIO_CfgInput(pPIO, PIO_ODR);
  AT91F_PIO_CfgPullup(pPIO, PIO_OER);

  //Initialisierung von PWM
  AT91F_PWMC_StopChannel(pPWM, 0x5);
  pPWM->PWMC_MR=  0x10000;
  AT91F_PWMC_CfgChannel(pPWM, CID_L, mode_pwm, period, duty_L);
  AT91F_PWMC_CfgChannel(pPWM, CID_G, mode_pwm, period, duty_G);
  AT91F_PWMC_StartChannel(pPWM, 0x5);

  //Initialisierung von ADC
  //AT91F_ADC_CfgModeReg(pADC, mode_ADC);

  //Gas Geben
  //duty_G= 0x7148;
  //AT91F_PWMC_UpdateChannel(pPWM, CID_G, duty_G);


  return 0;
}

Könnte jemand von euch bitte mal drüber schauen und mir sagen wo
das Problem liegt!?
Vielen Dank im voraus!!

MFG
crolib

Autor: Karl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Takt für Peripherie eingeschaltet?

Autor: -- -- (crolib)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Erstmal Danke für deine Antwort!!

Meinst du mit Takt den Master (MCK) Clock?
falls ja, der wurde von uns schon in einer Datei initialisiert.

// The following functions must be write in ARM mode this function called directly
// by exception vector
extern void AT91F_Spurious_handler(void);
extern void AT91F_Default_IRQ_handler(void);
extern void AT91F_Default_FIQ_handler(void);

//*----------------------------------------------------------------------------
//* \fn    AT91F_LowLevelInit
//* \brief This function performs very low level HW initialization
//*        this function can be use a Stack, depending the compilation
//*        optimization mode
//*----------------------------------------------------------------------------
void AT91F_LowLevelInit( void) @ "ICODE"
{
 int            i;
 AT91PS_PMC     pPMC = AT91C_BASE_PMC;
    //* Set Flash Waite sate
  //  Single Cycle Access at Up to 30 MHz, or 40
  //  if MCK = 47923200 I have 50 Cycle for 1 usecond ( flied MC_FMR->FMCN
      AT91C_BASE_MC->MC_FMR = ((AT91C_MC_FMCN)&(48 <<16)) | AT91C_MC_FWS_1FWS ;

    //* Watchdog Disable
        AT91C_BASE_WDTC->WDTC_WDMR= AT91C_WDTC_WDDIS;

  //* Set MCK at 47 923 200
    // 1 Enabling the Main Oscillator:
        // SCK = 1/32768 = 30.51 uSecond
      // Start up time = 8 * 6 / SCK = 56 * 30.51 = 1,46484375 ms
       pPMC->PMC_MOR = (( AT91C_CKGR_OSCOUNT & (0x0 <<8) | AT91C_CKGR_MOSCEN ));
        // Wait the startup time
        while(!(pPMC->PMC_SR & AT91C_PMC_MOSCS));
  // 2 Checking the Main Oscillator Frequency (Optional)
  // 3 Setting PLL and divider:
    // - div by 5 Fin = 3,6864 =(18,432 / 5)
    // - Mul 25+1: Fout =  95,8464 =(3,6864 *26)
    // for 96 MHz the erroe is 0.16%
    // Field out NOT USED = 0
    // PLLCOUNT pll startup time estimate at : 0.844 ms
    // PLLCOUNT 28 = 0.000844 /(1/32768)
       pPMC->PMC_PLLR = ((AT91C_CKGR_DIV & 0x01) |
                         (AT91C_CKGR_PLLCOUNT & (28<<8)) |
                         (AT91C_CKGR_MUL & (25<<16)));

        // Wait the startup time
        while(!(pPMC->PMC_SR & AT91C_PMC_LOCK));
        while(!(pPMC->PMC_SR & AT91C_PMC_MCKRDY));
   // 4. Selection of Master Clock and Processor Clock
   // select the PLL clock divided by 2
       pPMC->PMC_MCKR =  AT91C_PMC_PRES_CLK ;
       while(!(pPMC->PMC_SR & AT91C_PMC_MCKRDY));

       pPMC->PMC_MCKR |= AT91C_PMC_CSS_MAIN_CLK ;
       while(!(pPMC->PMC_SR & AT91C_PMC_MCKRDY));

  // Set up the default interrupts handler vectors
  AT91C_BASE_AIC->AIC_SVR[0] = (int) AT91F_Default_FIQ_handler ;
  for (i=1;i < 31; i++)
  {
      AT91C_BASE_AIC->AIC_SVR[i] = (int) AT91F_Default_IRQ_handler ;
  }
  AT91C_BASE_AIC->AIC_SPU  = (int) AT91F_Spurious_handler ;

}

Sollte das nicht der Takt sein, dann sag mir bitte welchen du meinst.
Danke im voraus!

MFG
crolib

Autor: Karl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, ich meine nicht den MC, sondern den Takt für die Peripherie. Die 
AT91 versorgen nach einem Reset ihre Peripherie nicht mit einem Takt um 
Strom zu sparen. Folglich musst du den Takt für die entsprechende 
Peripherie aktivieren, wenn du sie verwenden willst. Dazu steht einiges 
im Datenblatt. Es existieren in der AT91 Bibliothek auch Funktionen 
dafür.

Autor: -- -- (crolib)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe nur noch einen einzigen Takt gefunden der es sein Könnte und 
das ist der PIT. Ist es der den du meinst?
Falls nicht dann sag mir bitte welcher das ist und wie er genau heißt. 
Würde mir echt sehr weiterhelfen.

Danke im voraus

Gruß

Crolib

Autor: Karl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mann, Mann, Mann. Wenn du mit µC etwas Erfolg haben willst, sollte das 
schon alleine gehen. Steht definitiv alles im Datenblatt. Ich bin 
selbst schon wieder eine ganze weile raus aus den AT91. Normalerweise 
hast du nur ein banales "Lies gefälligst das Datenblatt" verdient. Na 
gut, machen wir mal eine Ausnahme. Datenblatt runterlad

38,7 Sekunden später:
S. 156 24.5
S. 168 24.9.4
S. 29  11.
S. 392 32.4.2
S. 393: "Caution: Before using the PWM macrocell, the programmer must 
first enable the PWM clock in the Power Management Controller (PMC)."

Mehr gibts nicht von mir. Ich ärgere mich sowieso fast schon wieder über 
mangelnde Eigeninitiative, deshalb nochmal: Lies das verdammte 
Datenblatt, ohne gehts nicht.

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.