Понедельник, 06.05.2024, 00:53
| RSS
[SEARCH_TITLE]
[SEARCH_FORM]
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Архив - только для чтения
Форум » Мастерская » Новичкам » Простая программа, а не работает! либо она тупит - либо я
Простая программа, а не работает! либо она тупит - либо я
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 не помогло cry


--------
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
Ты хотябы продемонстрируй на фото или видео на чем всё пробуешь и как это работает senile
 
GroverДата: Пятница, 08.02.2008, 20:39 | Сообщение # 11








Зарегистрирован 04.02.2008
Группа: Опытные
Сообщений: 130
Город: Воронеж
Статус: Offline
вот мое творение - первый и опытный образец. сейчас даже датчиков нет - просто катается (почти smile )
собран на монтажной плате...

Добавлено (08.02.2008, 20:39)
---------------------------------------------
там проводочек со штекером болтается - это к программатору (на коннекторах под болты).
питание от USB biggrin
Редукторов нет - странно, но он и так ездиет - не догонишь.

Прикрепления: 5627451.jpg (29.7 Kb) · 2175927.jpg (33.5 Kb)


--------
GroverSuper.ucoz.net - мои странички.
 
SpaceДата: Пятница, 08.02.2008, 20:40 | Сообщение # 12








Зарегистрирован 25.12.2007
Группа: Администраторы
Сообщений: 1103
Статус: Offline
Класс. Только, что у тебя моторы на прямую к моторам подсоединены или через редукторэ surprised
 
SpaceДата: Пятница, 08.02.2008, 20:52 | Сообщение # 13








Зарегистрирован 25.12.2007
Группа: Администраторы
Сообщений: 1103
Статус: Offline
Странно насколько я знаю эти моторы очень хилые. Я удивлён surprised , что они тянут всё это. Но если положишь сверху хотябы 4 аккумулятора, то врятли. <_<
В принципе для проверки сойдёт. smile
 
GroverДата: Пятница, 08.02.2008, 21:01 | Сообщение # 14








Зарегистрирован 04.02.2008
Группа: Опытные
Сообщений: 130
Город: Воронеж
Статус: Offline
я накаркал sad

вперед и назад он даже с батарейками ездиет, а вот повороты не осилил sad - нужны редукторы!!!


--------
GroverSuper.ucoz.net - мои странички.
 
SpaceДата: Пятница, 08.02.2008, 21:05 | Сообщение # 15








Зарегистрирован 25.12.2007
Группа: Администраторы
Сообщений: 1103
Статус: Offline
Бывает. Сам когда начинал долго мучался с этим
 
Форум » Мастерская » Новичкам » Простая программа, а не работает! либо она тупит - либо я
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск: