2014-02-03 1 views
0

Я новичок в программировании AVR. Я пытаюсь построить линейный последовательный робот, используя atmega8, который может припарковаться, когда инфракрасные датчики обнаруживают черный. мои датчики подключены к PORTD2 и PORTD3, а мои моторы подключены к PORTB0 и PORTB4. Я планировал запустить, а затем задержать двигатель на 3 секунды и отключить их, но робот начал работать беспорядочно. Пожалуйста, помогите мне узнать, что не так с моим кодом.Линейный следящий робот с использованием atmega8

#include<avr/io.h> 
#include<util/delay.h> 
int main() 
{ 
    DDRD=0b00000000; 
    DDRB=0b11111111; 
    uint8_t sensor; 
    uint8_t A= 0b00000000; 
    while(1) 
    { 
     A=0b00000000; 
     sensor = PIND; 
     A= sensor|0b11110011; 
     switch(A) 
     { 
     case 0b11110011: 
      PORTB=0b00010001; 
      _delay_ms(3000); 
      PORTB=0b00000000; 
      break; 
     case 0b11111011: 
      PORTB=0b00000001; 
      break; 
     case 0b11110111: 
      PORTB=0b00010000; 
      break; 
     case 0b11111111: 
      PORTB=0b00010001; 
      break; 
     } 
    } 
    return 0; 
} 
+0

Какие именно датчики? Действительно ли они падают ниже активного низкого напряжения, когда «темный»? Кроме того, вы можете проверить только соответствующие контакты, а не весь порт. Вы объявляете весь порт D в качестве входов, а некоторые из них могут плавать и давать неожиданные значения. –

ответ

0

Вы можете попробовать объявить датчик летучие:

volatile uint8_t sensor;

+0

Я не вижу, как это должно что-либо сделать. Не существует асинхронного контекста и не используется многобайтовая переменная. –

+0

«sensor = PIND» - это асинхронный контекст ... значение PIND изменяется вне цикла while. –

+0

Но поскольку 'PIND' уже определен как изменчивый« под капотом », недостаточно ли для компилятора подавить предположения относительно значения« PIND »и, таким образом, не оптимизировать назначение для« датчика »? –

0

Если вы компилируете с какой-либо оптимизацией, функция задержки не работает должным образом.

В противном случае это выглядит просто, в зависимости от деталей датчиков и двигателей. Что неустойчиво в отношении поведения?