Cześć,
Napisałem prosty program LineFollowera w AtmelStudio. Atmega 328p polaczona jest ze sterownikiem silnikow l293d. Połączenia na płytce są okej, napisałem podobny program w arduino IDE i wszystko działa. W AtmelStudio też wszystko działa oprócz PWMa... Kręci się tylko prawy silnik i nie reaguje wogóle na zmiane wartości PWMa. Do atmegi nie jest podpięty kwarc, działa na swoim 1MHz.
Napisałem prosty program LineFollowera w AtmelStudio. Atmega 328p polaczona jest ze sterownikiem silnikow l293d. Połączenia na płytce są okej, napisałem podobny program w arduino IDE i wszystko działa. W AtmelStudio też wszystko działa oprócz PWMa... Kręci się tylko prawy silnik i nie reaguje wogóle na zmiane wartości PWMa. Do atmegi nie jest podpięty kwarc, działa na swoim 1MHz.
#include <avr/io.h>
#include <util/delay.h>
#include <stdbool.h>
#include <avr/interrupt.h>
#define leftMotorR PIND7
#define leftMotorF PIND6
#define leftMotorEn PIND5
#define rightMotorF PINB1
#define rightMotorR PINB0
#define rightotorEn PINB2
#define leftSensor PINC5
#define rightSensor PINC3
bool leftAlarm;
bool rightAlarm;
int8_t speed = 50;
void FORWARD();
void BACKWARD();
void RIGHT();
void LEFT();
void STOP();
int main(void)
{
DDRB |= 00000111; //PB0 PB1 PB2
DDRC |= 00101000; //PC3 PC5
DDRD |= 11100000; //PD5 PD6 PD7
//PORTD |= (1 << PIND5);
//PORTB |= (1 << PINB2);
//PWM D5
TCCR0A=(0<<COM0A1) | (0<<COM0A0) | (1<<COM0B1) | (0<<COM0B0) | (1<<WGM01) | (1<<WGM00);
TCCR0B=(0<<WGM02) | (0<<CS02) | (0<<CS01) | (1<<CS00);
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;
//PWM B2
TCCR1A |= (0<<COM1A1) | (0<<COM1A0) | (1<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (1<<WGM10);
TCCR1B |= (1<<WGM12) | (0<<CS12) | (0<<CS11) | (1<<CS10);
TCNT1=0x00;
OCR1A=0x00;
OCR1B=0x00;
while (1)
{
OCR0B = speed;
OCR1B = speed;
leftAlarm = bit_is_clear(PINC, leftSensor);
rightAlarm = bit_is_clear(PINC, rightSensor);
if(leftAlarm == 1 && rightAlarm == 0){
RIGHT();
}
else if(leftAlarm == 0 && rightAlarm == 1){
LEFT();
}
else if(leftAlarm == 1 && rightAlarm == 1){
FORWARD();
}
else if(leftAlarm == 0 && rightAlarm == 0){
STOP();
}
_delay_ms(1);
}
}
void FORWARD(){
PORTD |= (1 << leftMotorF); //digitalWrite(leftMotorF,1);
PORTD &= ~(1 << leftMotorR);//digitalWrite(leftMotorR,0);
PORTB |= (1 << rightMotorF);//digitalWrite(rightMotorF,1);
PORTB &= ~(1 << rightMotorR);//digitalWrite(rightotorR,0);
_delay_ms(1);
}
void BACKWARD(){
PORTD &= ~(1 << leftMotorF);//digitalWrite(leftMotorF,0);
PORTD |= (1 << leftMotorR);//digitalWrite(leftMotorR,1);
PORTB &= ~(1 << rightMotorF);//digitalWrite(rightMotorF,0);
PORTB |= (1 << rightMotorR);//digitalWrite(rightotorR,1);
_delay_ms(1);
}
void RIGHT(){
PORTD |= (1 << leftMotorF);//digitalWrite(leftMotorF,1);
PORTD &= ~(1 << leftMotorR);//digitalWrite(leftMotorR,0);
PORTB &= ~(1 << rightMotorF);//digitalWrite(rightMotorF,0);
PORTB |= (1 << rightMotorR);//digitalWrite(rightotorR,1);
_delay_ms(1);
}
void LEFT(){
PORTD &= ~(1 << leftMotorF);//digitalWrite(leftMotorF,0);
PORTD |= (1 << leftMotorR);//digitalWrite(leftMotorR,1);
PORTB |= (1 << rightMotorF);//digitalWrite(rightMotorF,1);
PORTB &= ~(1 << rightMotorR);//digitalWrite(rightotorR,0);
_delay_ms(1);
}
void STOP(){
PORTD &= ~(1 << leftMotorF);//digitalWrite(leftMotorR,0);
PORTD &= ~(1 << leftMotorR);//digitalWrite(leftMotorR,0);
PORTB &= ~(1 << rightMotorF);//digitalWrite(rightMotorF,0);
PORTB &= ~(1 << rightMotorR);//digitalWrite(rightotorR,0);
_delay_ms(1);
}
