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:
Po odpaleniu silnik po prostu jedzie do przodu. O co chodzi?!
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:
#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?!