Страница 1 из 2
UART постоянно шлет мусор в TXD
Добавлено: Сб июн 28, 2014 20:46:27
Gurvinok
Одну проблему решить не успел как свалилась другая. Может у кого было такое. Короче, после инициализации порта он постоянно шлет мусор на выход в TXD. Раньше такого не было. Единственное что я предполагаю это глюк МК. Он у меня на стенде для испытаний и я его раз 300 перезаливал. Может из-за этого быть?
Re: UART постоянно шлет мусор в TXD
Добавлено: Сб июн 28, 2014 21:16:05
Pink-Pank
Наводка?
Re: UART постоянно шлет мусор в TXD
Добавлено: Сб июн 28, 2014 22:28:46
ibiza11
Вряд ли из-за многократных перепрошиваний. Скорее что-то изменили в программе.
Re: UART постоянно шлет мусор в TXD
Добавлено: Сб июн 28, 2014 23:39:08
НАПАЛМ
Похожий вопрос. Сделал отсылку по USART фразы "23С " (ATmega88PA) по нажатию на кнопку. Просто протестить работу. Без буфера, 1старт бит, 1стоп бит, делей около полсекунды для антидребезга; скорость 9600.
Столько ошибок - это нормально?

Re: UART постоянно шлет мусор в TXD
Добавлено: Вс июн 29, 2014 09:31:41
WandererSc
Не нормально. Ошибок не должно быть вообще.
Gurvinok писал(а):Единственное что я предполагаю это глюк МК
Очень маловероятно, но такое возможно.
Re: UART постоянно шлет мусор в TXD
Добавлено: Вс июн 29, 2014 09:32:43
Gurvinok
Ошибки в программе отпадают. До этого момента все работало как часы, а когда полез мусор начал из программы все удалять. Осталось только это:
Код: Выделить всё
#define F_CPU 3686400 // Частота кварца
#define DDR_OUT DDRA // Порт для дисплея
#define PORT_OUT PORTA // Порт для дисплея
#include <avr/io.h>
#include <avr/interrupt.h>
#include <mylib/lcd.h>
volatile char temp;
ISR(USART_RX_vect)
{
temp = UDR;
}
int main(void)
{
// USART Инициализация
// Параметры связи: 8 бит, 1 стоп-бит, Без проверки четности
// USART RXD: Включен
// USART TXD: Включен
// USART Режим: Асинхронный
// USART Битрейт: 19200
UCSRA = 0x00; // Флаги
UCSRB = 0x98; // Прерывания, разрешение приема/передачи
UCSRC = 0x86; // Формат посылки
UBRRH = 0x00; // Скорость
UBRRL = 0x0B; // передачи
sei();
lcd_init(0);
while(1)
{
lcd_clear();
lcd_putchar(temp);
}
}
Если замкнуть TXD и RXD начинается постоянная передача.
Re: UART постоянно шлет мусор в TXD
Добавлено: Вс июн 29, 2014 16:36:07
codenamehawk
WandererSc писал(а):Если замкнуть TXD и RXD начинается постоянная передача.
Откуда то передача идет? Видать наводки, попробуйте RXD через 10 ком на +5В подключить.
Если код передачи выкинули, то стоит запретить передачу.
Re: UART постоянно шлет мусор в TXD
Добавлено: Вс июн 29, 2014 16:49:59
codenamehawk
Gurvinok писал(а): while(1)
{
lcd_clear();
lcd_putchar(temp);
}
Такой код заставит дисплей сильно мерцать и прочитать принятый символ будет проблематично.
Re: UART постоянно шлет мусор в TXD
Добавлено: Вс июн 29, 2014 16:52:49
Gurvinok
Резистор на 4,7К я уже пробовал ставить. Не помогает. А передачу я запретить не могу, мне же данные передавать надо. Вся засада в том что кода на передачу вообще нет. Работает только прерывание по приходу данных в UDR. Если бы все было нормально, то на ЖК выводился бы один и тот же символ, а не... Прет какой-то мусор. Как будто из порта валят данные сгенерированные генератором случайных чисел.
При условии что передачи нет, символ будет всегда один и тот же. Поэтому мерцать ничего не будет. А вот если разные данные.
Re: UART постоянно шлет мусор в TXD
Добавлено: Вс июн 29, 2014 16:57:25
codenamehawk
Gurvinok писал(а):Вся засада в том что кода на передачу вообще нет.
Вот когда он будет, тогда и разрешите. Скорости совпадают? CKDIV8 ?
Re: UART постоянно шлет мусор в TXD
Добавлено: Вс июн 29, 2014 17:01:09
Gurvinok
В этом вся и беда. Я толкаю в UART команду для GSM модуля, а он у меня получает полный пакет хлама. У меня передача не останавливается вне зависимости есть код или его нет. Что толку искать проблему отключив источник ее возникновения. Это получится решить проблему устранив последствия, а вот в чем причина такого неадекватного поведения МК я не могу понять.
С настройками все нормально, так как до этого момента все было зер гуд.
Re: UART постоянно шлет мусор в TXD
Добавлено: Вс июн 29, 2014 17:06:39
codenamehawk
Gurvinok писал(а):У меня передача не останавливается вне зависимости есть код или его нет.
Я вам писал попробовать отключить передатчик, когда нет кода. Какой получился результат?
Покажите схему подключения.
Проц, при подключении к компу, работает?
Re: UART постоянно шлет мусор в TXD
Добавлено: Вс июн 29, 2014 17:23:23
Gurvinok
Если отключаю передатчик, то все затыкается.
Re: UART постоянно шлет мусор в TXD
Добавлено: Вс июн 29, 2014 17:53:51
codenamehawk
Если резисторы рассчитаны правильно то ...
Осталось малость, написать "правильный код" передатчика.
Re: UART постоянно шлет мусор в TXD
Добавлено: Вс июн 29, 2014 17:59:01
Gurvinok
А он у меня правильно написан. В куче хлама проскакивает нужная команда, а модуль шлет ERROR из-за мусора. Я еще раз говорю. В пятницу все работало как часы. Команды посылались в порт, а ответы по прерыванию записывались в кольцевой буфер. Вчера сел писать кусок кода для разбора SMS и началось. Ума не приложу где закавыка.
Re: UART постоянно шлет мусор в TXD
Добавлено: Вс июн 29, 2014 18:14:08
codenamehawk
codenamehawk писал(а):Ума не приложу где закавыка.
Я вам подскажу
99 % что ошибка в коде
1 % ошибка в схеме.
Возможно вы ошиблись при сборке схемы, не должно быть помех и при включенном передатчике при отсутствии кода , если программа не вылазит куда не надо.
Код покажите, желательно с проектом для протеуса вместе.
Re: UART постоянно шлет мусор в TXD
Добавлено: Вс июн 29, 2014 18:20:14
Gurvinok
Вот этот код раньше выводил на экран оператора к которому подключился модуль.
Код: Выделить всё
#define F_CPU 3686400 // Частота кварца
#define DDR_OUT DDRA // Порт для дисплея
#define PORT_OUT PORTA // Порт для дисплея
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <mylib/lcd.h> // Функции ЖК дисплея 16х2
#include <mylib/usart.h>
#include "cicle_buffer.h"
ISR(USART_RX_vect) // По приходу данных в UDR
{
char temp = UDR;
if(!(temp == 0x0A || temp == 0x0D)) InBuffer(temp);
}
int main(void)
{
uint8_t i, num;
char temp[128];
DDRC = 0xFF;
PORTC = 0x00;
// USART Инициализация
// Параметры связи: 8 бит, 1 стоп-бит, Без проверки четности
// USART RXD: Включен
// USART TXD: Включен
// USART Режим: Асинхронный
// USART Битрейт: 19200
UCSRA = 0x00; // Флаги
UCSRB = 0x98; // Прерывания, разрешение приема/передачи
UCSRC = 0x86; // Формат посылки
UBRRH = 0x00; // Скорость
UBRRL = 0x0B; // передачи
sei();
lcd_init(0);
USART_STR("AT");
USART_END();
_delay_ms(100);
USART_STR("ATE0");
USART_END();
_delay_ms(100);
ClearBuffer();
while(1)
{
USART_STR("AT+COPS?");
USART_END();
_delay_ms(200);
num = IndexNumber();
if(num)
{
OutBufferStr(temp,num);
lcd_clear();
i=0;
while(num>i)
{
if(i==20) lcd_xy(0,1);
if(i==40) lcd_xy(0,2);
if(i==60) lcd_xy(0,3);
lcd_putchar(temp[i]);
i++;
}
}
}
}
Это код кольцевого буфера. С ним я еще никогда не работал, но вроде с первого раза все пошло.
Код: Выделить всё
#define BUFFER_SIZE 128 // Размер буфера обязательно равен степени двойки!
#define BUFFER_MASK (BUFFER_SIZE-1)
uint8_t IndexIN, IndexOUT;
char buffer[BUFFER_SIZE];
// Функция очистки буфера
void ClearBuffer(void)
{
cli();
IndexIN = 0;
IndexOUT = 0;
sei();
}
// Функция возвращает количество непрочитанных байт в буфере
uint8_t IndexNumber(void)
{
if (IndexIN >= IndexOUT)
{
return (IndexIN - IndexOUT);
}
else
{
return ((BUFFER_SIZE - IndexOUT) + IndexIN);
}
}
// Функция загрузки байта данных в буфер
void InBuffer(char value)
{
IndexIN++;
IndexIN &= BUFFER_MASK;
buffer[IndexIN] = value;
}
// Функция выгрузки строки данных из буфера
void OutBufferStr(char*str, uint8_t lenght)
{
for(uint8_t i=0; i<lenght; i++)
{
IndexOUT++;
IndexOUT &= BUFFER_MASK;
*str = buffer[IndexOUT];
str++;
}
}
Re: UART постоянно шлет мусор в TXD
Добавлено: Вс июн 29, 2014 18:31:48
codenamehawk
Объясню попроще, создаете проект в протеусе и смотрите где затык.
Что за компилятор, что за mylib/usart.h
Re: UART постоянно шлет мусор в TXD
Добавлено: Вс июн 29, 2014 19:29:10
Gurvinok
AtmelStulio 6.2
Код: Выделить всё
void USART_TXD( unsigned char data ) // Передача байта
{
while ( !( UCSRA & (1 << UDRE)) ) // Ждем пока не отправятся предыдущие данные
;
UDR = data; // Отпраляем текущие данные
}
unsigned char USART_RXD( void ) // Чтение байта
{
while ( !(UCSRA & (1<<RXC)) ) // Ждем пока не вычитаем данные
;
return UDR; // Возврящаем данные
}
//Функция отправляет строку в USART
void USART_STR(const char * string )
{
uint8_t i=0;
while(string[i])
{
USART_TXD(string[i]);
i++;
}
}
void USART_END(void)
{
//USART_TXD('\r');
//USART_TXD('\r');
USART_TXD(0x0D);
}
А как я в протеусе ГСМ-модуль смоделирую?
Re: UART постоянно шлет мусор в TXD
Добавлено: Вс июн 29, 2014 19:45:27
codenamehawk
Gurvinok писал(а):А как я в протеусе ГСМ-модуль смоделирую?
Просто используя модуль Virtual Terminal
Запакуйте все ваши файлы (весь проект) и выложите, посмотрим.