А скорость передачи данных соответствует частоте кварца?
Да. Все делал через визард, все ок.
Продолжая тема отправки на UART.
Собственно конструирую ИК приемник на tsop. Разбираюсь. На уарт хотел выводить импульсы кнопок.
Сдается мне, что то я делаю не так. Посчитал частоту прерывания, сделал чтобы вызывалось каждые 0.002 сек. т.е. 2 мс.
Судя по описанию протокола rc5 - нормальное время. (пульт у меня lg).
Но в терминал уходят данные с огромной погрешностью. на 0.002 мс это не видно, потому что получаю я вот такое
- Код: Выделить всё
5 1 1 1 4 5 1 1 4 4 1 1 5 4 5 1 1 4 5 1 1 5 5 5 1 1 1 4
4ки и 5ки - стартовые биты. Остальное еденицы. Думаю подниму ка таймер... пусть будет чаще.
Было TCNT0=6;, ставлю 255.
Ловлю уже вот такое
- Код: Выделить всё
236 231 13 46 235 237 238 238 67 2
18 230 56 220 232 48 237 47 236
Причем жму я одну кнопку несколько раз, или другую - последовательность всегда разная и всегда случайная, пределах некоторого разброса. довольно большого как видите. (сейчас просто выводится длительность импульсов в мс*2)
Вопрос:
В чем подвох? Внутренний генератор врет ТАК сильно?
Или я что то не верно делаю в коде?
Примеров таких вещей на кодвижене в инете не нашел. Да и хочется разобратся самостоятельно, а не скопировать чужую программу.
Схема включения tsop следующая:
- Код: Выделить всё
---------
|TSOP|
---------
gnd vcc data
| | |--------------- Atmega PB0
-c-
(22 мкф)
| |
| R 100 ом
| |
-----------
| - + | питание 5в.
-----------
- Код: Выделить всё
/*****************************************************
This program was produced by the
CodeWizardAVR V1.25.7a Evaluation
Automatic Program Generator
© Copyright 1998-2007 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
Project :
Version :
Date : 25.11.2007
Author : Freeware, for evaluation and non-commercial use only
Company :
Comments:
Chip type : ATmega8
Program type : Application
Clock frequency : 1,000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 256
*****************************************************/
#include <mega8.h>
#include <delay.h>
// Standard Input/Output functions
#include <stdio.h>
int cnt=0; //счетчик
int snd=0; //флаг передачи
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// Reinitialize Timer 0 value
TCNT0=6;
//каждые 2 ms
if (PINB.0==0) {snd=1;}
if (snd==1) {cnt++;}
// Place your code here
}
// 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: 125,000 kHz
TCCR0=0x02;
TCNT0=6; // 6 = 0.002 sek
// 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
MCUCR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x01;
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: Off
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 2400
UCSRA=0x00;
UCSRB=0x08;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x19;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// Global enable interrupts
#asm("sei")
while (1)
{
// Place your code here
if ((PINB.0==1) && (snd==1)) {printf(" %d ",cnt); cnt=0; snd=0;}
};
}