使用atmega8为线跟随器实现急转右转

时间:2014-09-25 16:17:43

标签: avr atmega

我是AVR编程的新手,我正在尝试使用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;
        }

    }
    }   
}

对于左右转弯,这似乎根本不起作用。 知道我哪里错了吗?

1 个答案:

答案 0 :(得分:1)

在不理解您的计划的情况下(请参阅上面的评论),我猜这是因为您永久地写信给PIN - if - 条款中的注册人。

PINC&=0b00011111表示:

  • 阅读PINC - 值
  • 二进制和0b00011111
  • 将结果写回PINC

根据您的代码运行的AVR,您可以通过将1写入PINX - 寄存器位来切换输出。如果DDR配置为输入您切换上拉。对于较新的AVR核心,情况确实如此。对于旧的,它的未定义行为要写入PIN寄存器,因为它们被定义为只读。