Програма на BASCOME. Запускаю её в симуляторе, и на 57 строке висит, то есть не совсем висит, просто выбирает только движение вперед...
симулирую сигнал от бампера, переходит на отъезд засвечивается 106 строка и опять висяк. К выполнению основной программы не возвращается. Просто тупо висит.
Такое чувство что что-то с таймерами... слишком долго длятся 2,5 сек.
вот сама прога
- Код: Выделить всё
' Программа произвольного движения для робота "RoBi"
' RoBi.bas - главный файл проекта , в котором реализована программа
' мобильного робота;
' Автор Space:
' -программа для мк ATmega16
' -используется кварц на 16мГц
' -компилятор Bascom AVR
' Программа 2008 для робота "RoBi" - http://www.robptsspace.ucoz.ru
' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
$regfile = "m16def.dat" 'используем мк ATmega16
$crystal = 16000000 'частота кварцевого резонатора 16mHz
$lib "lcd4.lbx" 'используем 4-х битное подключение дисплея с помощью альтернативной библиотеки
$baud = 19200 'Скорость COM-порта
' указываем конфигурацию подключения дисплея к портам МК
Config Lcdpin = Pin , Rs = Portb.0 , E = Portb.2 , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7
Config Lcd = 16 * 2 'используем дисплей на 2 строчки по 16 знакомест в каждой
Config Timer1 = Pwm , Pwm = 8 , Prescale = 1 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
Config Pina.0 = Output : Fr Alias Porta.0 'PA 0 устанавливаем на выход и присваиваем имя Fr(вперёд-вправо);
Config Pina.1 = Output : Br Alias Porta.1 'PA 1 устанавливаем на выход и присваиваем имя Br(назад-вправо);
Config Pina.2 = Output : Bl Alias Porta.2 'PA 2 устанавливаем на выход и присваиваем имя Bl(назад-влево);
Config Pina.3 = Output : Fl Alias Porta.3 'PA 3 устанавливаем на выход и присваиваем имя Fl(вперёд-влево).
Config Pind.4 = Output 'ногу ШИМа левого движка сконфигурировали как выход
Config Pind.5 = Output 'ногу ШИМа правого движка сконфигурировали как выход
Config Pind.2 = Input : Bumper_r Alias Pind.2 'PD 0 устанавливаем на вход и присваиваем имя Bumper_r(правый бампер);
Config Pind.3 = Input : Bumper_l Alias Pind.3 'PD 1 устанавливаем на вход и присваиваем имя Bumper_l(левый бампер).
Config Pinc.2 = Input : Кнопка_старт Alias Pinc.2 'PC 2 устанавливаем на вход и присваиваем имя Кнопка_старт;
Config Pinc.3 = Input : Кнопка_стоп Alias Pinc.3 'PC 3 устанавливаем на вход и присваиваем имя Кнопка_стоп;
Config Pinc.4 = Input : Кнопка_3 Alias Pinc.4 'PC 4 устанавливаем на вход и присваиваем имя Кнопка_3;
Config Pinc.5 = Input : Кнопка_4 Alias Pinc.5 'PC 5 устанавливаем на вход и присваиваем имя Кнопка_4.
Config Pinb.0 = Output : Red_0 Alias Portb.0 'PB 0 устанавливаем на выход и присваиваем имя Red_0;
Config Pinb.1 = Output : Red_1 Alias Portb.1 'PB 1 устанавливаем на выход и присваиваем имя Red_1;
Config Pinb.2 = Output : Red_2 Alias Portb.2 'PB 2 устанавливаем на выход и присваиваем имя Red_2.
Enable Interrupts ' разрешаем прерывания
Dim Rand As Byte
Print "Start RoBi" ' выводим стартовую надпись в терминали через COM-порт
Cls 'команда очистки дисплея
Cursor Off ' отключаем корсор на LCD
Lcd "I am RoBi!" 'выводим надпись
Lowerline ' переходим на нижнюю строчку
Lcd "Gotov k rabote." 'выводим надпись
Основная_программа:
Do 'Основной цикл программы
Rand = Rnd(50)
If Rand = 48 Then : Gosub Стоп : Waitus 10 : End If
If Rand = 1 Then : Gosub Стоп : Waitus 10 : End If
If Rand = 49 Then : Gosub Вперёд : Wait 2 : End If ' СТРЕЛКА ГЛУХО СТОИТ НА ЭТОЙ СТРОКЕ И НИ ТУДА НИ СЮДА
If Rand = 17 Then : Gosub Вперёд : Wait 1 : End If
If Rand = 27 Then : Gosub Вперёд : Wait 2 : End If
If Rand = 32 Then : Gosub Вперёд : Wait 1 : End If
If Rand = 44 Then : Gosub Назад : Wait 1 : End If
If Rand = 4 Then : Gosub Назад : Wait 1 : End If
If Rand = 45 Then : Gosub Вправо : Wait 1 : End If
If Rand = 2 Then : Gosub Вправо : Wait 1 : End If
If Rand = 22 Then : Gosub Влево : Wait 1 : End If
If Rand = 3 Then : Gosub Влево : Wait 1 : End If
Debounce Bumper_r , 0 , L 'сработал правый датчик, переходим на выполнение команды Bl
Debounce Bumper_l , 0 , R 'сработал левый датчик, переходим на выполнение команды Br
Loop
'' -----------------------------------------------------------------------------
'' Включение комбинации моторов для движения в заданном направлении
'' -----------------------------------------------------------------------------
Стоп: ' стоим на месте
Fr = 0 : Br = 0 : Bl = 0 : Fl = 0 :
Return
Вперёд: ' едим вперёд
Fr = 1 : Br = 0 : Bl = 0 : Fl = 1 :
Return
Вперёд_вправо: ' поварачиваем вправо
Fr = 0 : Br = 0 : Bl = 0 : Fl = 1 :
Return
Вперёд_влево: ' поворачиваем влево
Fr = 1 : Br = 0 : Bl = 0 : Fl = 0 :
Return
Назад: ' назад
Fr = 0 : Br = 1 : Bl = 1 : Fl = 0 :
Return
Назад_вправо: ' поворачиваем назад-вправо
Fr = 0 : Br = 1 : Bl = 0 : Fl = 0 :
Return
Назад_влево: ' поворачиваем назад-влево
Fr = 0 : Br = 0 : Bl = 1 : Fl = 0 :
Return
Вправо: ' разворот на метсе вправо
Fr = 0 : Br = 1 : Bl = 0 : Fl = 1 :
Return
Влево: ' разворот на месте влево
Fr = 1 : Br = 0 : Bl = 1 : Fl = 0 :
Return
R: ' выполнять после срабатывания правого датчика
Gosub Назад ' переходим в подпрограмму "Назад"
Wait 1 ' выполняем её в течение 2,5 секунд
Gosub Назад_влево
Wait 1
Gosub Стоп
Goto Основная_программа ' переходим к началу основного цикла после выполнения команд
L:
Gosub Назад
Wait 1 ' А ПРИ ВЫПОЛНЕННИИ БАМПЕРА ВСТАЕТ ЗДЕСЬ И ОПЯТЬ ЖЕ СТРЕЛКА НИКУДА ОТ СЮДА НЕ УХОДИТ
Gosub Назад_вправо
Wait 1
Gosub Стоп
Goto Основная_программа
Модератор "Digit":Если в следующий раз не будешь использовать тег [code] для выделения листингов программ - я буду очень ругаться, а это страшно, поверь!
Добавлено спустя 3 минуты 54 секунды:
Виноват, исправлюсь. Не хотел ничего плохого.