Всем привет!
В процессе обучения,
в первый раз "наступив на грабли" - остаёшься обычно спокоен,
во второй - сильно не переживаю - ошибся, с кем не бывает,
а вот в третий, на те же грабли - это уже смахивает на диагноз,
значит пора к врачу...
А вот скажите ДОКТОР, почему не работает ? ( На реальном МК )
Я попробовал 2 варианта(на самом деле 22,которые сводятся к 2)
Для CodeVisionAVR
Вариант № 1
Код:
/****************************************************
Сhip type : AT90S2313
Clock frequency : 4,000000 MHz
*****************************************************/
#include <90s2313.h>
unsigned char TEILER = 0; // Делитель для точной подгонки частоты до 1Гц
unsigned int SECUNDA = 0; // Счетчик прошедшего времени после старта
unsigned char PERIODE; // Переменная для условного перехода
............
..........
interrupt [TIM0_OVF] void timer0_ovf_isr(void) // Прерывание по переполнению Таймера_0
{ // Таймер досчитал от 12 до 255 выполнилось прерывание
TEILER++;
if (TEILER>15) // 16 Гц/15 Тик-так ~ 1Гц
{
SECUNDA++;
TEILER=0;
if (SECUNDA<=60) {PERIODE = 1;}
if (60<SECUNDA<=120) {PERIODE = 2;}
if (120<SECUNDA<=180) {PERIODE = 3;}
switch(PERIODE)
{
case 1: {if(SECUNDA % 2==0) {OCR1=OCR1+8;}}
break;
case 2: {OCR1=255;}
break;
case 3: {if(SECUNDA % 2==0) {OCR1=OCR1-8;}}
break;
}
}
TCNT0 = 0x0C; // Обновить цикл - записать в счётчик 12
}
...........................
Хотелось получить :
в первую мин. ШИМ изменяется от 0% до 100 %
во вторую остаётся на уровне 100%
в третью изменяется от 100% до 0 %
В действительности:
первые две мин.ничего не происходит
на 121 сек.(третья мин.) ШИМ скачком становится 100% и дальше как задумано
////////////////////////////////////////////////////////////////////////////////////////
Вариант № 2
Код:
unsigned int P1 = 60
unsigned int P2 = 120
unsigned int P3 = 180
........................
interrupt [TIM0_OVF] void timer0_ovf_isr(void) // Прерывание по переполнению Таймера_0
{ // Таймер досчитал от 12 до 255 выполнилось прерывание
TEILER=TEILER+1;
if (TEILER>15) // 16 Гц/15 Тик-так ~ 1Гц
{
TEILER=0;
SECUNDA=SECUNDA+1;
[color=blue]
if (SECUNDA<=P1) {if(SECUNDA % 2==0) {OCR1=OCR1+8;}}
if (P1<SECUNDA<=P2) {OCR1=255;}
if (P2<SECUNDA<=P3) {if(SECUNDA % 2==0) {OCR1=OCR1-8;}}[/color]
}
TCNT0 = 0x0C; // Обновить цикл - записать в счётчик 12
}
..........................
Если я использую P1 и P2 - работает как задумано,
но стоит добавить строчку
(if (P2<SECUNDA<=P3) {if(SECUNDA % 2==0) {OCR1=OCR1-8;}})т.е ещё один период ( а нужно ещё больше:7 ) - всё, висим и ничего не происходит...
Где я заблудился?
Помогите ДОКТОР!