Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
06.05.2011, 11:44
|
|
Частый гость
Регистрация: 30.08.2010
Сообщений: 46
Сказал спасибо: 0
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
|
Mega48+USART= кракозябры
добрый день.
Имею:
Mega48 тактируется от внешнего кварца кварц 7,3728.
К компу подключаю через телефонный датакабель(USB) от сименса.
На любой скорости передачи возникают ошибки, все возникают в начале передаваемого сообщения.Если передавать короткое сообщение в 10-15 символов, то оно все придет битое, если же сообщение длинное, то оно побьется только в начале, первые 10-15 символов.
Как победить эту ошибку? может ли быть дело в шнурке
настройки МК:
// 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;
передаю данные:
printf("1234567890");
датакабель вот такой:
|
|
|
|
06.05.2011, 12:06
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
|
Re: Mega48+USART= крокозябры
Где-то в прошивке косяки. Если бы в настройках юсарта - весь пакет был бы или целым, или битым
|
|
|
|
06.05.2011, 12:25
|
|
Вид на жительство
Регистрация: 09.10.2009
Сообщений: 356
Сказал спасибо: 21
Сказали Спасибо 64 раз(а) в 46 сообщении(ях)
|
Re: Mega48+USART= крокозябры
У вас случаем при связи с компом нету никакой ёмкости? Кракозяблы могут появляться в результате рассинхронизации/синхронизазации в результате плавания частоты от RC-генератора. Может быть не корректно стоят фусы и МК тактируется не от кварца. Коротните кварц для проверки или просмотрите осциллографом. Выкинте стандартную функцию и напишите свою, по крайней мере будете видеть где и что происходит и памяти меньше отожрётся.
#define TX_LED_on PORTD.7=1 //
#define TX_LED_off PORTD.7=0 //
void UART_send_str (flash unsigned char *str, unsigned char send_index)
{
unsigned char int_cnt0;
TX_LED_on;
for (int_cnt0=0; int_cnt0‹send_index; int_cnt0++)
{
while ((UCSRA&0x20)==0){};
UDR=send_str[str];
};
TX_LED_off;
};
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: Off
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=0x00;
UCSRB=0x08;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x2F;
UART_send_str ("0123456789ABCDEF", 16);
По нормальному задействуте прерывание для UART-а на передачу, что-бы не приходилось while-ться в цикле теряя драгоценны такты. Данный код для ATmega8 на частоте 7,3728 МГц, CodeVisionAVR. Настройки отличаются от запрошенных Вами.
__________________
Делая дело нужно в него верить на все 100%, иначе неизбежно будут возникать ошибки подпитывающие подсознательное сомнение.
Последний раз редактировалось OneTech; 09.05.2011 в 14:43.
|
|
|
Сказали "Спасибо" OneTech
|
|
|
06.05.2011, 12:49
|
|
Прописка
Регистрация: 21.09.2009
Сообщений: 218
Сказал спасибо: 1
Сказали Спасибо 29 раз(а) в 27 сообщении(ях)
|
Re: Mega48+USART= крокозябры
OneTech, не будет передавать, у вас передатчик не разрешён.
UCSRB=0x90;
UART_send_str ("123456789ABCDEF", 16)
Последний раз редактировалось =GM=; 06.05.2011 в 12:57.
|
|
|
|
06.05.2011, 13:10
|
|
Частый гость
Регистрация: 15.07.2006
Сообщений: 26
Сказал спасибо: 1
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
|
Re: Mega48+USART= кракозябры
в 90% случаев это иза неправильного тактирования. сейчас кодом помочь не могу тк на работе.
Попробуй использовать CVAVR -там есть визард быстрой настройки, и на нём сварганить за 10 минут проверочный код, если он будет работать, то значит дело в программе , если нет- то в железе. быстро и удобно.
Ещё вариант проверять простые программы- в протеусе.
было пару раз - тупил сам pfintf, попробуй вывести usart_putchar() по 1 символу
__________________
-
Последний раз редактировалось akzamit; 06.05.2011 в 13:14.
Причина: .
|
|
|
Сказали "Спасибо" akzamit
|
|
|
06.05.2011, 13:53
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
|
Re: Mega48+USART= кракозябры
Сообщение от akzamit
|
Ещё вариант проверять простые программы- в протеусе.
|
Ещё информативнее осцилографом ... запустить циклическую передачу одного байта и можно увидеть на какой скорости и что передаётся...
страно, что измерительные приборы не используются...
__________________
"picavr(ГАВ)мыло.ру" USB_Analyzer, Digital_Storage_Oscilloscope "picavr.kr1.ru" заказы в Китай компонентов/изготовление: плат/ЖКИ/мембраных клавиатур/имп трансформаторов
|
|
|
|
06.05.2011, 14:23
|
|
Частый гость
Регистрация: 15.07.2006
Сообщений: 26
Сказал спасибо: 1
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
|
Re: Mega48+USART= кракозябры
Сообщение от picavr
|
Ещё информативнее осцилографом ... запустить циклическую передачу одного байта и можно увидеть на какой скорости и что передаётся...
страно, что измерительные приборы не используются...
|
просто догадываюсь, что они мало у кого есть.
а посчитать и проверить время передачи байта- не все додумываются до этого, +когда виртуально проверяешь (простой код) - экономишь на прошивке кристалла)
__________________
-
|
|
|
Сказали "Спасибо" akzamit
|
|
|
06.05.2011, 14:41
|
|
Частый гость
Регистрация: 30.08.2010
Сообщений: 46
Сказал спасибо: 0
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
|
Re: Mega48+USART= кракозябры
Проверить осциллографом нет возможности из за отсутствия такового.
МК 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
|
|
|
|
06.05.2011, 14:45
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.06.2006
Адрес: Украина, Запорожье
Сообщений: 7,982
Сказал спасибо: 0
Сказали Спасибо 4,941 раз(а) в 2,370 сообщении(ях)
|
Re: Mega48+USART= кракозябры
akzamit,
экономный вы наш... ![Очень смешно](images/smilies/icon_veryhappy.gif)
сколько раз прошивается современный МК?
а шпротеус ваш - гуано, пол-форума на ушах стоит, рыдает, на сопли исходит, ошибки ища в программах.
только железо + различные дебаггеры фирменные (jtag, ...) могут помочь... да, забыл... без головы программисту-электронщику делать нечего
|
|
|
|
06.05.2011, 15:46
|
|
Прописка
Регистрация: 21.09.2009
Сообщений: 218
Сказал спасибо: 1
Сказали Спасибо 29 раз(а) в 27 сообщении(ях)
|
Re: Mega48+USART= кракозябры
Сообщение от Sany81
|
TCCR0B=0x00;
0123456789kol-vo = 0 //начинается лишняя передача данных, kol-vo = 0 говорит о том что прерывания с ИК приемника даже не было и таймер не был запущен, следовательно и прерывание по переполнению таймера тоже не должно срабатывать второй раз
|
Тут у вас две проблемы. Первая заключается в долгой обработке прерывания, используя несколько printf. Пока принты обрабатываются, возникает новое прерывание (каждые 138 мкс). Внутри прерывания вы запрещаете подачу клоков на таймер, так что нового переполнения не будет, но отложенное прерывание - должно сработать, оно и срабатывает.
Попробуйте после запрещения клоков внутри прерывания снять флаг прерывания вручную, должно помочь.
Вторая проблема у вас по-видимому связана с ПК, уарт не сразу синхронизируется, т.е. начинает принимать с середины бита. Для проверки попробуйте передавать байты с небольшим интервалом между ними. Ещё попробуйте почистить RX буфер ПК перед началом приёма.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 13:32.
|
|