Форум myROBOT.ru » Шаг за шагом » Программирование микроконтроллеров » стробоскоп на фары автомобиля ....

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

46. nest - 22 Января, 2011 - 23:09:06 - перейти к сообщению
cjA пишет:
rem нужно заметить что в атмелях нет приоритетов в прерываниях, если возникло одно и вылезти из него не может, то другое его не вытащит.
Вы опять?
RESET легко вытаскивает с любого прерывания.
Завсишее прерывание вообще не рассматривается, ибо это криворукость программиста, а не микроконтроллера.
47. cjA - 22 Января, 2011 - 23:25:00 - перейти к сообщению
Это Вы опять, давйте вместо резета МК кувалдой разобьем, а?

Что неправильного я сказал? Ненужно в обрабодчиках прерывания разные ИФ и ЭЛЗЕ ставить, разве нет?
48. nest - 22 Января, 2011 - 23:29:29 - перейти к сообщению
cjA пишет:
Ненужно в обрабодчиках прерывания разные ИФ и ЭЛЗЕ ставить, разве нет?
если программа написана нормально - хоть двадцать штук ставте.

Вы вообще что обсудить хотите?
Приоритет прерываний - есть. Что ещё не нравится?
Ещё раз скажите, что приоритета прерываний нету - режу сразу. Ибо это чушь.
49. mihail - 23 Января, 2011 - 00:15:43 - перейти к сообщению
программа
50. Demckiy - 23 Января, 2011 - 08:45:39 - перейти к сообщению
mihail пишет:
программа


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

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

И еще добавил в основной цикл PORTC = 0b00000001; и PORTC = 0b00000000; программа перекосилась полностью . чего так ???
51. nest - 23 Января, 2011 - 15:23:44 - перейти к сообщению
Demckiy пишет:
зачем вот эта строка :
TIFR = 0b11000100; /* сброс флагов прерываний таймеров/счетчиков */

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

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

PS Не судьба Вам стробоскоп из фар сделать Голливудская улыбка
53. Demckiy - 23 Января, 2011 - 22:13:24 - перейти к сообщению
mihail, смеяться может каждый, а от помочь и объяснить начинающему Замешательство

PS Если настойчиво взяться, то все судьба.... Улыбка
54. mihail - 24 Января, 2011 - 05:06:48 - перейти к сообщению
/*******************************************
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)
{

}
}
55. Demckiy - 28 Января, 2011 - 19:46:16 - перейти к сообщению
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); // Задержка
}


Вот, картинка на которой показано что должно получится
56. mihail - 29 Января, 2011 - 21:14:55 - перейти к сообщению
Demckiy пишет:
if ((!PIND.0) & (!PIND.3==1))
Странная конструкция. Что именно она должна делать?

PS Программирую МК не больше года. До этого, был опыт программирования для ПК. Начинал с простого "hello world". Хороший ресурс по программированию на С для микроконтроллеров http://chipenable.ru/
57. Demckiy - 29 Января, 2011 - 23:07:15 - перейти к сообщению
mihail пишет:
Demckiy пишет:
if ((!PIND.0) & (!PIND.3==1))
Странная конструкция. Что именно она должна делать?

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


этой конструкцией проверялось нажатие кнопки и какой выбранный еффект.
58. nest - 29 Января, 2011 - 23:37:51 - перейти к сообщению
могу себе представить, как часто придётся менять лампочки...

59. mihail - 30 Января, 2011 - 01:59:04 - перейти к сообщению
Demckiy, я не понял, Вы таки сделали это? Шок

Вот работники жезла и свистка, романтики с большой дороги порадуются Помираю со смеху
60. Demckiy - 30 Января, 2011 - 08:32:04 - перейти к сообщению
mihail пишет:
Demckiy, я не понял, Вы таки сделали это? Шок

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


нет не сделала. А на чем лучше задержку на таймере или с помощью delay_ms????