2014-09-25 2 views
-3

Я новичок в программировании AVR, и я пытаюсь реализовать резкий поворот вправо с помощью atmega8. Я смог реализовать прямой путь, но не смог реализовать резкий поворот вправо. Вот мой код:Внесите резкий поворот вправо, используя atmega8 для линейного повторителя

`#include <avr/io.h> 
#include<util/delay.h> 

int main(void) 
{ 
    DDRC=0b00000000; 
    DDRB=0b11111111; 
    int count=1,right=1; 
    while(1) 
    { 
     if((PINC&=0b00011111)==0b00000000) 
     { 
      PORTB=0b00000110; 
    } 
    else if((PINC&=0b00011111)==0b00001110) 
    { 
     PORTB=0&00100111; 
    } 
    else if((PINC&=0b00011111)==0b00001100) 
    { 
     PORTB=0b00000111; 
    } 
    else if((PINC&=0b00011111)==0b00000110) 
    { 
     PORTB=0b00100110; 
    } 
    else if((PINC&=0b00011111)==0b00001111) 
    { 
     if(count) 
     { 
     PORTB=0b0010011; 
     _delay_ms(200); 
     count--; 
     }  
     else if(((PINC&=0b00011111)==0b00000110)&&~(count)) 
     { 
      PORTB=0B00000111; 
     }   

    } 
    else if((PINC&=0b00011111)==0b00011110) 
    { 
     if(right) 
     { 
      PORTB=0b0010011; 
      _delay_ms(200); 
      right--; 
     } 
     else if(((PINC&=0b00011111)==0b00000110)&&~(right)) 
     { 
      PORTB=0B00100110; 
     } 

    } 
    } 
} 

Это, похоже, не работает для правого и левого поворотов. Любая идея, где я ошибаюсь?

+0

сложно дать ответ, не понимая, какое оборудование вы используете ... сколько датчиков вы используете ... 5? Вместо того, чтобы попытаться вычесть фактически прочитанное значение из «значения центра» 01110, и работать с разницей ... помните состояния 10000 и 00001, хотя там, где робот проходит по краю. – MikeD

+0

этот код беспорядок. должен действительно '' определять 'некоторые константы или объявлять некоторые' inline' -функции для проверки состояний входов (например, 'static inline bool RightSensorSensesLine() {return PINC & 0b00011111;}'. Как мы должны понимать ваш код со всеми этими беспорядочными, одинаково выглядящими двоичными литералы, не понимая смысла своих бит? –

ответ

1

Без понимания вашей программы (см. Мой комментарий выше) iam угадывает, потому что вы постоянно записываете свои PIN -regsiters в if -предложениях.

PINC&=0b00011111 означает:

  • чтения PINC -value
  • двоичным И это с 0b00011111
  • записать результат обратно в PINC

В зависимости от AVR код выполняется вы переключаетесь выход, записывая бит от 1 до PINX. Если DDR сконфигурирован так, чтобы вводить вас, вы переключаете подтяжки. Это верно для новых AVR-ядер. Для старого это неопределенное поведение для записи в ПИН-регистры, поскольку они определены как только для чтения.

 Смежные вопросы

  • Нет связанных вопросов^_^