Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 10.07.2011, 19:14  
artyomugr
Вид на жительство
 
Аватар для artyomugr
 
Регистрация: 05.04.2008
Адрес: Украина, Ахтырка
Сообщений: 302
Сказал спасибо: 148
Сказали Спасибо 31 раз(а) в 30 сообщении(ях)
artyomugr на пути к лучшему
По умолчанию Помогите разобраться с таймером в Atmega8

Добрый вечер господа!

Сегодня чуть крыша не сьехала...
Захотел реализовать декодер Sony sirc

Начал с самого простого, с захвата стартового бита. И на этом закончил...
Запутался основательно....
Пример брал с проекта по декодированию НЕК протокола.

Алгоритм для sony sirc представляю такой:

тактовая у нас 8000000
мы ее делим на 256
имеем 31250Гц таймер счетчик
Приемник ИК подключаю к прерыванию ИНТ 0 настраиваю прерывание по спаду
как только срабатывает прерывание запускаю таймер и отбиваю интервалы, но в прерывании половина работает не так как я хочу!!!

Например эта строчка не работает.. :

if (tmr_code‹13){ tmr_code++; } else { tmr_code=0; }

эта строка была помещена в прерывание и она ну никак не срабатывает....

вот ввесь код:[HTML]/************************************************** ***
This program was produced by the
CodeWizardAVR V1.25.9 Standard
Automatic Program Generator
© Copyright 1998-2008 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :
Version :
Date : 09.07.2011
Author : F4CG
Company : F4CG
Comments:


Chip type : ATmega8
Program type : Application
Clock frequency : 8,000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 256
************************************************** ***/

#include ‹mega8.h›
#include ‹delay.h›

unsigned char comand, data_code, adress, start=0;

//unsigned char comand_1 = 0b1000000;

//unsigned char comand_2 = 0;

//unsigned char comand_3 = 0b0001000;

//unsigned char adress_devices = 0b10000;

void tmr_reset()
{
TCCR0=0;
TCNT0=0;
//data_code=0;
comand=adress=0;
//GIMSK|=0x40; //разрешаем прерывания по входу
//EIFR=0x40; //сбрасываем флаг прерывания (если произошло)
}


/*

почему это не правильно работает? я хочу для начала захватить старт бит , код работает только не така как надо, декодер фиксирует стартовый бит и мигает светиком когда принял старт бит но только я отправлю не правильный стартовый бит тоесть с другого протокола так пульт сразу виснет и уже не принимает стартовый бит который принимал в этом коде только прерывания

*/





// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
// Place your code here

if (data_code==0) { TCCR0=0x04; } // 37,500 kHz start /256

if (data_code‹2)PORTB.5=1;else PORTB.5=0;


if (data_code==1) {
PORTB.2=0;
TCCR0=0;
if (TCNT0›65 && TCNT0‹100)
{

start=1;
TCCR0=0x04;
tmr_reset();
} else { PORTB.1=0; data_code=0; tmr_reset(); }
} else { PORTB.2=1;}

data_code++;









}

// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// Reinitialize Timer 0 value
//TCNT0=0xFF;
// Place your code here

tmr_reset();

}

// Declare your global variables here

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0xFF;

// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 37,500 kHz for 9,6 mHz
// Clock value: 31,250 kHz for 8,0 mHz
// system clock/256

//TCNT0=0xFF;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Any change
// INT1: Off
GICR|=0x40;
MCUCR=0x01;
GIFR=0x40;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x01;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
tmr_reset();

// Global enable interrupts
#asm("sei")

while (1)
{

// Place your code here
//if (data_code›26) { data_code=0; }

if (start==1)
{
PORTB = PORTB | (1‹‹4);
delay_ms(250);
PORTB = PORTB &~ (1‹‹4);
data_code=0;
start=0;
}
};
}
[/HTML]

Хочу понять как работать с таймером на самом деле...

например єто

if (TCNT0›40 && TCNT0‹80) { PORTB.0 = ~PORTB.0;}
тут мы читаем значение счетчика

а как тогда быть с этим?

прерывание таймера
{
TCNT0=0x10;
}
это получается прерывание при переполнении этого значения.. так получается что мы присваиваем таймеру/счетчику значение 0х10;
Запутался.... Пожалуйста не отправляйте в "гогль" я его очень долго курил и поиск на этом форуме курил. как мне подсчитать импульсы в прерывании , сравнить их и выполнить необходимые действия? Например мне надо определить импульс лог. Нуля равен интервалу 2400мкс или нет если да , зажечь светодиод если нет не зажигать, при чем остальные импульсы вплоть до 13 надо игнорировать...
С ув. Артем
Реклама:

Последний раз редактировалось artyomugr; 11.07.2011 в 18:51.
artyomugr вне форума  
Сказали "Спасибо" artyomugr
warel (28.06.2019)
Непрочитано 10.07.2011, 21:43  
MisterDi
Почётный гражданин KAZUS.RU
 
Аватар для MisterDi
 
Регистрация: 13.02.2008
Адрес: Днепр. Украина
Сообщений: 3,294
Сказал спасибо: 442
Сказали Спасибо 1,048 раз(а) в 706 сообщении(ях)
MisterDi на пути к лучшему
По умолчанию Re: Помогите пожалуйста разобраться :(

Цитата:
это получается прерывание при переполнении этого значения.. так получается что мы присваиваем таймеру/счетчику значение 0х10;
Это загрузка стартового значения таймера. Он начнет счет с 10Н и переполниться при значении 255, т.е. через 240 тактов.
Кроме того, я не увидел присваивания начального значения переменной data_code, а надеяться на компилятор - ИМХО не очень хорошая практика.
P.S. название темы лучше сделать по-информативнее.
__________________
misterdi<@>i.ua

Последний раз редактировалось MisterDi; 10.07.2011 в 22:00.
MisterDi вне форума  
Эти 2 пользователя(ей) сказали Спасибо MisterDi за это сообщение:
artyomugr (11.07.2011), warel (28.06.2019)
Непрочитано 11.07.2011, 00:31  
AndryG
Вид на жительство
 
Регистрация: 22.06.2006
Адрес: Украина
Сообщений: 308
Сказал спасибо: 19
Сказали Спасибо 32 раз(а) в 24 сообщении(ях)
AndryG на пути к лучшему
Радость Re: Помогите пожалуйста разобраться :(

Не помню уже подробностей протокола.
Помню только:
- он не похож на все остальные
- вот этот код у меня отлично работал с пультяшкой телика Sony

____
P.S.
Пять лет, оказывается, код пролежал .. и вот пригодился
Вложения:
Тип файла: zip SIRC.zip (5.8 Кб, 113 просмотров)
AndryG вне форума  
Эти 2 пользователя(ей) сказали Спасибо AndryG за это сообщение:
artyomugr (11.07.2011), warel (28.06.2019)
Непрочитано 11.07.2011, 19:02  
artyomugr
Вид на жительство
 
Аватар для artyomugr
 
Регистрация: 05.04.2008
Адрес: Украина, Ахтырка
Сообщений: 302
Сказал спасибо: 148
Сказали Спасибо 31 раз(а) в 30 сообщении(ях)
artyomugr на пути к лучшему
По умолчанию Re: Помогите пожалуйста разобраться :(

› Это загрузка стартового значения таймера. Он начнет счет с 10Н и переполниться при значении 255, т.е. через 240 тактов.
Кроме того, я не увидел присваивания начального значения переменной data_code, а надеяться на компилятор - ИМХО не очень хорошая практика.
P.S. название темы лучше сделать по-информативнее.

Здравствуйте! Спасибо Вам огромнейшее !!! Теперь понял
Значит я уже интервалы неправильно подобрал... а я думал иначе......
Я думал что таймер тикает от нуля и переполняется тогда когда достигнет значения 0х10;
А я вчера чуть не свихнулся! Не мог врубиться почему код не работает....

AndryG Спасибо Вам огромное за исходник! Буду разбираться сегодня.

Все свои результаты доложу

А кто мне скажет какая скорость опроса входа МК Атмега ?

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

MisterDi Обьясните мне пожалуйста! Вы первый человек который мне с пол пинка обьяснил настройку таймера Т0 Спасибо Вам!
Сообщение от MisterDi Посмотреть сообщение
Кроме того, я не увидел присваивания начального значения переменной data_code, а надеяться на компилятор - ИМХО не очень хорошая практика.
А разве переменная не примет значения? Я никогда не парился с этим...
думал что все эти переменные примут значение 0. А компилятор у меня настроен на максимальную оптимизацию по скорости.

Последний раз редактировалось artyomugr; 11.07.2011 в 19:15.
artyomugr вне форума  
Сказали "Спасибо" artyomugr
warel (28.06.2019)
Непрочитано 12.07.2011, 09:36  
MisterDi
Почётный гражданин KAZUS.RU
 
Аватар для MisterDi
 
Регистрация: 13.02.2008
Адрес: Днепр. Украина
Сообщений: 3,294
Сказал спасибо: 442
Сказали Спасибо 1,048 раз(а) в 706 сообщении(ях)
MisterDi на пути к лучшему
По умолчанию Re: Помогите разобраться с таймером в Atmega8

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

MisterDi Обьясните мне пожалуйста!
Честно говоря я с Atmega никогда не работал Но принцип везде одинаковый.
Вариантов несколько. Например:
1.У таймера есть вход разрешения счета. На этот вход подается сигнал. На вход счета подается внутренняя тактовая частота. Перед началом работы в таймер записывается 0, затем ждем пока сигнал станет равным 1, при этом таймер начинает считать. Дождавшись когда входной сигнал станет равным 0, в регистрах таймера получим длительность сигнала в периодах внутренней тактовой частоты. Тут нужно только следить за тем, чтобы таймер не переполнился, или дополнительно считать переполнения.
2.В некоторых МК есть модуль захвата, который по событиям на внешнем выводе фиксирует в специальных регистрах зачение таймера при изменении уровня на контроллируемом выводе. Разница между двумя значениями и будет длительностью входного сигнала в периодах тактовой частоты.

Вообще-то таймеры у разных МК имеют множество режимов и функций, и их сильно желательно тщательно изучить. Т.к. грамотное использование таймеров позволяет существенно сократить нагрузку на ЦП.
Цитата:
А разве переменная не примет значения? Я никогда не парился с этим...
думал что все эти переменные примут значение 0.
А как переменная принимает свое первое значение, сразу после сброса? Переменная - это ячейка памяти, после включения питания в ней может быть все, что угодно. Какие операции выполнять с памятью после включения питания и запуска программы компилятор знать не может. Некоторые выполняют очистку рабочей области памяти, некоторые -нет. Нужно смотреть документацию на используемый компилятор. Есть варианты, где это все настраивается. Для того, чтобы быть уверенным в том, что все переменные в программе имеют известные значения и обеспечить надежную работу в начале программы выполняют инициализацию всех переменных. Кстати пропуск прооцедуры начальной инициализации - типичная ошибка начинающих.
__________________
misterdi<@>i.ua

Последний раз редактировалось MisterDi; 12.07.2011 в 09:39.
MisterDi вне форума  
Сказали "Спасибо" MisterDi
warel (28.06.2019)
Непрочитано 12.07.2011, 16:56  
AndryG
Вид на жительство
 
Регистрация: 22.06.2006
Адрес: Украина
Сообщений: 308
Сказал спасибо: 19
Сказали Спасибо 32 раз(а) в 24 сообщении(ях)
AndryG на пути к лучшему
По умолчанию Re: Помогите разобраться с таймером в Atmega8

cvavr инициализирует нулем все глобальные переменные и совсем не трогает локальные.
Хватит уже мусолить эту переменную
AndryG вне форума  
Сказали "Спасибо" AndryG
warel (28.06.2019)
Непрочитано 12.07.2011, 16:58  
AndryG
Вид на жительство
 
Регистрация: 22.06.2006
Адрес: Украина
Сообщений: 308
Сказал спасибо: 19
Сказали Спасибо 32 раз(а) в 24 сообщении(ях)
AndryG на пути к лучшему
По умолчанию Re: Помогите разобраться с таймером в Atmega8

artyomugr, поведайте народу, что Вы хотите сотворить - разговор станет более предметным.
AndryG вне форума  
Сказали "Спасибо" AndryG
warel (28.06.2019)
Непрочитано 12.07.2011, 19:39  
artyomugr
Вид на жительство
 
Аватар для artyomugr
 
Регистрация: 05.04.2008
Адрес: Украина, Ахтырка
Сообщений: 302
Сказал спасибо: 148
Сказали Спасибо 31 раз(а) в 30 сообщении(ях)
artyomugr на пути к лучшему
По умолчанию Re: Помогите разобраться с таймером в Atmega8

Сообщение от AndryG Посмотреть сообщение
artyomugr, поведайте народу, что Вы хотите сотворить - разговор станет более предметным.
Я хочу разобраться с декодером ИК лучей Я все понимаю и алгоритм тоже
но вот не получается у меня фиксировать данные и точка!
Вот код например этот я выдрал с форума радиокот, но по моим подсчетам там не правильно настроен таймер...
я его настраиваю так как считаю правильным и не работает....

привожу оригинальный исходник
и исходник редактированный мною.

Оригинал:

Код:
/**************************************************  ***
Chip type           : ATmega16
Program type        : Application
Clock frequency     : 8,000000 MHz
Memory model        : Small
External SRAM size  : 0
Data Stack size     : 256
**************************************************  ***/

#include ‹mega16.h› 
#include ‹delay.h›

unsigned int tick = 0;          //счетчик тиков таймера
unsigned char b_cnt = 0;        //счетчик принятых бит
bit start_cond = 0;             //флаг стартового условия
bit repeat_cond = 0;            //флаг повтора

unsigned char addr = 0;         //байт адреса
unsigned char cmd = 0;          //байт команды

// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
        {
        TCNT0=0xFD;                                                             //запускаем таймер
        TCCR0=0x04;
        
        if (tick ›= 250 && tick ‹ 350)                                          //если случилось от 250 до 350 тиков
                {
                start_cond = 1;                                                 //фиксируем стартовое условие
                addr = cmd = 0;                                                 //обнуляем ранее полученную команду и адрес
                }

        if (tick ›= 18 && tick ‹ 50 && start_cond)                              //если случилось от 18 до 50 тиков
                {
                ++b_cnt;                                                        //приняли "1" и увеличили счетчик битов
                if (b_cnt ‹ 8) cmd = (cmd ‹‹ 1) + 1;                            //первые 7 бит - команда
                if (b_cnt ›= 8) addr = (addr ‹‹ 1) + 1;                         //вторые 5 бит - адрес
                }
        if (tick ›= 12 && tick ‹ 18 && start_cond)                              //если случилось от 12 до 18 тиков
                {
                ++b_cnt;                                                        //приняли "0" и увеличили счетчик битов
                if (b_cnt ‹ 8) cmd = (cmd ‹‹ 1);                                //далее - аналогично по битам
                if (b_cnt ›= 8) addr = (addr ‹‹ 1);
                }
        tick = 0;                                                               //обнулили тики
        if (b_cnt == 12)                                                        //если приняли уже все 12 битов
                {
                b_cnt = 0;                                                      //обнулили счетчик битов
                start_cond = 0;                                                 //сбросили стартовое условие
                TCCR0=0x00;                                                     //остановили таймер
                TCNT0=0x00;
                }
        }



// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
        {
        TCNT0=0xFD;                                                             //переинициализировали таймер - отсчитывает 96мкс
        if (++tick › 1200)                                                      //если насчитали более 1200 тиков
                {
                TCCR0=0x00;                                                     //сбросили все к исходному состоянию
                TCNT0=0x00;
                tick = 0;                                                       
                start_cond = 0;
                }
        }


void __sign (char digit)        //индикатор
        {
        switch (digit)
                {
                case 0 : PORTB = 0b01110111; break;
                
                case 1 : PORTB = 0b00000101; break;
                
                case 2 : PORTB = 0b01111001; break;
                
                case 3 : PORTB = 0b00111101; break;
                
                case 4 : PORTB = 0b00001111; break;
                
                case 5 : PORTB = 0b00111110; break;
                
                case 6 : PORTB = 0b01111110; break;
                
                case 7 : PORTB = 0b00010101; break;
                
                case 8 : PORTB = 0b01111111; break;
                
                case 9 : PORTB = 0b00111111; break;
                
                case 10 : PORTB = 0b01011111; break;   //'a'
                
                case 11 : PORTB = 0b01101110; break;   //'b'
                
                case 12 : PORTB = 0b01110010; break;   //'c'
                
                case 13 : PORTB = 0b01101101; break;   //'d'
                          
                case 14 : PORTB = 0b01111010; break;   //'e'
                          
                case 15 : PORTB = 0b01011010; break;   //'f'
                          
                case 16 : PORTB = 0b00000000; break;   //' '
                
                default:  PORTB = 0b00111000; 
                }
       }

 void __print (char a, char b, char c, char d, char e, char f, int t)      //Процедура вывода на индикатор символов с номерами a, b, с и d в течение t мс
        {
        int i = 0;
        //if (a == 0) a = 20;     //Если первый символ равен 0 - ничего не выводим
        while (i ‹ t/12)
                {  
                __sign (a);
                PORTC.7 = 1;
                delay_ms(2);
                PORTC.7 = 0;
                
                __sign (b);
                PORTC.6 = 1;
                delay_ms(2);
                PORTC.6 = 0;
                
                __sign (c);
                PORTC.5 = 1;
                delay_ms(2);
                PORTC.5 = 0; 
                
                __sign (d);
                PORTC.2 = 1;
                delay_ms(2); 
                PORTC.2 = 0;
                
                __sign (e);
                PORTC.3 = 1;
                delay_ms(2);
                PORTC.3 = 0;
                
                __sign (f);
                PORTC.4 = 1;
                delay_ms(2);
                PORTC.4 = 0;
                
                i++;
                }
        }       

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=Out Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=P State1=0 State0=P 
PORTA=0x05;
DDRA=0x02;

// Port B initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out 
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0 
PORTB=0x00;
DDRB=0xFF;

// Port C initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out 
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0 
PORTC=0x00;
DDRC=0xFF;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=P State1=T State0=T 
PORTD=0x04;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 125,000 kHz
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;

// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Falling Edge
// INT1: Off
// INT2: Off
GICR|=0x40;
MCUCR=0x02;
MCUCSR=0x00;
GIFR=0x40;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x01;


// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

#asm ("sei")

while (1) __print (start_cond, 16, cmd/16, cmd%16, addr/16, addr%16, 12);
      
}
моя переделка временных интервалов:

Код:
/ External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
        {
        TCNT0=0xFD;                                                             //запускаем таймер
        TCCR0=0x04;
        
        if (tick ›= 55 && tick ‹ 75)                                          //если случилось от 250 до 350 тиков
                {
                start_cond = 1;                                                 //фиксируем стартовое условие
                addr = cmd = 0;                                                 //обнуляем ранее полученную команду и адрес
                }

        if (tick ›= 25 && tick ‹ 50 && start_cond)                              //если случилось от 18 до 50 тиков
                {
                ++b_cnt;                                                        //приняли "1" и увеличили счетчик битов
                if (b_cnt ‹ 8) cmd = (cmd ‹‹ 1) + 1;                            //первые 7 бит - команда
                if (b_cnt ›= 8) addr = (addr ‹‹ 1) + 1;                         //вторые 5 бит - адрес
                }
        if (tick ›= 10 && tick ‹ 24 && start_cond)                              //если случилось от 12 до 18 тиков
                {
                ++b_cnt;                                                        //приняли "0" и увеличили счетчик битов
                if (b_cnt ‹ 8) cmd = (cmd ‹‹ 1);                                //далее - аналогично по битам
                if (b_cnt ›= 8) addr = (addr ‹‹ 1);
                }
        tick = 0;                                                               //обнулили тики
        if (b_cnt == 12)                                                        //если приняли уже все 12 битов
                {
                b_cnt = 0;                                                      //обнулили счетчик битов
                start_cond = 0;                                                 //сбросили стартовое условие
                TCCR0=0x00;                                                     //остановили таймер
                TCNT0=0x00;
                }
        }



// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
        {
        TCNT0=0xFD;                                                             //переинициализировали таймер - отсчитывает 96мкс
        if (++tick › 1200)                                                      //если насчитали более 1200 тиков
                {
                TCCR0=0x00;                                                     //сбросили все к исходному состоянию
                TCNT0=0x00;
                tick = 0;                                                       
                start_cond = 0;
                }
        }
мой код заточен под мега8

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

Пробовал заливать оригинал, так он вообще не работает...
artyomugr вне форума  
Сказали "Спасибо" artyomugr
warel (28.06.2019)
Непрочитано 12.07.2011, 19:42  
artyomugr
Вид на жительство
 
Аватар для artyomugr
 
Регистрация: 05.04.2008
Адрес: Украина, Ахтырка
Сообщений: 302
Сказал спасибо: 148
Сказали Спасибо 31 раз(а) в 30 сообщении(ях)
artyomugr на пути к лучшему
По умолчанию Re: Помогите разобраться с таймером в Atmega8

Сообщение от MisterDi Посмотреть сообщение
Честно говоря я с Atmega никогда не работал Но принцип везде одинаковый.
Вариантов несколько. Например:
1.У таймера есть вход разрешения счета. На этот вход подается сигнал. На вход счета подается внутренняя тактовая частота. Перед началом работы в таймер записывается 0, затем ждем пока сигнал станет равным 1, при этом таймер начинает считать. Дождавшись когда входной сигнал станет равным 0, в регистрах таймера получим длительность сигнала в периодах внутренней тактовой частоты. Тут нужно только следить за тем, чтобы таймер не переполнился, или дополнительно считать переполнения.
2.В некоторых МК есть модуль захвата, который по событиям на внешнем выводе фиксирует в специальных регистрах зачение таймера при изменении уровня на контроллируемом выводе. Разница между двумя значениями и будет длительностью входного сигнала в периодах тактовой частоты.

Вообще-то таймеры у разных МК имеют множество режимов и функций, и их сильно желательно тщательно изучить. Т.к. грамотное использование таймеров позволяет существенно сократить нагрузку на ЦП.

А как переменная принимает свое первое значение, сразу после сброса? Переменная - это ячейка памяти, после включения питания в ней может быть все, что угодно. Какие операции выполнять с памятью после включения питания и запуска программы компилятор знать не может. Некоторые выполняют очистку рабочей области памяти, некоторые -нет. Нужно смотреть документацию на используемый компилятор. Есть варианты, где это все настраивается. Для того, чтобы быть уверенным в том, что все переменные в программе имеют известные значения и обеспечить надежную работу в начале программы выполняют инициализацию всех переменных. Кстати пропуск прооцедуры начальной инициализации - типичная ошибка начинающих.
Большое Вам спасибо за разьяснение! Очень познавательно
artyomugr вне форума  
Сказали "Спасибо" artyomugr
warel (28.06.2019)
Непрочитано 12.07.2011, 19:44  
artyomugr
Вид на жительство
 
Аватар для artyomugr
 
Регистрация: 05.04.2008
Адрес: Украина, Ахтырка
Сообщений: 302
Сказал спасибо: 148
Сказали Спасибо 31 раз(а) в 30 сообщении(ях)
artyomugr на пути к лучшему
По умолчанию Re: Помогите разобраться с таймером в Atmega8

Сообщение от MisterDi Посмотреть сообщение
Честно говоря я с Atmega никогда не работал Но принцип везде одинаковый.
А с какими процами Вы работаете если не секрет?
artyomugr вне форума  
Сказали "Спасибо" artyomugr
warel (28.06.2019)
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите разобраться ,АЦП Тину 13, что то не так... Botan Микроконтроллеры, АЦП, память и т.д 2 14.09.2010 18:31
Помогите разобраться с таймером begun Proteus 1 11.04.2010 19:07
Помогите разобраться с импульсными стабилизаторами Vas2 Источники питания и свет 8 07.12.2007 17:27
pic16f870 - Помогите разобраться с таймерами bopohok Микроконтроллеры, АЦП, память и т.д 9 02.05.2007 16:50
кто пользуеться VMLABом. помогите разобраться... zuuuuk Proteus, KiCAD и другие ECAD 1 04.10.2006 12:12


Часовой пояс GMT +4, время: 19:41.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot