роботы робототехника микроконтроллеры


 Страниц (5): « 1 2 3 [4] 5 »   

> Описание: не могу заставить что бы одновременно шим увеличивался и моргали фары
nest Администратор Post Id



Администратор


Сообщений всего: 4866
Дата рег-ции: Сент. 2009  



cjA пишет:
rem нужно заметить что в атмелях нет приоритетов в прерываниях, если возникло одно и вылезти из него не может, то другое его не вытащит.
Вы опять?
RESET легко вытаскивает с любого прерывания.
Завсишее прерывание вообще не рассматривается, ибо это криворукость программиста, а не микроконтроллера.
 
 Top
cjA Post Id



Генерал


Сообщений всего: 3291
Дата рег-ции: Янв. 2010  



Это Вы опять, давйте вместо резета МК кувалдой разобьем, а?

Что неправильного я сказал? Ненужно в обрабодчиках прерывания разные ИФ и ЭЛЗЕ ставить, разве нет?
 
 Top
nest Администратор Post Id



Администратор


Сообщений всего: 4866
Дата рег-ции: Сент. 2009  



cjA пишет:
Ненужно в обрабодчиках прерывания разные ИФ и ЭЛЗЕ ставить, разве нет?
если программа написана нормально - хоть двадцать штук ставте.

Вы вообще что обсудить хотите?
Приоритет прерываний - есть. Что ещё не нравится?
Ещё раз скажите, что приоритета прерываний нету - режу сразу. Ибо это чушь.
 
 Top
mihail Post Id



Гуру


Сообщений всего: 1065
Дата рег-ции: Март 2010  



программа
Скачать файл: car.zip
Скачан раз: 281
 
 Top
Demckiy Post Id


Полковник


Сообщений всего: 79
Дата рег-ции: Май 2010  



mihail пишет:
программа


Огромное спасибо. По программе почти все ясно. зачем вот эта строка :

TIFR = 0b11000100; /* сброс флагов прерываний таймеров/счетчиков */

И еще добавил в основной цикл PORTC = 0b00000001; и PORTC = 0b00000000; программа перекосилась полностью . чего так ???
 
 Top
nest Администратор Post Id



Администратор


Сообщений всего: 4866
Дата рег-ции: Сент. 2009  



Demckiy пишет:
зачем вот эта строка :
TIFR = 0b11000100; /* сброс флагов прерываний таймеров/счетчиков */

вы даташит то откройте и почитайте, для чего нужен регистр TIFR.

Demckiy пишет:
добавил в основной цикл PORTC = 0b00000001; и PORTC = 0b00000000; программа перекосилась полностью . чего так ???
а что вы этим хотели добиться?
 
 Top
mihail Post Id



Гуру


Сообщений всего: 1065
Дата рег-ции: Март 2010  



Demckiy пишет:
добавил в основной цикл PORTC = 0b00000001; и PORTC = 0b00000000; программа перекосилась полностью. чего так ?
Программа и так кривая настолько, что дальше ей косится некуда гы-гы! Что то Вы недоговариваете. Управление светом работает на прерываниях, а до того что происходит в бесконечном цикле основной функции им дела нет (если только Вы не трогаете настройки задействованых таймеров и прерываний).

PS Не судьба Вам стробоскоп из фар сделать Голливудская улыбка
 
 Top
Demckiy Post Id


Полковник


Сообщений всего: 79
Дата рег-ции: Май 2010  



mihail, смеяться может каждый, а от помочь и объяснить начинающему Замешательство

PS Если настойчиво взяться, то все судьба.... Улыбка
 
 Top
mihail Post Id



Гуру


Сообщений всего: 1065
Дата рег-ции: Март 2010  



/*******************************************
Program :
Compiler : CVAVR
Chip type : ATmega8
System Clock : 8 MHz
*******************************************/


/*
при изменении состояние кнопки
медленно зажечь светодиод
подождать 8 секунд
медленно потушить светодиод
*/


#include <mega8.h>


/* объявление и инициализация глобальной переменной stan */
volatile unsigned char stan = 3;
/*
0 - гасим светодиод
1 - зажигаем светодиод
2 - ждем
3 - светодиод погашен
*/


/* обработчик прерывания по внешнему сигналу на INT0 */
interrupt [EXT_INT0] void ext_int0_isr(void)
{
if( stan == 0 ) /* если глобальная переменная stan равна 0 */
{
stan = 1; /* присвоение глобальной переменной stan значения 1 */
}

if( stan == 2 ) /* если глобальная переменная stan равна 2 */
{
TCNT1 = 0; /* обнуление счетного регистра таймера/счетчика 1 */
TIFR = 0b00000100; /* сброс флага прерывания по переполнению таймера/счетчика 1 */
}

if( stan == 3 ) /* если глобальная переменная stan равна 3 */
{
stan = 1; /* присвоение глобальной переменной stan значения 1 */
TCCR2 = 0b00000111; /* запуск таймера/счетчика 2 с предделителем 1024 */
}
}


/* обработчик прерывания по переполнению таймера/счетчика 1 */
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
TCCR1B = 0b00000000; /* остановка таймера/счетчика 1 */
stan = 0; /* присвоение глобальной переменной stan значения 0 */
TCCR2 = 0b00000111; /* запуск таймера/счетчика 2 с предделителем 1024 */
}


/* обработчик прерывания по переполнению таймера/счетчика 2 */
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
PORTB &= 0b11111110; /* установить 0 на PB0, выключение светодиода */

if(stan == 1) /* если глобальная переменная stan равна 1 */
{
OCR2 -= 2; /* уменьшение значения регистра сравнения таймера/счетчика 2 */
}
else /* если глобальная переменная stan не равна 1 */
{
OCR2 += 2; /* увеличение значения регистра сравнения таймера/счетчика 2 */
}

if( OCR2 > 240 ) /* если значение регистра сравнения таймера/счетчика 2 больше 240 ... */
{
stan = 3; /* присвоение глобальной переменной stan значения 3 */
TCCR2 = 0b00000000; /* остановка таймера/счетчика 2 */
}
}


/* обработчик прерывания по совпадению таймера/счетчика 2 */
interrupt [TIM2_COMP] void timer2_comp_isr(void)
{
PORTB |= 0b00000001; /* установить 1 на PB0, включение светодиода */

if( OCR2 < 15 ) /* если значение регистра сравнения таймера/счетчика 2 меньше 15 то ... */
{
TCCR2 = 0b00000000; /* остановка таймера/счетчика 2 */
stan = 2; /* присвоение глобальной переменной stan значения 2 */
TCCR1B = 0b00000101; /* запуск таймера/счетчика 1 с предделителем 1024 */
}
}


void main(void)
{
/* инициализация порта B */
DDRB = 0b00000001; /* PB0 светодиод */
PORTB = 0b00000000;

/* инициализация порта C */
DDRC = 0b00000000;
PORTC = 0b00000000;

/* инициализация порта D */
DDRD = 0b00000000; /* PD2 кнопка */
PORTD = 0b00000100;


/* инициализация таймера/счетчика 1 */
/* регистр управления таймером/счетчиком 1 А */
/* биты: COM1A1 COM1A0 COM1B1 COM1B0 FOC1A FOC1B WGM11 WGM10 */
TCCR1A = 0b00000000;


/* регистр управления таймером/счетчиком 1 В */
/* биты: ICNC1 ICES1 - WGM13 WGM12 CS12 CS11 CS10 */
TCCR1B = 0b00000000;

TCNT1 = 0; /* обнуление счетного регистра таймера/счетчика 1 */


/* инициализация таймера/счетчика 2 */
/* регистр асинхронного режима таймера/счетчика 2 */
/* биты: - - - - AS2 TCN2UB OCR2UB TCR2UB */
ASSR = 0b00000000;

/* регистр управления таймером/счетчиком 2 */
/* биты: FOC2 WGM20 COM21 COM20 WGM21 CS22 CS21 CS20 */
TCCR2 = 0b00000000;

TCNT2 = 0; /* обнуление счетного регистра таймера/счетчика 2 */

OCR2 = 240; /* запись начального значения в регистр сравнения таймера/счетчика 2 */


/* инициализация прерываний таймеров/счетчиков */

/* биты: OCIE2 TOIE2 TICIE1 OCIE1A OCIE1B TOIE1 - TOIE0 */
TIMSK = 0b11000100; /* разрешены прерывания по переполнению таймера/счетчика
1, по переполнению таймера/счетчика 2 и по совпадению таймера/счетчика 2 */

/* биты: OCF2 TOV2 ICF1 OCF1A OCF1B TOV1 - TOV0 */
TIFR = 0b11000100; /* сброс флагов прерываний таймеров/счетчиков */


/* инициализация прерываний по внешнему сигналу */
/* биты: SE SM2 SM1 SM0 ISC11 ISC10 ISC01 ISC00 */
MCUCR = 0b00000001; /* флаг прерывания выставляется при изменении логического
уровня на INT0 */

/* биты: INT1 INT0 - - - - IVSEL IVCE */
GICR = 0b01000000; /* разрешение прерывания INT0 */

/* биты: INTF1 INTF0 - - - - - - */
GIFR = 0b01000000; /* сброс флага INT0 */


/* общее разрешение прерываний */
#asm("sei"Подмигивающий;


while(1)
{

}
}

(Отредактировано автором: 25 Января, 2011 - 22:16:48)

 
 Top
Demckiy Post Id


Полковник


Сообщений всего: 79
Дата рег-ции: Май 2010  



mihail, а сколько лет Вы занимаетесь программированием микроконтроллеров???
И как начинали учится программировать микроконтроллеры ??

Если не секрет....


Спасибо огромное за программный код....Работает хорошо.
(Добавление)
С помощью ШИМа организовали такие действия:
(кнопка SW4 имитирует открытие/закрытие двери)
— открыл дверь — мгновенное включение света (L1) в салоне;
— закрыл дверь — задержка выключения света (L1) на 8 секунд, после чего, свет плавно гаснет в течении секунд;

Теперь в эту программу нужно добавить еще такое :

после нажатия на кнопку (SW5) моргает, трижды в секунду одна фара (L2), пауза, трижды в секунду другая фара (L3) ;

этот код добавил в основной цыкл программы,которая находится выше.

CODE:


[b]/* Эффект №1 */[/b]
if ((!PIND.0) & (!PIND.3==1))
{
PORTB.0=0; // off
delay_ms(300); // Задержка
PORTB.0=1; // on
delay_ms(300); // Задержка
PORTB.0=0; // off
delay_ms(300); // Задержка
PORTB.0=1; // on
delay_ms(300); // Задержка
PORTB.0=0; // off
delay_ms(300); // Задержка
PORTB.0=1; // on
delay_ms(300); // Задержка
PORTB.0=0; // off
delay_ms(700); // Задержка

PORTB.1=0; // off
delay_ms(300); // Задержка
PORTB.1=1; // on
delay_ms(300); // Задержка
PORTB.1=0; // off
delay_ms(300); // Задержка
PORTB.1=1; // on
delay_ms(300); // Задержка
PORTB.1=0; // off
delay_ms(300); // Задержка
PORTB.1=1; // on
delay_ms(300); // Задержка
PORTB.1=0; // off
delay_ms(700); // Задержка
}


Вот, картинка на которой показано что должно получится
Прикреплено изображение
prototype.gif

(Отредактировано автором: 28 Января, 2011 - 20:00:53)

 
 Top
mihail Post Id



Гуру


Сообщений всего: 1065
Дата рег-ции: Март 2010  



Demckiy пишет:
if ((!PIND.0) & (!PIND.3==1))
Странная конструкция. Что именно она должна делать?

PS Программирую МК не больше года. До этого, был опыт программирования для ПК. Начинал с простого "hello world". Хороший ресурс по программированию на С для микроконтроллеров http://chipenable.ru/

(Отредактировано автором: 29 Января, 2011 - 21:17:18)

 
 Top
Demckiy Post Id


Полковник


Сообщений всего: 79
Дата рег-ции: Май 2010  



mihail пишет:
Demckiy пишет:
if ((!PIND.0) & (!PIND.3==1))
Странная конструкция. Что именно она должна делать?

PS Программирую МК не больше года. До этого, был опыт программирования для ПК. Начинал с простого "hello world". Хороший ресурс по программированию на С для микроконтроллеров http://chipenable.ru/


этой конструкцией проверялось нажатие кнопки и какой выбранный еффект.
 
 Top
nest Администратор Post Id



Администратор


Сообщений всего: 4866
Дата рег-ции: Сент. 2009  



могу себе представить, как часто придётся менять лампочки...

 
 Top
mihail Post Id



Гуру


Сообщений всего: 1065
Дата рег-ции: Март 2010  



Demckiy, я не понял, Вы таки сделали это? Шок

Вот работники жезла и свистка, романтики с большой дороги порадуются Помираю со смеху
 
 Top
Demckiy Post Id


Полковник


Сообщений всего: 79
Дата рег-ции: Май 2010  



mihail пишет:
Demckiy, я не понял, Вы таки сделали это? Шок

Вот работники жезла и свистка, романтики с большой дороги порадуются Помираю со смеху


нет не сделала. А на чем лучше задержку на таймере или с помощью delay_ms????
 
 Top
Страниц (5): « 1 2 3 [4] 5 »
« Программирование микроконтроллеров »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 





Powered by Exclusive Bulletin Board
ExBB FM 1.0 RC1 Smiles by Fool from Foolstown
  Яндекс.Метрика   Рейтинг@Mail.ru