Всем привет! Помогите пожалуйста переделать код под мегу8! У самого чет не че не получается. Мега8 у меня работает на заводской частоте без кварца. /***************************************************** Chip type : AT90S2313 Clock frequency : 4,000000 MHz Memory model : Tiny External SRAM size : 0 Data Stack size : 32 *****************************************************/
#include <90s2313.h>
#include #include
// назначение определений для удобства работы с периферией #define OUT PORTB #define MOTOR_F 7 #define MOTOR_B 6 #define TURN_R 5 #define TURN_L 4
#define IN PIND #define LIGHT_R 0 #define LIGHT_L 1 #define BUMPER_F 2 #define BUMPER_B 3
// Возможные режимы движения enum {STOP, F, FR, FL, B, BR, BL};
//------------------------------------------------------------------------------ // Задержка t х 10ms //------------------------------------------------------------------------------ void Delay_10ms(unsigned char t) {char i; for(i=0;i }
// таблица вероятностей для выбора направления движения // исходя из текущего направления движения unsigned char p[7][7] = {14, 43, 57, 71, 86, 93, 100, 7, 43, 71, 100, 100, 100, 100, 7, 50, 93, 100, 100, 100, 100, 7, 50, 57, 100, 100, 100, 100, 29, 29, 29, 29, 57, 79, 100, 36, 36, 36, 36, 71, 93, 100, 36, 36, 36, 36, 71, 79, 100};
// текущее направление движения unsigned char this_move;
//------------------------------------------------------------------------------ // Включение комбинации моторов для движения в заданном направлении //------------------------------------------------------------------------------ void go(unsigned char direction){
switch (direction) { case STOP: OUT.MOTOR_F=0; OUT.MOTOR_B=0; OUT.TURN_R=0; OUT.TURN_L=0; break;
case F: OUT.MOTOR_F=1; OUT.MOTOR_B=0; OUT.TURN_R=0; OUT.TURN_L=0; break;
case FR: OUT.MOTOR_F=1; OUT.MOTOR_B=0; OUT.TURN_R=1; OUT.TURN_L=0; break;
case FL: OUT.MOTOR_F=1; OUT.MOTOR_B=0; OUT.TURN_R=0; OUT.TURN_L=1; break;
case B: OUT.MOTOR_F=0; OUT.MOTOR_B=1; OUT.TURN_R=0; OUT.TURN_L=0; break;
case BR: OUT.MOTOR_F=0; OUT.MOTOR_B=1; OUT.TURN_R=1; OUT.TURN_L=0; break;
case BL: OUT.MOTOR_F=0; OUT.MOTOR_B=1; OUT.TURN_R=0; OUT.TURN_L=1; break; } }
//------------------------------------------------------------------------------ // Выбор направления движения в следующем шаге по таблице вероятностей //------------------------------------------------------------------------------ unsigned char next_move(void){ unsigned char pp, i;
pp = rand()/327; // получаем случайное число 0..99 for (i=0;i<7;i++){ // ищем соответствие в таблице вероятностей if (p[this_move][i] > pp) break; } this_move = i; // записываем новое полученное направление как текущее return(i); }
//------------------------------------------------------------------------------ // Обработка прерывания от переднего бампера (INT0 = PD2) //------------------------------------------------------------------------------ interrupt [EXT_INT0] void ext_int0_isr(void) { if(this_move==FR) go(BL); if(this_move==FL) go(BR); else go(B); Delay_10ms(250); // отъезд в течение 2.5 х 2 сек Delay_10ms(250); this_move=B; }
//------------------------------------------------------------------------------ // Обработка прерывания от заднего бампера (INT1 = PD3) //------------------------------------------------------------------------------ interrupt [EXT_INT1] void ext_int1_isr(void) { if(this_move==BR) go(FL); if(this_move==BL) go(FR); else go(F); Delay_10ms(250); // отъезд в течение 2.5 х 2 сек Delay_10ms(250); this_move=F; }
//------------------------------------------------------------------------------ // "Случайное блуждание" //------------------------------------------------------------------------------ unsigned char walk(void){ // этот цикл организует "свободное блуждание" пока // нет сигнала ни от одного из датчиков освещенности while((IN.LIGHT_R) && (IN.LIGHT_L)){ go(next_move()); // получаем следующее направление движения и Delay_10ms(250); // движемся в этом направлении 2.5 сек } // этот цикл организует движение на свет, пока // есть сигнал хотя бы от одного из датчиков освещенности while((IN.LIGHT_R==0) || (IN.LIGHT_L==0)){ if((IN.LIGHT_R==0) && (IN.LIGHT_L==0)) go(F); else if(IN.LIGHT_R==0) go(FR); else if(IN.LIGHT_L==0) go(FL); }
return(0); }
//------------------------------------------------------------------------------ // Главная программа //------------------------------------------------------------------------------ void main(void) { DDRB = 0xff; // назначаем все линии порта B на выход PORTB = 0x00; // и устанавливаем на них низкий уровень
DDRD = 0x00; // назначаем все линии порта D на вход PORTD = 0xff; // подключаем внутренние нагрузочные резисторы
// External Interrupt(s) initialization // INT0: On // INT0 Mode: Falling Edge // INT1: On // INT1 Mode: Falling Edge GIMSK=0xC0; MCUCR=0x0A; GIFR=0xC0;
// разрешаем прерывания #asm("sei")
// запускаем главный цикл while(1) walk(); }
|