Описание: не могу заставить что бы одновременно шим увеличивался и моргали фары |
| Поиск в теме | Версия для печати |
| mihail |
Отправлено: 16 Января, 2011 - 20:10:57
|

Гуру

Сообщений всего: 1065
Дата рег-ции: Март 2010
|
Все что касается таймера/счетчика 2 имеет отношение только к ШИМ. В программе это сделано для простоты и лучшего понимания. Все можно было сделать на одном таймере/счетчике.
Demckiy пишет:зачем мы в OCR2 записали число 15? Это начальное значение скважности ШИМ.
Demckiy пишет:(((1/8000000)*1024)*256)=0,03407, вот что получается, а не 4 сек. Это частота ШИМ.
Demckiy пишет:И как уменьшается ШИМ, объясните, с приведенным кодом с программы. ШИМ изменяется так как меняется значение OCR2.
CODE:OCR2 += 2; /* увеличение значения регистра сравнения таймера/счетчика 2 */
Demckiy пишет:Чего лампочка моргает когда ШИМ уменьшается при моделировании в PROTEUS'е ? Тут лучше на реальном устройстве проверять. Если моргания заметны, тогда нужно частоту ШИМ увеличить. Это уже особенности человеческого зрения. В кино, вроде, 24 кадра в секунду и никто не жалуется  |
| |
|
| Demckiy |
Отправлено: 19 Января, 2011 - 07:45:08
|
Полковник

Сообщений всего: 79
Дата рег-ции: Май 2010
|
исходник
Скачать файл: PWM.zipСкачан раз: 299(Отредактировано автором: 19 Января, 2011 - 07:45:31) |
| |
|
| Demckiy |
Отправлено: 22 Января, 2011 - 16:28:19
|
Полковник

Сообщений всего: 79
Дата рег-ции: Май 2010
|
1-увеличиваем ШИМ
0-уменьшаем ШИМ
CODE:if (stan == 1)
{
OCR2 -= 2; /* уменьшение значения регистра сравнения таймера/счетчика 2 */
}
else
{
OCR2 += 2; /* увеличение значения регистра сравнения таймера/счетчика 2 */
}
Правильное условие ????(Отредактировано автором: 22 Января, 2011 - 16:30:24) |
| |
|
| Demckiy |
Отправлено: 22 Января, 2011 - 20:08:08
|
Полковник

Сообщений всего: 79
Дата рег-ции: Май 2010
|
mihail, вот вся программа
CODE:
#include <mega8.h>
bit stan = 0;
/* запуск таймера/счетчика 2 (Шим+)
остановка таймера/счетчика 1 (время)
----------------------------
запуск таймера/счетчика 1 (время)
- остановка таймера/счетчика 2 (время)
запуск таймера/счетчика 2 (Шим-)
/* обработчик прерывания по внешнему сигналу на INT0 */
interrupt [EXT_INT0] void ext_int0_isr(void)
{
if (stan == 1)
{
stan = 0;
}
else
{
stan = 1;
TCNT2 = 0; /* обнуление счетного регистра таймера/счетчика 2 */
OCR2 = 15; /* запись начального значения в регистр сравнения таймера/счетчика 2 */
TCCR2 = 0b00000111; /* запуск таймера/счетчика 2 с предделителем 1024 */
TCCR1B = 0b00000000; /* остановка таймера/счетчика 1 с предделителем 1024 */
}
//PORTB |= 0b00000001; /* установить 1 на PB0, включение светодиода */
}
/* обработчик прерывания по переполнению таймера/счетчика 1 */
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
TCCR1B = 0b00000000; /* остановка таймера/счетчика 1 */
TCNT2 = 0; /* обнуление счетного регистра таймера/счетчика 2 */
OCR2 = 240;
stan = 0;
PORTC = 0b0000001;
TCCR2 = 0b00000111; /* запуск таймера/счетчика 2 с предделителем 1024 */
}
/* обработчик прерывания по переполнению таймера/счетчика 2 */
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
/* PORTB &= 0b11111110; /* установить 0 на PB0, выключение светодиода */
if (stan == 1)
{
OCR2 -= 2; /* увеличение значения регистра сравнения таймера/счетчика 2 */
}
else
{
OCR2 += 2; /* увеличение значения регистра сравнения таймера/счетчика 2 */
}
if ( OCR2 > 240 )// если значение регистра сравнения таймера/счетчика 2 больше 240 или меньше 15 то ... */
{
TCCR2 = 0b00000000; /* остановка таймера/счетчика 2 */
TCNT1 = 0; /* обнуление счетного регистра таймера/счетчика 1 */
TCCR1B = 0b00000101; /* запуск таймера/счетчика 1 с предделителем 1024 */
}
}
/* обработчик прерывания по совпадению таймера/счетчика 2 */
interrupt [TIM2_COMP] void timer2_comp_isr(void)
{
PORTB |= 0b00000001; /* установить 1 на PB0, включение светодиода */
}
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 = 15; /* запись начального значения в регистр сравнения таймера/счетчика 2 */
/* инициализация прерываний таймеров/счетчиков */
/* биты: OCIE2 TOIE2 TICIE1 OCIE1A OCIE1B TOIE1 - TOIE0 */
TIMSK = 0b11000100; /* разрешены прерывания по переполнению таймера/счетчика
1, по переполнению таймера/счетчика 2 и по совпадению таймера/счетчика 2 */
/* инициализация прерываний по внешнему сигналу */
/* биты: 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)
{
}
}
ШИМ наростает, но когда прошло 8 секунд должен спадать ШИМ,а он не уменьшается...((
Вы писала,предпочли бы другой какой-то вариант ,какой???(Отредактировано автором: 22 Января, 2011 - 20:13:23) |
| |
|
| Demckiy |
Отправлено: 22 Января, 2011 - 20:28:53
|
Полковник

Сообщений всего: 79
Дата рег-ции: Май 2010
|
mihail пишет:Я знаю, что программа работает не так как Вы хотите. Поэтому я и написал выше Цитата:Попробуйте сами выполнить написанную вами программу строчка за строчкой, оператор за оператором. Я могу переписать программу, чтобы она работала так как Вы хотите, но при этом Вы врядли разберетесь во всем этом. А значит, смысла в этом немного.
Программа это единое целое. Если Вы изменили что то, необходимо проследить как это повлияет на остальную часть программы.
mihail, пожалуйста перепишите программу ,с рус. комментариями. Заранее спасибо.
Я уже пробовал выполнить программу строчка за строчкой,оно не хочет работать. По готовом примере легче учится. и находить свои ошибки.(Отредактировано автором: 22 Января, 2011 - 20:32:23) |
| |
|
|
| Поиск в теме | Версия для печати |
| Страниц (5): « 1 2 [3] 4 5 » |
| « Программирование микроконтроллеров » |
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
|
  |
|
|
|