реклама на сайте
подробности

 
 
> Atmega8 + timer1 неточный ( дешифровка rc5 сигнала ), Не могу разоборатся почему непопадает в такт совсем
miXOnIN
сообщение Aug 31 2012, 14:25
Сообщение #1





Группа: Новичок
Сообщений: 6
Регистрация: 31-08-12
Пользователь №: 73 332



Здравствуйте.

Пытаюсь на базе atmega8 + кварц на 12MHz + tsop1736 сделать приёмник ИК диапазона от пультов ДУ.
Спустя сутки гугла сделал вроде-как рабочую программу, но есть огромная проблема, не пойму в чём дело.

И так, теоретическая часть:
Частота МК 12 000 000мгц, на таймере установлен делитель до 1 500 000мгц (1.5кк операций/сек как я понимаю)
В стандарте протокола написано, что длина одного бита 1.8ms, всего 14 битов
Тобишь, чтоб отсчитать 1.8ms ровно, при частоте 1 500 000 счётчик должен досчитать до: 1500000/1000*1.8=2700
Так в программе и сделал, счётчик установлен до 2700, после чего пишу бит, и обнуляю счётчик ожидая следующего бита, и так 14 бит
НО вот тут то и собака зарыта! Он вроде всё норм считает, но биты идут ДАЛЬШЕ 14го! (высчитал прерыванием) между первым и последним прирыванием счётчик успевает досчитать до 26-28, вот и главный вопрос - ПОЧЕМУ ТАК?
ошибка в таймере, слишком быстро считает? или частота резонатора кривая? (эти 2версии маловероятны, ибо я в ручную при ниже частоте отсчитывал и сравнивал кол-во цикла и прошедшего времени), но если он считает с норм скоростью, то почему тогда данные дальше принимаются? проверил 2 пульта ДУ, и там и там одно и то-же, тобишь вариант что это пульт нестандартный не с RC5 скорее всего отпадает

вот код на CVARV (тут + передача инфы с МК по rs232 через uart)

CODE
#include <mega8.h>
#include <stdio.h>

unsigned int bytes[14]={0,0,0,0,0,0,0,0,0,0,0,0,0,0};
unsigned int tmp=1;
unsigned int i=0;
unsigned int status=0;

// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
if(status==1)return;
status=1;
// #asm("cli")
bytes[0]=PIND.2;
TCCR1B=0x0A;
}



// Timer1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
if(tmp<14)bytes[tmp]=PIND.2;
tmp++;
if(tmp>=14){
TCCR1B=0x00; // вырубаем счётчик
TCNT1H=0x00; // сбрасываем часть 1
TCNT1L=0x00; // сбрасываем часть 2
tmp=1;
printf("!%u %u %u %u %u %u %u %u %u %u %u %u %u %u\r",bytes[0],bytes[0],bytes[1],bytes[2],bytes[3],bytes[4],bytes[5],
bytes[6],bytes[7],bytes[8],bytes[9],bytes[10],bytes[11],bytes[12],bytes[13]);
for(i=0;i<14;i++)bytes[i]=0;
status=0;
// #asm("sei")
}
}

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

// 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: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 1500,000 kHz
// Mode: CTC top=OCR1A
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: On
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00; // TCCR1B=0x0A; // 1 500 000Hz
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x0A; //1.8ms
OCR1AL=0x8C; //1.8ms
OCR1BH=0x00;
OCR1BL=0x00;


// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// 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=0x10;

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

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

// ADC initialization
// ADC disabled
ADCSRA=0x00;

// SPI initialization
// SPI disabled
SPCR=0x00;

// TWI initialization
// TWI disabled
TWCR=0x00;

// Global enable interrupts
printf("sei\r");
#asm("sei")

/*
while (1)
{

}
*/
}


п.с. именно в этом примере что щас - этот баг виден в том - что таймер успевает натикать 14 раз, записать эти все биты, оповестить меня об этом, перезапустить всё и часть этого-же кода - запустит прерывание наново чего быть аж никак не должно

Сообщение отредактировал IgorKossak - Sep 5 2012, 12:01
Причина редактирования: [codebox] для длинного кода!!!
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- miXOnIN   Atmega8 + timer1 неточный ( дешифровка rc5 сигнала )   Aug 31 2012, 14:25
- - ILYAUL   Вот это читали?   Aug 31 2012, 16:09
|- - miXOnIN   Цитата(ILYAUL @ Aug 31 2012, 19:09) Вот э...   Aug 31 2012, 16:57
|- - ARV   Цитата(ILYAUL @ Aug 31 2012, 20:09) Вот э...   Aug 31 2012, 17:48
|- - miXOnIN   Цитата(ARV @ Aug 31 2012, 20:48) а вот эт...   Aug 31 2012, 18:45
|- - _Артём_   Цитата(miXOnIN @ Aug 31 2012, 21:45) ибо ...   Aug 31 2012, 20:07
|- - _Pasha   Цитата(_Артём_ @ Aug 31 2012, 23:07) Знак...   Sep 1 2012, 00:51
||- - _Артём_   Цитата(_Pasha @ Sep 1 2012, 03:51) этта...   Sep 1 2012, 10:44
||- - miXOnIN   Цитата(_Артём_ @ Sep 1 2012, 13:44) Вы та...   Sep 1 2012, 11:37
|- - miXOnIN   Цитата(_Артём_ @ Aug 31 2012, 23:07) Как ...   Sep 1 2012, 07:03
- - stfrd   Я бы для начала убедился что пакет именно такой, к...   Aug 31 2012, 17:23
- - miXOnIN   Сделал нечто вроде анализатора протокола, это явны...   Sep 1 2012, 08:52
- - ArtemKAD   Цитатао фъюзах или настройке частоты даже и речи н...   Sep 1 2012, 11:09
- - ARV   зря, господа, вы тут мой метод раскритиковали... в...   Sep 1 2012, 11:11
- - ArtemKAD   Цитатанапример, лампа настроения на attiny13. даже...   Sep 1 2012, 11:26
|- - ARV   Цитата(ArtemKAD @ Sep 1 2012, 15:26) В Т1...   Sep 1 2012, 13:09
- - ArtemKAD   Цитата+ если БЕЗ мастера создавать, тобишь с 0 вес...   Sep 1 2012, 12:24


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 00:43
Рейтинг@Mail.ru


Страница сгенерированна за 0.01383 секунд с 7
ELECTRONIX ©2004-2016