Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

ATmega8, PWM i opóźnienie...

dr_aco 20 Lis 2005 11:50 1184 1
  • #1 20 Lis 2005 11:50
    dr_aco
    Poziom 10  

    Hej!
    Potrzebuje napisac np. nastepujacy program dla robota:
    prawe kolo jedzie do przodu, po jakims czasie(na razie dowolnym) zatrzymuje się.
    Problem polega na tym, że nie działa opóźnienie. Moje testy wskazujna to, że procek nie wychodzi z pętli opóźniającej (wykonuje się wszystko do tej pętli).
    Należy zauważyć, że wszystko z osobna działa (opóźnienie w połączeniu z mryganiem LED, samo sterowanie silnikami) a problem pojawia się w momencie gdy używam naraz PWMów i opóźnienia.
    RATUNKU!!!
    Kod programu:

    Code:
    #include <avr/io.h>
    
    #include <avr/interrupt.h>
    #define F_CPU 8000000UL
    #include <avr/delay.h>

    #include <avr/signal.h>

    #define MAX_SPEED 0x3ff
    #define STOP_SPEED 0x00
    #define kierunekL 6
    #define kierunekP 7


    void czekaj(unsigned long pt)
    {
    unsigned char tp1;
    for(;pt>0;pt--)
      {
        for(tp1=255;tp1!=0;tp1--);
      }
    }

    void PWM_Init(void)
    {
      TCCR1A = 0xa2;  //0xb2;  //0b10110010;
      TCCR1B = 0x1b;  //0b00011011;
      ICR1H = 0x03;   //0b00000011;
      ICR1L = 0xc0;   //0b11000000;
      OCR1A = 0x00;   //PRAWY DODATNI
      OCR1B = 0x00;   //LEWY DODATNI
      sbi(PORTB,kierunekL);//nie zmieniaj kierunku
      sbi(PORTB,kierunekP);
      TIMSK |= (1 << TOIE1);
      sei();
    }

    void prawe_FWD(void)
    {
      OCR1A=MAX_SPEED;
      sbi(PORTB,kierunekP);
    }

    void prawe_STOP(void)
    {
      OCR1A=STOP_SPEED;
      sbi(PORTB,kierunekP);
    }

    int main(void)
    {
       DDRB=0xff;
       PWM_Init();
       while(1)
       {
         prawe_FWD();
         czekaj(1500);
         prawe_STOP();
         czekaj(1500);
       }
    }

    Po odpaleniu silnik po prostu jedzie do przodu. O co chodzi?!

    0 1
  • #2 20 Lis 2005 13:59
    zumek
    Poziom 39  

    dr_aco napisał:

    ...
    RATUNKU!!!
    Kod programu:
    Code:

    ...
    void PWM_Init(void)
    {
      TCCR1A = 0xa2;  //0xb2;  //0b10110010;
      TCCR1B = 0x1b;  //0b00011011;
      ICR1H = 0x03;   //0b00000011;
      ICR1L = 0xc0;   //0b11000000;
      OCR1A = 0x00;   //PRAWY DODATNI
      OCR1B = 0x00;   //LEWY DODATNI
      sbi(PORTB,kierunekL);//nie zmieniaj kierunku
      sbi(PORTB,kierunekP);

     //Mistrzu !!! Gdzie masz procedurę dla tego przerwania ???
      TIMSK |= (1 << TOIE1);

      sei();
    }
    ...
    }

    Po odpaleniu silnik po prostu jedzie do przodu. O co chodzi?!

    No właśnie gdzie, no gdzie ??? ;)

    Piotrek

    PS
    Radzę zaprzyjaźnić się , z jakimś symulatorem - może AVRStudio ???

    0