Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

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

 
Опции темы
Непрочитано 06.05.2011, 11:44  
Sany81
Частый гость
 
Регистрация: 30.08.2010
Сообщений: 46
Сказал спасибо: 0
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
Sany81 на пути к лучшему
По умолчанию 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");

датакабель вот такой:
Реклама:
Sany81 вне форума  
Сказали "Спасибо" Sany81
warel (27.06.2019)
Непрочитано 06.05.2011, 12:06  
niXto
Почётный гражданин KAZUS.RU
 
Аватар для niXto
 
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
niXto на пути к лучшему
По умолчанию Re: Mega48+USART= крокозябры

Где-то в прошивке косяки. Если бы в настройках юсарта - весь пакет был бы или целым, или битым
niXto вне форума  
Сказали "Спасибо" niXto
warel (27.06.2019)
Непрочитано 06.05.2011, 12:25  
OneTech
Вид на жительство
 
Регистрация: 09.10.2009
Сообщений: 356
Сказал спасибо: 21
Сказали Спасибо 64 раз(а) в 46 сообщении(ях)
OneTech на пути к лучшему
По умолчанию 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 вне форума  
Сказали "Спасибо" OneTech
warel (27.06.2019)
Непрочитано 06.05.2011, 12:49  
=GM=
Прописка
 
Регистрация: 21.09.2009
Сообщений: 218
Сказал спасибо: 1
Сказали Спасибо 29 раз(а) в 27 сообщении(ях)
=GM= на пути к лучшему
По умолчанию Re: Mega48+USART= крокозябры

OneTech, не будет передавать, у вас передатчик не разрешён.

UCSRB=0x90;
UART_send_str ("123456789ABCDEF", 16)

Последний раз редактировалось =GM=; 06.05.2011 в 12:57.
=GM= вне форума  
Сказали "Спасибо" =GM=
warel (27.06.2019)
Непрочитано 06.05.2011, 13:10  
akzamit
Частый гость
 
Аватар для akzamit
 
Регистрация: 15.07.2006
Сообщений: 26
Сказал спасибо: 1
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
akzamit на пути к лучшему
По умолчанию Re: Mega48+USART= кракозябры

в 90% случаев это иза неправильного тактирования. сейчас кодом помочь не могу тк на работе.
Попробуй использовать CVAVR -там есть визард быстрой настройки, и на нём сварганить за 10 минут проверочный код, если он будет работать, то значит дело в программе , если нет- то в железе. быстро и удобно.
Ещё вариант проверять простые программы- в протеусе.
было пару раз - тупил сам pfintf, попробуй вывести usart_putchar() по 1 символу
__________________
-

Последний раз редактировалось akzamit; 06.05.2011 в 13:14. Причина: .
akzamit вне форума  
Сказали "Спасибо" akzamit
warel (27.06.2019)
Непрочитано 06.05.2011, 13:53  
picavr
Почётный гражданин KAZUS.RU
 
Аватар для picavr
 
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
picavr на пути к лучшему
По умолчанию Re: Mega48+USART= кракозябры

Сообщение от akzamit Посмотреть сообщение
Ещё вариант проверять простые программы- в протеусе.
Ещё информативнее осцилографом ... запустить циклическую передачу одного байта и можно увидеть на какой скорости и что передаётся...
страно, что измерительные приборы не используются...
__________________
"picavr(ГАВ)мыло.ру" USB_Analyzer, Digital_Storage_Oscilloscope "picavr.kr1.ru" заказы в Китай компонентов/изготовление: плат/ЖКИ/мембраных клавиатур/имп трансформаторов
picavr вне форума  
Сказали "Спасибо" picavr
warel (27.06.2019)
Непрочитано 06.05.2011, 14:23  
akzamit
Частый гость
 
Аватар для akzamit
 
Регистрация: 15.07.2006
Сообщений: 26
Сказал спасибо: 1
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
akzamit на пути к лучшему
По умолчанию Re: Mega48+USART= кракозябры

Сообщение от picavr Посмотреть сообщение
Ещё информативнее осцилографом ... запустить циклическую передачу одного байта и можно увидеть на какой скорости и что передаётся...
страно, что измерительные приборы не используются...
просто догадываюсь, что они мало у кого есть.
а посчитать и проверить время передачи байта- не все додумываются до этого, +когда виртуально проверяешь (простой код) - экономишь на прошивке кристалла)
__________________
-
akzamit вне форума  
Сказали "Спасибо" akzamit
warel (27.06.2019)
Непрочитано 06.05.2011, 14:41  
Sany81
Частый гость
 
Регистрация: 30.08.2010
Сообщений: 46
Сказал спасибо: 0
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
Sany81 на пути к лучшему
По умолчанию 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
Sany81 вне форума  
Сказали "Спасибо" Sany81
warel (27.06.2019)
Непрочитано 06.05.2011, 14:45  
jump
Почётный гражданин KAZUS.RU
 
Регистрация: 20.06.2006
Адрес: Украина, Запорожье
Сообщений: 7,982
Сказал спасибо: 0
Сказали Спасибо 4,941 раз(а) в 2,370 сообщении(ях)
jump на пути к лучшему
По умолчанию Re: Mega48+USART= кракозябры

akzamit,
экономный вы наш...
сколько раз прошивается современный МК?
а шпротеус ваш - гуано, пол-форума на ушах стоит, рыдает, на сопли исходит, ошибки ища в программах.
только железо + различные дебаггеры фирменные (jtag, ...) могут помочь... да, забыл... без головы программисту-электронщику делать нечего
jump вне форума  
Сказали "Спасибо" jump
warel (27.06.2019)
Непрочитано 06.05.2011, 15:46  
=GM=
Прописка
 
Регистрация: 21.09.2009
Сообщений: 218
Сказал спасибо: 1
Сказали Спасибо 29 раз(а) в 27 сообщении(ях)
=GM= на пути к лучшему
По умолчанию Re: Mega48+USART= кракозябры

Сообщение от Sany81 Посмотреть сообщение
TCCR0B=0x00;

0123456789kol-vo = 0 //начинается лишняя передача данных, kol-vo = 0 говорит о том что прерывания с ИК приемника даже не было и таймер не был запущен, следовательно и прерывание по переполнению таймера тоже не должно срабатывать второй раз
Тут у вас две проблемы. Первая заключается в долгой обработке прерывания, используя несколько printf. Пока принты обрабатываются, возникает новое прерывание (каждые 138 мкс). Внутри прерывания вы запрещаете подачу клоков на таймер, так что нового переполнения не будет, но отложенное прерывание - должно сработать, оно и срабатывает.

Попробуйте после запрещения клоков внутри прерывания снять флаг прерывания вручную, должно помочь.

Вторая проблема у вас по-видимому связана с ПК, уарт не сразу синхронизируется, т.е. начинает принимать с середины бита. Для проверки попробуйте передавать байты с небольшим интервалом между ними. Ещё попробуйте почистить RX буфер ПК перед началом приёма.
=GM= вне форума  
Сказали "Спасибо" =GM=
warel (27.06.2019)
 

Закладки
Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Си -> Assembler (mega48) MKsoft Микроконтроллеры, АЦП, память и т.д 7 12.03.2009 14:31
Замена mega48 на mega8 ? woroba Микроконтроллеры, АЦП, память и т.д 4 04.02.2008 21:55
AVR Mega48 и самопрограммирование Alex_mel Микроконтроллеры, АЦП, память и т.д 1 17.05.2006 14:06


Часовой пояс GMT +4, время: 13:32.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot