dccharacter писал(а):жесть
купи себе этого робота, кока-колы и печенья, позови на вечеринку друзей-одноклассников, подключи к энкодеру осциллограф, и перед вами выйдет график с импульсами такого вида без всяких С/С++
нигде не могу его найти, а программу нужна как можно быстрее написать.
нашел готовую прогу на сайте
http://forum.pololu.com/viewtopic.php?t=484- Код: Выделить всё • Развернуть
#include <stdlib.h>
#include <avr/io.h>
#include <avr/interrupt.h>
//global variables: encoder position and direction of rotation
unsigned int enc_pos;
unsigned char enc_dir;
/*
PORTC Pin change interrupt service routine. Decodes the encoder.
For algorithm, see Scott Edwards article from Nuts&Volts V1 Oct. 1995
(righthand bit of old A,B) xor (lefthand bit of new A,B) => dir.
Increment or decrement encoder position accordingly
*/
ISR (PCINT1_vect) {
static unsigned char enc_last=0,enc_now;
enc_now = (PINC & (3<<4))>>4; //read the port pins and shift result to bottom bits
enc_dir = (enc_last & 1)^((enc_now & 2) >> 1); //determine direction of rotation
if(enc_dir==0) enc_pos++; else enc_pos--; //update encoder position
enc_last=enc_now; //remember last state
}
#include "lcd.c"
int main(void)
{
unsigned char buf[8];
enc_pos=0; //Initialize encoder position
LCDInit(); //Initialize LCD display
DDRC &=~(3<<4); //Port C pins 4 and 5 as input
PCMSK1 |= (3<<PCINT12); //enable interrupt on pin change, bits 4&5 PORTC
PCICR |= 1<<PCIE1; //enable interrupt on pin change, PORTC
sei(); //enable global interrupts
while (1){
LCDSendCommand(LCD_Line1); //display current direction of rotation on line 1
itoa(enc_dir,buf,10);
LCDPrintString(buf);
LCDSendCommand(LCD_Line2); //display current encoder position on line 2
itoa(enc_pos,buf,10);
LCDPrintString(buf);
}
}
но её нужно прошить в робот, как я понял робот будет определять пройденный пусть и двигаться с заданной скоростью?!