Простая программа, а не работает! либо она тупит - либо я
|
|
Grover | Дата: Среда, 06.02.2008, 20:02 | Сообщение # 1 |
Зарегистрирован 04.02.2008
Группа: Опытные
Сообщений: 130
Город: Воронеж
Статус: Offline
| вот код: Code ... ... ... int main(void) // начало основой программы { short i; DDRD = 0b11111111; // все выводы порта D сконфигурировать как выходы PORTD= 0b00000000; // по умолчаню сигнала на порт D не подается DDRC = 0b00000000; // все выводы порта C сконфигурировать как входы PORTC= 0b10111111; // подтягиваем все входы порта С ( все равны 1 ) delay(250); L1: while ((PINC & (1<<0))){ // Ждем нажатия на кнопку } delay(5000); // выжидаем чуть while (1) { M_Front(); // вперед delay(10000); M_Stop(); // стоп goto L1; // вернуться к ожиданию кнопки } // закрывающая скобка основной программы получается что если кнопку нажать и не отпускать, то колеса постоянно крутятся!!! а если просто кликнуть, то колеса прокрутятся секунду и останавливаются!!! я думаю, может МК перегружается постоянно? Добавлено (06.02.2008, 20:02) --------------------------------------------- Попробывал соеденить ПЛЮС через резистор 10кОм к RESET не помогло
-------- GroverSuper.ucoz.net - мои странички.
|
|
| |
Space | Дата: Среда, 06.02.2008, 20:44 | Сообщение # 2 |
Зарегистрирован 25.12.2007
Группа: Администраторы
Сообщений: 1103
Статус: Offline
| Опиши, что программа должна делать. А пока в этой строчке попробуй убрать while и поставь ! вот так (!(PINC & (1<<0))) while ((PINC & (1<<0))){ // Ждем нажатия на кнопку
|
|
| |
Grover | Дата: Четверг, 07.02.2008, 08:44 | Сообщение # 3 |
Зарегистрирован 04.02.2008
Группа: Опытные
Сообщений: 130
Город: Воронеж
Статус: Offline
| после подключения питания бот стоит и не чего не делает. если нажать кнопку на корпусе, то он двигается вперед и останавливается. затем все повторяется, опять ждет кнопку...
-------- GroverSuper.ucoz.net - мои странички.
|
|
| |
Space | Дата: Четверг, 07.02.2008, 14:12 | Сообщение # 4 |
Зарегистрирован 25.12.2007
Группа: Администраторы
Сообщений: 1103
Статус: Offline
| Вот так попробуй Code #include <avr/io.h> /***************** Функция задержки ****************/ void delay_ms(unsigned short ms) // Минимальная задержка с кварцем 8 МГц - 1 мс { unsigned short i, j, k; // объявляем переменные for (i=0; i<ms; i++) // главный цикл формирования задержки for (j=0; j<185; j++) // вложенный цикл формирования задержки k++; // произвольное действие } /****************************************************/
int main(void) // начало основной программы { DDRC = 0xff; // все выводы порта C сконфигурировать как выходы DDRD = 0x00; // все выводы порта D сконфигурировать как входы PORTD = 0xff; // установить "1" на всех выводах порта D, // включаем подтягивающие резисторы // ------- Основная программа --------- // -------------- включаем моторы вперед --------------- if (!(PIND & (1<<PIND1))) // проверить "0" на линии 1 порта D { PORTC |= _BV(PC1); // установить "1" на линии 1 порта C PORTC &= ~_BV(PC2); // установить "0" на линии 2 порта C PORTC |= _BV(PC3); // установить "1" на линии 3 порта C PORTC &= ~_BV(PC4); // установить "0" на линии 4 порта C delay_ms(5000); // ---------------------------------------------------- } // закрывающая скобка бесконечного цикла
} // закрывающая скобка основной программы
}
|
|
| |
Grover | Дата: Четверг, 07.02.2008, 16:24 | Сообщение # 5 |
Зарегистрирован 04.02.2008
Группа: Опытные
Сообщений: 130
Город: Воронеж
Статус: Offline
| логично... дома попробую.
-------- GroverSuper.ucoz.net - мои странички.
|
|
| |
Space | Дата: Четверг, 07.02.2008, 18:13 | Сообщение # 6 |
Зарегистрирован 25.12.2007
Группа: Администраторы
Сообщений: 1103
Статус: Offline
| Извеняюсь вношу поправки. ТОлько программа неполучилось всё равно. На кнопку срабатывает, но не останавливается. Выложи полностью свою программу. Покапаюсь с ней. Может и сделаю как надо. Code #include <avr/io.h> /***************** Функция задержки ****************/ void K_Delay_ms(unsigned short ms) // Минимальная задержка с кварцем 8 МГц - 1 мс { unsigned short i, j, k; // объявляем переменные for (i=0; i<ms; i++) // главный цикл формирования задержки for (j=0; j<185; j++) // вложенный цикл формирования задержки k++; // произвольное действие } /****************************************************/ int main(void) // начало основной программы { DDRC = 0xff; // все выводы порта C сконфигурировать как выходы DDRD = 0x00; // все выводы порта D сконфигурировать как входы PORTD = 0xff; // установить "1" на всех выводах порта D, // включаем подтягивающие резисторы // ------- Основная программа --------- // -------------- включаем моторы вперед --------------- while(1) { if (!(PIND | (1<<PIND1))) // проверить "1" на линии 1 порта D { PORTC |= _BV(PC1); // установить "1" на линии 1 порта C PORTC |= _BV(PC2); // установить "1" на линии 2 порта C PORTC |= _BV(PC3); // установить "1" на линии 3 порта C PORTC |= _BV(PC4); // установить "1" на линии 4 порта C // ---------------------------------------------------- } if (!(PIND & (1<<PIND1))) // проверить "0" на линии 1 порта D { PORTC |= _BV(PC1); // установить "1" на линии 1 порта C PORTC &= ~_BV(PC2); // установить "0" на линии 2 порта C PORTC |= _BV(PC3); // установить "1" на линии 3 порта C PORTC &= ~_BV(PC4); // установить "0" на линии 4 порта C K_Delay_ms(1500); // ---------------------------------------------------- } // закрывающая скобка бесконечного цикла
} // закрывающая скобка основной программы
}
|
|
| |
Grover | Дата: Четверг, 07.02.2008, 19:19 | Сообщение # 7 |
Зарегистрирован 04.02.2008
Группа: Опытные
Сообщений: 130
Город: Воронеж
Статус: Offline
| нашел место неисправности - не знаю как исправить: у меня не правильно работает функция K_Delay_ms(); Она работает не в миллисекундах и вообще каждый раз по разному? т.е. что-бы задержка была примерно в 1 секунду надо написать: K_Delay_ms(10 000); а в 5 секунд: K_Delay_ms(100 000); пипец!!! вот полный код программы: Code
#include <avr/io.h> #include <avr/delay.h> #define F_CPU 8000000UL // 8 MHz
/***************** Функция задержки ****************/ void K_Delay_ms(unsigned short ms) // Минимальная задержка с кварцем 8 МГц - 1 мс { unsigned short i, j, k; // объявляем переменные for (i=0; i<ms; i++) // главный цикл формирования задержки for (j=0; j<185; j++) // вложенный цикл формирования задержки k++; // произвольное действие } /****************************************************/
void M_Front(void) { PORTD |= _BV(PD0); // установить "1" PORTD |= _BV(PD1); // установить "1" PORTD &=~_BV(PD2); // установить "0" PORTD |= _BV(PD3); // установить "1" PORTD &=~_BV(PD4); // установить "0" } void M_Stop(void) { PORTD &= ~_BV(PD0); // установить "0" PORTD &= ~_BV(PD1); // установить "0" PORTD &= ~_BV(PD2); // установить "0" PORTD &= ~_BV(PD3); // установить "0" PORTD &= ~_BV(PD4); // установить "0" } int main(void) // начало основой программы { short i; DDRD = 0b11111111; // все выводы порта D сконфигурировать как выходы PORTD= 0b00000000; // по умолчаню сигнала на порт D не подается DDRC = 0b00000000; // все выводы порта C сконфигурировать как входы PORTC= 0b10111111; // подтягиваем все входы порта С ( все равны 1 ) while (1) { if (!(PINC & (1<<0))){ M_Front(); K_Delay_ms(100000); M_Stop(); } } } // закрывающая скобка основной программы
может дело в схеме?
-------- GroverSuper.ucoz.net - мои странички.
|
|
| |
Space | Дата: Четверг, 07.02.2008, 21:47 | Сообщение # 8 |
Зарегистрирован 25.12.2007
Группа: Администраторы
Сообщений: 1103
Статус: Offline
| С этим временем я тожет не могу разобраться. Поэтому проверяю всё на практике и устанавливаю нужное время. А почему их 5, когда должно быть по идеи всего 4 Code { PORTD |= _BV(PD0); // установить "1" PORTD |= _BV(PD1); // установить "1" PORTD &=~_BV(PD2); // установить "0" PORTD |= _BV(PD3); // установить "1" PORTD &=~_BV(PD4); // установить "0" }
|
|
| |
Grover | Дата: Пятница, 08.02.2008, 08:38 | Сообщение # 9 |
Зарегистрирован 04.02.2008
Группа: Опытные
Сообщений: 130
Город: Воронеж
Статус: Offline
| а. на моей схеме я к порту PD0 подключил оба пина Enable микрухи L293D - это для большей функциональности. а с паузой надо разобраться... Добавлено (08.02.2008, 08:38) --------------------------------------------- В примерах к WinAVR нашел вот такую функцию: Code
static void delay_1s(void) { uint8_t i;
for (i = 0; i < 100; i++) _delay_ms(10); }
Как видно из названия функции, рна реализовывает задержку в 1 секунду по средствам другой функции. я немного переделал функцию. Теперь она называется delay_10ms(), в скобках необходимо указать сколько раз по 10мс надо сделать паузу, т.е. секунда = 100. можно поробывать в строке _delay_ms(10); вместо 10 написать 1 тогда теоретически будет работать в миллисекундах, но я думаю, что обработка цикла отбирает некоторое время МК и задержка менее 10 мс будет приводить к неточности, хотя надо попробывать. Вот что у меня получилось: Code
void delay_10ms(unsigned short m) { unsigned short i; for (i = 0; i < m; i++) _delay_ms(10); }
вечером попробую.
-------- GroverSuper.ucoz.net - мои странички.
|
|
| |
Space | Дата: Пятница, 08.02.2008, 16:09 | Сообщение # 10 |
Зарегистрирован 25.12.2007
Группа: Администраторы
Сообщений: 1103
Статус: Offline
| Ты хотябы продемонстрируй на фото или видео на чем всё пробуешь и как это работает
|
|
| |
Grover | Дата: Пятница, 08.02.2008, 20:39 | Сообщение # 11 |
Зарегистрирован 04.02.2008
Группа: Опытные
Сообщений: 130
Город: Воронеж
Статус: Offline
| вот мое творение - первый и опытный образец. сейчас даже датчиков нет - просто катается (почти ) собран на монтажной плате... Добавлено (08.02.2008, 20:39) --------------------------------------------- там проводочек со штекером болтается - это к программатору (на коннекторах под болты). питание от USB Редукторов нет - странно, но он и так ездиет - не догонишь.
-------- GroverSuper.ucoz.net - мои странички.
|
|
| |
Space | Дата: Пятница, 08.02.2008, 20:40 | Сообщение # 12 |
Зарегистрирован 25.12.2007
Группа: Администраторы
Сообщений: 1103
Статус: Offline
| Класс. Только, что у тебя моторы на прямую к моторам подсоединены или через редукторэ
|
|
| |
Space | Дата: Пятница, 08.02.2008, 20:52 | Сообщение # 13 |
Зарегистрирован 25.12.2007
Группа: Администраторы
Сообщений: 1103
Статус: Offline
| Странно насколько я знаю эти моторы очень хилые. Я удивлён , что они тянут всё это. Но если положишь сверху хотябы 4 аккумулятора, то врятли. <_< В принципе для проверки сойдёт.
|
|
| |
Grover | Дата: Пятница, 08.02.2008, 21:01 | Сообщение # 14 |
Зарегистрирован 04.02.2008
Группа: Опытные
Сообщений: 130
Город: Воронеж
Статус: Offline
| я накаркал вперед и назад он даже с батарейками ездиет, а вот повороты не осилил - нужны редукторы!!!
-------- GroverSuper.ucoz.net - мои странички.
|
|
| |
Space | Дата: Пятница, 08.02.2008, 21:05 | Сообщение # 15 |
Зарегистрирован 25.12.2007
Группа: Администраторы
Сообщений: 1103
Статус: Offline
| Бывает. Сам когда начинал долго мучался с этим
|
|
| |