Портал для радиолюбителей и разработчиков электроники · с 2003 годаРеклама на сайте
Найти компонент, схему или даташит

Даташиты, справочник отечественных приборов, схемы с разбором и живой форум

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

 
Опции темы

Помогите разобраться с таймером в Atmega8

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

Спасибо Вам всем за помощь! Буду пробовать. Результаты отпишу.
Реклама:
artyomugr вне форума  
Непрочитано 17.07.2011, 21:42  
OlegNZH
Почётный гражданин KAZUS.RUN
 
Регистрация: 28.02.2010
Сообщений: 2,294
Сказал спасибо: 52
Сказали Спасибо 460 раз(а) в 391 сообщении(ях)
OlegNZH на пути к лучшему
По умолчанию Re: Помогите разобраться с таймером в Atmega8

Кстати , я с пультов снимал осциллограммы на звуковую карточку , запоминаются разные коды, а потом сравниваются... (есть и Нормальный осцилл,но не запоминающий , а так -несколько пультов просмотрел на - всё отлично , с таймингами) (есть куча осциллографов программных (я даже кондюки входные с карточки не снимал))
OlegNZH вне форума  
Непрочитано 17.07.2011, 22:24  
CodeNameHawk
Вид на жительство
 
Регистрация: 21.10.2009
Сообщений: 349
Сказал спасибо: 181
Сказали Спасибо 65 раз(а) в 57 сообщении(ях)
CodeNameHawk на пути к лучшему
По умолчанию Re: Помогите разобраться с таймером в Atmega8

Сообщение от artyomugr Посмотреть сообщение
Что то я и с прерываниями запутался...

Разве прерывание не сработает когда придет стартовый импульс (лог 0) 2400мкс? я же настраиваю на спад, значит должно сработать по низкому уровню, переходом с высокого на низкий... у нас был лог. 1 а станет лог. 0 разве tick не начнет тикать?? =)
Я вам дал неверную информацию.
Дело в том, что сигнал с фото приемника будет инверсным и вы легко поймаете стартовый импульс.(Теперь получается что будут проблемы с поимкой последнего импульса, но будет работать и без него.)
Сигнал пульта Sony выглядит так http://www.sbprojects.com/knowledge/ir/sirc.php

Последний раз редактировалось CodeNameHawk; 17.07.2011 в 22:50.
CodeNameHawk вне форума  
Непрочитано 17.07.2011, 22:31  
CodeNameHawk
Вид на жительство
 
Регистрация: 21.10.2009
Сообщений: 349
Сказал спасибо: 181
Сказали Спасибо 65 раз(а) в 57 сообщении(ях)
CodeNameHawk на пути к лучшему
По умолчанию Re: Помогите разобраться с таймером в Atmega8

Сообщение от artyomugr Посмотреть сообщение
Вот если бы был овцелограф... я-бы наверное уже решил проблему...
А так приходится мучить в слепую...
Теперь я понял почему на три делится , спасибо Вам!
Если нет осцила, попробуйте передать импульсы на СОМ порт и посмотреть их моей прогой. http://sites.google.com/site/mariankmh/home/ir-to-com

Там схема почти как у вас, только подключен внешний кварц на 11,0592 МНz и приемник заведен на INT1.
CodeNameHawk вне форума  
Непрочитано 17.07.2011, 22:43  
CodeNameHawk
Вид на жительство
 
Регистрация: 21.10.2009
Сообщений: 349
Сказал спасибо: 181
Сказали Спасибо 65 раз(а) в 57 сообщении(ях)
CodeNameHawk на пути к лучшему
По умолчанию Re: Помогите разобраться с таймером в Atmega8

Немного переделал вашу программу
(схема подключения у меня как в предыдущем посте)
Код:
/**************************************************  ***
This program was produced by the
CodeWizardAVR V2.03.4 Standard
Automatic Program Generator
© Copyright 1998-2008 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project : 
Version : 
Date    : 15.07.2011
Author  : 
Company : 
Comments: 


Chip type           : ATmega16
Program type        : Application
Clock frequency     : 11.0592 MHz
Memory model        : Small
External RAM size   : 0
Data Stack size     : 256
**************************************************  ***/

#include ‹mega16.h›

// Standard Input/Output functions
#include ‹stdio.h›

// Declare your global variables here
#define yes 0
#define no  1

volatile unsigned char jest_start_impuls=no;    //Стартового импульса нет 
volatile unsigned int  tick = 0;                //счетчик тиков таймера
volatile unsigned char b_cnt = 0;               //счетчик принятых бит

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

const unsigned char dwa_w[7]={1,2,4,8,16,32,64};

void ostanovka_taimera_i_sbros_dannyh_posylki(void)
{
    TCCR1B=0x00;   //остановили таймер
    TCNT1=0x00;    //сброс таймера
    b_cnt = 0;     //обнулили счетчик битов
    cmd=0;
    addr=0;
    tick=0;
    jest_start_impuls=no;
}

// External Interrupt 1 service routine
interrupt [EXT_INT1] void ext_int1_isr(void)
{
        tick=TCNT1;     //сохранили количевство тиков таймера
        TCNT1=0x00;     //сброс таймера(если таймер запущен, начинается новый отсчет)     
        
        //это первое прерывание ?
        if (TCCR1B==0x00)   
        {
                //запускаем таймер,
                TCCR1B=4;   
        } else  //это уже не первое прерывание            
        {
                //был ли стартовый импульс ?
                if (jest_start_impuls==no)   
                {
                        //может это стартовый импульс ?
                        if ((tick ›110) && (tick‹150))
                        {
                                //Поймали стартовый импульс
                                jest_start_impuls=yes;   
                        }else  //Это не стартовый импульс
                        {
                                ostanovka_taimera_i_sbros_dannyh_posylki();
                        }
                }else   //стартовый импуль был, обрабатаваем дальше
                {       
                        //Проверка на минимальную длину импульса
                        if (tick ‹10)
                        {
                                //Пососылка короткая
                                ostanovka_taimera_i_sbros_dannyh_posylki();
                                //printf("EK %d\n\r",tick);
                        }        
                        if ((tick ›= 60) && (tick ‹ 150))                             //если случилось от  до  тиков
                        {
                                //приняли "1" 
                                if (b_cnt ‹ 7)  cmd  += dwa_w[b_cnt] ;                //первые 7 бит - команда
                                if (b_cnt ›= 7) addr += dwa_w[b_cnt-7] ;              //вторые 5 бит - адрес
                                tick=0;
                                b_cnt++;
                        }
                        if ((tick ›= 10) && (tick ‹ 60) )                              //если случилось от  до  тиков
                        {
                                //приняли "0" 
                                b_cnt++;
                        }

                        //Проверка на махимальную длину импульса
                        if (tick › 150)
                        {
                                ostanovka_taimera_i_sbros_dannyh_posylki();
                                //printf("ED %d\n\r",tick);
                        }        
                                
                        if (b_cnt == 11)                                                        
                        {
                                TCCR1B=0x00;                                                     //остановили таймер
                                printf("Com %d Adr %d \n\r", cmd, addr);
                                ostanovka_taimera_i_sbros_dannyh_posylki();
                        }
                        if (b_cnt › 11)                                                        
                        {
                                ostanovka_taimera_i_sbros_dannyh_posylki();
                                //printf ("EI \n\r");
                        }
                }  //конец if (jest_start_impuls=no)
                        
        }//конец end else
}

// Timer 1 overflow interrupt service routine
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
        ostanovka_taimera_i_sbros_dannyh_posylki();
}

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=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTA=0x00;
DDRA=0x00;

// 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=0x00;

// Port C 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 
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 1 initialization
// Clock source: System Clock
// Clock value: 43.200 kHz
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: On
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00; //TCCR1B=0x04;
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: On
// INT1 Mode: Falling Edge
// INT2: Off
GICR|=0x80;
MCUCR=0x08;
MCUCSR=0x00;
GIFR=0x80;

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

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: Off
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 57600
UCSRA=0x00;
UCSRB=0x08;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x0B;

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

#asm ("sei")

while (1)
      {
      // Place your code here
      
      };
}
Работает устойчиво. Обратите внимание что на выходе команда повторяется три раза. Думаю сами избавитесь от этого.

В файле сам проект и проект для протеуса.
Decode Sony pult.rar
CodeNameHawk вне форума  
Сказали "Спасибо" CodeNameHawk
artyomugr (20.07.2011)
Непрочитано 18.07.2011, 09:43  
SPKostenko
Частый гость
 
Регистрация: 08.08.2008
Сообщений: 16
Сказал спасибо: 0
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
SPKostenko на пути к лучшему
По умолчанию Re: Помогите разобраться с таймером в Atmega8

К тому, что сделал CodeNameHawk , уж точно нечего добавить.
SPKostenko вне форума  
Непрочитано 19.07.2011, 14:22  
CodeNameHawk
Вид на жительство
 
Регистрация: 21.10.2009
Сообщений: 349
Сказал спасибо: 181
Сказали Спасибо 65 раз(а) в 57 сообщении(ях)
CodeNameHawk на пути к лучшему
По умолчанию Re: Помогите разобраться с таймером в Atmega8

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

Сообщение от CodeNameHawk Посмотреть сообщение
if ((tick ›= 60) && (tick ‹ 150)) //если случилось от до тиков
{
//приняли "1"
if (b_cnt ‹ 7) cmd += dwa_w[b_cnt] ; //первые 7 бит - команда
if (b_cnt ›= 7) addr += dwa_w[b_cnt-7] ; //вторые 5 бит - адрес
tick=0;
b_cnt++;
}

Здравствуйте Спасибо Вам огромнейшее за код. Я кстати тоже смог всетаки поймать данные с пульта. Подправил немного код и все.

Вот поясните мне пожалуйста этот момент в Вашем коде, выше привожу цитату.

Не понятно мне это: cmd += dwa_w[b_cnt] ;

и это :

addr += dwa_w[b_cnt-7] ;
Просто начал изучать программирование недавно и такая конструкция встречается впервые.

С ув. Артем
artyomugr вне форума  
Непрочитано 20.07.2011, 12:23  
st_1
Заблокирован
 
Регистрация: 26.12.2009
Сообщений: 3,102
Сказал спасибо: 113
Сказали Спасибо 860 раз(а) в 610 сообщении(ях)
st_1 на пути к лучшему
По умолчанию Re: Помогите разобраться с таймером в Atmega8

+= увеличивает значение переменной на заданное число
-= уменьшение значения переменной на заданное число
*= умножить значение переменной на заданное число, результат записать в переменную
/= уменьшение значения переменной в заданное число раз
st_1 вне форума  
Непрочитано 20.07.2011, 12:41  
OlegNZH
Почётный гражданин KAZUS.RUN
 
Регистрация: 28.02.2010
Сообщений: 2,294
Сказал спасибо: 52
Сказали Спасибо 460 раз(а) в 391 сообщении(ях)
OlegNZH на пути к лучшему
По умолчанию Re: Помогите разобраться с таймером в Atmega8

Забыли слово " и присваивает" (Просто это Важно! в контексте не явно сказано, Сами додумывайте , Акцент Должен быть)

Последний раз редактировалось OlegNZH; 20.07.2011 в 12:45.
OlegNZH вне форума  
 
Опции темы

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

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, время: 15:18.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.