программирование в winavr

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
alex91
Родился
Сообщения: 5
Зарегистрирован: Ср сен 08, 2010 13:51:39

программирование в winavr

Сообщение alex91 »

всем добрый день у меня такая проблема мне необходима объединить три программы в одну я пробовал объединить но у меня одно действия мешает другому как так сделать чтобы они работали независимо
программа сделана под игрушечную машинку на ней стоит 1tsop-ы для объезда препятствий 2радиоуправление 3датчик освещенности в пространстве
хотелось сделать так если нет пару секунд команд от пульта он просто едет и объезжает препятствия но датчик срабатывал всегда независимо от того есть команды от пульта или нет
есть код на cи для winavr но он в ужасном состоянии его надо дорабатывать в программирование я только начинаю осваивать очень прошу помочите

#include <avr/io.h>
#include <util/delay.h>
#include <avr/iom8.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#define F_CPU 8000000UL // 8 MHz

void delay(unsigned short ms) // Минимальная задержка с кварцем 8 МГц - 1 мс
{

unsigned short i, j, k; // объявляем переменные

for (i=0; i<ms; i++) // главный цикл формирования задержки
for (j=0; j<185; j++) // вложенный цикл формирования задержки
k++; // произвольное действие
}

volatile int modulation=200; // длина всей посылки (можно менять)
unsigned long int t_1 = 9990;
SIGNAL(SIG_OVERFLOW0) //функция модуляции сигнала//
{
if(modulation<20) //длина пачки//
{
PORTB ^= 0b00000001;
}

else
{
PORTB &= 0b00000000;
}

if(modulation<200) //для счета длины посылки
{modulation++;}

else
{modulation=0;}

TCNT0 = 0;
}



void init_timer0 () //настройка таймера 0
{cli();
TCNT0 = 111;
TCCR0 = 1;
TIMSK = 1;
sei();
}


int main(void) //основная программа
{
DDRD ^= 0b00000001;/*фары*/

DDRB |= (1<<0); /* PB0 сконфигурировать как выход, ИК-светодиод */
DDRB |= (1<<1); /* PB1 сконфигурировать как выход, индикаторный светодиод 1 */
DDRB |= (1<<2); /* PB2 сконфигурировать как выход, индикаторный светодиод 2 */
DDRB |= (1<<3); /* PB3 сконфигурировать как выход, индикаторный светодиод 3 */


/* PB5 */
/* PB6 */
/* PB7 */

DDRC &= (~(1<<0)); /* датчик света в пространстве */
DDRC |= (1<<1); /* PC1 сконфигурировать как выход, драйвер двигателя */
DDRC |= (1<<2); /* PC2 сконфигурировать как выход, драйвер двигателя */
DDRC |= (1<<3); /* PC3 сконфигурировать как выход, драйвер двигателя */
DDRC |= (1<<4); /* PC4 сконфигурировать как выход, драйвер двигателя */
/* PC5 */
/* PC6 */
/* PC7 */

DDRD &= (~(1<<1)); /* PD4 сконфигурировать как вход, канал радиоуправления */
DDRD &= (~(1<<2)); /* PD4 сконфигурировать как вход, канал радиоуправления */
DDRD &= (~(1<<3)); /* PD4 сконфигурировать как вход, канал радиоуправления */
DDRD &= (~(1<<4)); /* PD4 сконфигурировать как вход, канал радиоуправления */
DDRD &= (~(1<<5)); /* PD5 сконфигурировать как вход, TSOP 1 */
DDRD &= (~(1<<6)); /* PD6 сконфигурировать как вход, TSOP 2 */
DDRD &= (~(1<<7)); /* PD7 сконфигурировать как вход, TSOP 3 */

PORTD |= (1<<1); /* PD4 установить "1", включаем подтягивающий резистор */
PORTD |= (1<<2); /* PD4 установить "1", включаем подтягивающий резистор */
PORTD |= (1<<3); /* PD4 установить "1", включаем подтягивающий резистор */
PORTD |= (1<<4); /* PD4 установить "1", включаем подтягивающий резистор */
PORTD |= (1<<5); /* PD5 установить "1", включаем подтягивающий резистор */
PORTD |= (1<<6); /* PD6 установить "1", включаем подтягивающий резистор */
PORTD |= (1<<7); /* PD7 установить "1", включаем подтягивающий резистор */

_delay_ms(100); //сброс ложного сигнала тсопа при включении (можно убрать)

init_timer0(); //инициализация таймера!!!

while(1) /* бесконечный цикл */
{


/* ---------- моторы вперед ---------- */

PORTC |= (1<<1); /* установить "1" на линии 1 порта C */
PORTC &= (~(1<<2)); /* установить "0" на линии 2 порта C */
PORTC |= (1<<3); /* установить "1" на линии 3 порта C */
PORTC &= (~(1<<4)); /* установить "0" на линии 4 порта C */

/* ---------- */



/* проверка TSOP 1 */
if( !(PIND & (1<<5)) ) /* проверить "0" на PD5 */
{
PORTB |= (1<<1); /* установить "1" на PB1, включить индикаторный светодиод */

/* ------- левый мотор назад, правый мотор вперед ------- */


PORTC &= (~(1<<1)); /* установить "0" на линии 1 порта C */
PORTC |= (1<<2); /* установить "1" на линии 2 порта C */
PORTC |= (1<<3); /* установить "1" на линии 3 порта C */
PORTC &= (~(1<<4));
/* ---------- */

_delay_ms(1000); /* задержка */

PORTB &= (~(1<<1)); /* установить "0" на PB1, выключить индикаторный светодиод */
}


/* проверка TSOP 2 */
if( !(PIND & (1<<6)) ) /* проверить "0" на PD6 */
{
PORTB |= (1<<2); /* установить "1" на PB2, включить индикаторный светодиод */

/* ---------- моторы назад ---------- */

PORTC &= (~(1<<1)); /* установить "0" на линии 1 порта C */
PORTC |= (1<<2); /* установить "1" на линии 2 порта C */
PORTC &= (~(1<<3)); /* установить "0" на линии 3 порта C */
PORTC |= (1<<4); /* установить "1" на линии 4 порта C */
_delay_ms(175);


PORTC &= (~(1<<1)); /* установить "0" на линии 1 порта C */
PORTC |= (1<<2); /* установить "1" на линии 2 порта C */
PORTC |= (1<<3); /* установить "1" на линии 3 порта C */
PORTC &= (~(1<<4));
_delay_ms(700);

/* ---------- моторы назад ---------- */

PORTB &= (~(1<<2)); /* установить "0" на PB2, выключить индикаторный светодиод */
}


/* проверка TSOP 3 */
if( !(PIND & (1<<7)) ) /* проверить "0" на PD7 */
{
PORTB |= (1<<3); /* установить "1" на PB3, включить индикаторный светодиод */

/* ------- левый мотор вперед, правый мотор назад ------- */

PORTC &= (~(1<<1)); /* установить "0" на линии 1 порта C */
PORTC |= (1<<2); /* установить "1" на линии 2 порта C */
PORTC |= (1<<3); /* установить "1" на линии 3 порта C */
PORTC &= (~(1<<4));

/* ---------- */

_delay_ms(1000); /* задержка */

PORTB &= (~(1<<3)); /* установить "0" на PB3, выключить индикаторный светодиод */
}
/* ---- датчик света в пространстве ---- */

if( !(PINC & (1<<0)) ) /* проверить "0" на PD5 */
{
PORTD &= 0b00000001; /* установить "0" на линии 0 порта D */
}
else
{
PORTD ^= 0b00000001; /* установить "1" на линии 0 порта D */
}
/* ------РАДИОУПРАВЛЕНИЕ----------- */

{

if( (PIND & (1<<PIND1)) && /* проверить "1" на линии 1 порта D */
(PIND & (1<<PIND2)) && /* проверить "1" на линии 2 порта D */
(PIND & (1<<PIND3)) && /* проверить "1" на линии 3 порта D */
(PIND & (1<<PIND4)) ) /* проверить "1" на линии 4 порта D */
{

t_1 = t_1 + 1;

}
else
{


if ( PIND & (1<<PIND1) ) /* проверить "1" на линии 1 порта D */
{ // ---------- включаем моторы вперед ----------

PORTC |= _BV(PC1); // установить "1" на линии 1 порта D
PORTC &= ~_BV(PC2); // установить "0" на линии 2 порта D
PORTC |= _BV(PC3); // установить "1" на линии 3 порта D
PORTC &= ~_BV(PC4); // установить "0" на линии 4 порта D
}
else
{ PORTC &= ~_BV(PC2); } /* установить "0" на линии 1 порта C */
/* ---------- */

if ( PIND & (1<<PIND3) ) /* проверить "1" на линии 2 порта D */
{ // ---------- отъезд назад ----------
PORTC &= ~_BV(PC1); // установить "0" на линии 1 порта D
PORTC |= _BV(PC2); // установить "1" на линии 2 порта D
PORTC &= ~_BV(PC3); // установить "0" на линии 3 порта D
PORTC |= _BV(PC4); // установить "1" на линии 4 порта D
}
else
{ PORTC &= ~_BV(PC3); } /* установить "0" на линии 2 порта C */


if ( PIND & (1<<PIND4) ) /* проверить "1" на линии 3 порта D */
{ // ---------- поворот ----------

PORTC |= _BV(PC1); // установить "1" на линии 1 порта D
PORTC &= ~_BV(PC2); // установить "0" на линии 2 порта D
PORTC |= _BV(PC3); // установить "1" на линии 3 порта D
}
else
{ PORTC &= ~_BV(PC4); } /* установить "0" на линии 4 порта C */

/* ---------- поворот ---------- */
if ( PIND & (1<<PIND5) ) /* проверить "1" на линии 5 порта D */
{ PORTC &= ~_BV(PC1); // установить "0" на линии 0порта C
PORTC |= _BV(PC2); // установить "1" на линии 2 порта C
PORTC |= _BV(PC3); // установить "1" на линии 3 порта C
}
else
{ PORTC &= ~_BV(PC4); } /* установить "0" на линии 4 порта C */


t_1 = 0;

}
}
}

} /* закрывающая скобка бесконечного цикла */
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: программирование в winavr

Сообщение ARV »

это не код, а УЖОС!!!! :o

Код: Выделить всё

void delay(unsigned short ms) // Минимальная задержка с кварцем 8 МГц - 1 мс
{
   unsigned short i, j, k; // объявляем переменные

   for (i=0; i<ms; i++) // главный цикл формирования задержки
      for (j=0; j<185; j++) // вложенный цикл формирования задержки
         k++; // произвольное действие
}
задержки пустыцми циклами делать нельзя - оптимизатор это выбросит и задержка будет нулевая

Код: Выделить всё

SIGNAL(SIG_OVERFLOW0) 
макрос SIGNAL не рекомендуется к применению, хотя его поддержка оставлена для совместимости со старыми программами

Код: Выделить всё

DDRD &= (~(1<<1)); /* PD4 сконфигурировать как вход, канал радиоуправления */
DDRD &= (~(1<<2)); /* PD4 сконфигурировать как вход, канал радиоуправления */
DDRD &= (~(1<<3)); /* PD4 сконфигурировать как вход, канал радиоуправления */
DDRD &= (~(1<<4)); /* PD4 сконфигурировать как вход, канал радиоуправления */
DDRD &= (~(1<<5)); /* PD5 сконфигурировать как вход, TSOP 1 */
DDRD &= (~(1<<6)); /* PD6 сконфигурировать как вход, TSOP 2 */
DDRD &= (~(1<<7)); /* PD7 сконфигурировать как вход, TSOP 3 */
просто тихий ужас... хотя работать будет

подобного там много, точнее, весь код такой. если его причесать, то хоть можно будет понять, что к чему, а в таком виде... :(
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
alex91
Родился
Сообщения: 5
Зарегистрирован: Ср сен 08, 2010 13:51:39

Re: программирование в winavr

Сообщение alex91 »

я же говорил в программировании я начинающий код та работает но не так как надо когда его включаешь он должен ехать а он просто стоит но тсопы у него реагируют датчик освещенности у него вообще не работает ни как не могу разобратся :(
убрал void delay(unsigned short ms) // Минимальная задержка с кварцем 8 МГц - 1 мс
и программа вообще не хочет компелироватся :(
Аватара пользователя
Danko
Сверлит текстолит когтями
Сообщения: 1287
Зарегистрирован: Пн окт 13, 2008 11:45:54
Откуда: РФ, Крым, г.Бахчисарай
Контактная информация:

Re: программирование в winavr

Сообщение Danko »

alex91, во первых большие исходники оформляются вложением, а во вторых тема по WinAVR уже есть.

два нарушения правил форума. :idea: :idea: :idea:
Первое, что привлекает в программировании, объяснить просто: ты говоришь компьютеру что то сделать, и он это делает. Безошибочно. Всегда. Без возражений.
---------------------
Линус Торвальдс. "Just for fun. Рассказ нечаянного революционера"
Murav
Опытный кот
Сообщения: 877
Зарегистрирован: Чт фев 18, 2010 13:51:56

Re: программирование в winavr

Сообщение Murav »

alex91 писал(а):я же говорил в программировании я начинающий

Именно по этому и не получается сделать такую сложную программу - для этого нужно уметь правильно структурировать части программы. Во-первых здесь весь код свален в одну кучу в main'е и как результат в нём хрен чё найдёшь. Нужно как минимум вынести в отдельные функции управление моторами - этот код многократно дублируется(вообще нужно отучатся использовать copy-paste при написании кода - для этого есть функции и директивы препроцессора) и при этом он не зависит от остального кода. То же самое скорее всего относится и к радиоуправлению.
Хотя комментариев в программе много, но реально нужных из них всего два-три. В них не нужно писать "установить "0" на линии 1 порта C" - это и так видно из кода. Так же для блоков типа "/* ------- левый мотор назад, правый мотор вперед ------- */" обычно используются функции, а не комментарии. Хотя например "/* ------РАДИОУПРАВЛЕНИЕ----------- */" и т.п. можно и не выносить в отдельную функцию.
Кроме того делай форматирование кода по-нормальному. Внутри блоков if, else, for и т.д. из одного оператора не обязательно ставить {}. А в случае блоков, состоящих из нескольких строк надо делать отступы:

Код: Выделить всё

int func1(int a,char b)
{
   if (a<5) {
      return b;
   } else {
      int c;
      for (c=0;c<b;c++) {
         if (c>a) break;
      }
      return c;
   }
}

Мне чтобы прочитать код и первого поста потребовалось скопировать его в текстовый редактор и привести к нормальному виду. И только после этого я смог хоть что-нибудь в нём понять.
Ну и на форуме для кода есть специальный тег [ code ].

Ну и похоже что для такой задачи стоит использовать не последовательно выполняющийся в цикле код с задержками в секунды, а структуру с программными таймерами и обработкой событий от них и других устройств в основном цикле.

alex91 писал(а):#include <avr/io.h>
#include <util/delay.h>
#include <avr/iom8.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#define F_CPU 8000000UL // 8 MHz

Константу F_CPU надо указывать до инклюдов - она в h-файлах тоже может использоваться.

alex91 писал(а):убрал void delay(unsigned short ms) // Минимальная задержка с кварцем 8 МГц - 1 мс
и программа вообще не хочет компелироватся

Значит неправильно убрал - эта функция не используется нигде.

Danko писал(а):тема по WinAVR уже есть

Там вопросы по работе компилятора, а тут - проблемы с написанием кода. С тем же успехом все темы здесь можно отнести к темам про компиляторы - в них во всех программа на чём-нибудь компилится.
alex91
Родился
Сообщения: 5
Зарегистрирован: Ср сен 08, 2010 13:51:39

Re: программирование в winavr

Сообщение alex91 »

спасибо за ответы
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

Re: программирование в winavr

Сообщение avreal »

А ещё сразу отвыкайте писать такие комментарии

Код: Выделить всё

    (PIND & (1<<PIND4)) ) /* проверить "1" на линии 4 порта D */
Лишние комментарии только мешают читать код. Вся необходимая информация уже есть в именах PIND, PIND4.

Или уже тогда будьте последовательны и пишите ещё и такие

Код: Выделить всё

    t_1 = t_1 + 1;  /* прибавить 1 к t_1 */


p.s.
#include <avr/iom8.h>
не нужно. При правильном ключе компилятору -mmcu=atmega8 это будет сделано автоматически из <avr/io.h>
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Аватара пользователя
Aheir
Модератор
Сообщения: 4517
Зарегистрирован: Пн апр 03, 2006 11:43:25
Откуда: Санкт - Петербург
Контактная информация:

Re: программирование в winavr

Сообщение Aheir »

Тема оформлена с нарушениями.
Исходный код такого размера оформляется вложением.
Тема по WinAVR есть в начале раздела.
Закрыто.
Оптимизм х (Опыт + Знания) = const
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»