Проверить осциллографом нет возможности из за отсутствия такового.
МК 100% работает от внешнего кварца, т.к. если кварц вытащить, то его даже мой "мегапрошивальщик" не видит.
Пробовал отправлять по одному символу, все равно теряется или бьется несколько первых бит.
На скорости 19200 появился еще один глюк, дважды отсылаются данные, как будто прерывание по таймеру срабатывает дважды
Привожу саму программу, может в коде все же ошибка:
/************************************************** ***
Chip type :
ATmega48
Clock frequency : 7,372800 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 128
************************************************** ***/
#include ‹mega48.h›
#include ‹stdio.h›
unsigned char pulse_mark, pulse_space, s=0, i,n, bcount, code[4];
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
unsigned char timer;
timer=TCNT0;
TCNT0=0;
if (s==0)
{
for(i=0;i‹5;i++){code[i]=0;}
TCCR0B=0x05; //Пуск таймера
n=0;
bcount=0;
i=0;
}
if (s==1){pulse_mark=timer;}
if (s==2){pulse_space=timer;}
if (s›2){
if (n==0){
n=timer;
}else{
n=n+timer;
code[i]=code[i]‹‹1;
if ((n›14)&&(n‹19)){code[i]++;}
bcount++;
if (bcount›7){bcount=0;i++;}
n=0;
}
}
s++;
}
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// Place your code here
unsigned char count;
for(count=0;count‹10;count++) {putchar(48+count);} //для проверки
printf("kol-vo = %d\r\n",s);
printf("pulse_mark = %d\r\n",pulse_mark);
printf("pulse_space = %d\r\n",pulse_space);
for(count=0;count‹4;count++){printf("val %i = %d\r\n",count,code[count]);}
TCCR0B=0x00;
TCNT0=0x00;
s=0;
}
void main(void)
{
// Declare your local variables here
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Any change
EICRA=0x01;
EIMSK=0x01;
EIFR=0x01;
PCICR=0x00;
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: Off
// USART Transmitter: On
// USART0 Mode: Asynchronous
// USART Baud Rate: 19200
UCSR0A=0x00;
UCSR0B=0x08;
UCSR0C=0x06;
UBRR0H=0x00;
UBRR0L=0x17;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK0=0x01;
// Global enable interrupts
#asm("sei")
while (1)
{
};
}
За код просьба сильно не пинать, я Сями да и контроллерами занимаюсь совсем недавно, а вот дельные советы по оптимизации было бы неплохо услышать.
Вот данные которые приходят с МК на комп:
ІєВКZЅ±µvo = 68 //здесь часть данных побита и потеряна
pulse_mark = 33
pulse_space = 32
val 0 = 224
val 1 = 224
val 2 = 64
val 3 = 191
0123456789kol-vo = 0 //отсюда начинается повтор отправки данных, хотя его быть не должно
pulse_mark = 33
pulse_space = 32
val 0 = 224
val 1 = 224
val 2 = 64
val 3 = 191
или может прийти вот так:
23456789kol-vo = 68 //потеряны пару символов
pulse_mark = 33
pulse_space = 32
val 0 = 224
val 1 = 224
val 2 = 64
val 3 = 191
0123456789kol-vo = 0 //начинается лишняя передача данных, kol-vo = 0 говорит о том что прерывания с ИК приемника даже не было и таймер небыл запущен, следовательно и прерывание по переполнению таймера тоже не должно срабатывать второй раз.
pulse_mark = 33
pulse_space = 32
val 0 = 224
val 1 = 224
val 2 = 64
val 3 = 191