16F877 pwm duty cycle

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Odpovědět
Zpráva
Autor
Uživatelský avatar
bluepatch
Příspěvky: 25
Registrován: 21 bře 2010, 00:00
Bydliště: Ledeč nad Sázavou/Brno
Kontaktovat uživatele:

16F877 pwm duty cycle

#1 Příspěvek od bluepatch »

Zdravim, poradi nekdo jak zmerit sirku nuly a jednicky jednoho pulzu? Chtel bych na to pouzit metodu capture.

Nasel sem nekde priklad, ale nejak jsem to nepochopil. Meri to, ale hodnota je spatna. Merim stridu cidla smt160. Prinejhorism se to da asi zmerit timerem, ale takhle se mi to zda jednodusi.

Kód: Vybrat vše

void interrupt() {

if(PIR1.F2 == 1) // if CCP1 Edge Detected (CCP1 Interrupt)
{

    PIR1.F2 = 0; // Reset CCP1IE

    if(CCP1CON.F0 == 1) // if Rising Edge detected
    {
       Leading = CCPR1L| CCPR1H<<8; // Copy CCPR1  to Leading Edge var
       CCP1CON.F0 = 0; // Set to falling edge
    } // END Rising Edge

    else if(CCP1CON.F0 == 0) // If Falling Edge Detected
    {
       Capture =  CCPR1L | CCPR1H<<8; // Copy CCPR1  to Falling Edge var
       Capture = Capture -  Leading ; // Calculate Pulse Width
       CCP1CON.F0 = 1; // Set to Traling edge
    }// END Falling Edge

}// END CCP1 Interrupt
Uživatelský avatar
procesor
Příspěvky: 5286
Registrován: 02 říj 2009, 00:00
Bydliště: PO

#2 Příspěvek od procesor »

Treba k tomu spustiť aj Timer1 s nastavenými vhodnými hodinami.
Ten program meria iba šírku jednotky
Pre šírku nuly by sa musel doplniť o nejaké premenné a výpočet

A tento riadok by som dal na koniec

Kód: Vybrat vše

  
  PIR1.F2 = 0; // Reset CCP1IE ( a poznámka je blbá, ale to nič)
Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“