UART постоянно шлет мусор в TXD
Одну проблему решить не успел как свалилась другая. Может у кого было такое. Короче, после инициализации порта он постоянно шлет мусор на выход в TXD. Раньше такого не было. Единственное что я предполагаю это глюк МК. Он у меня на стенде для испытаний и я его раз 300 перезаливал. Может из-за этого быть?
Я не волшебник, я только лечусь
- Реклама
Наводка?
Fucking static initialization order fiasco
Вряд ли из-за многократных перепрошиваний. Скорее что-то изменили в программе.
Ставим плюсы: )
Похожий вопрос. Сделал отсылку по USART фразы "23С " (ATmega88PA) по нажатию на кнопку. Просто протестить работу. Без буфера, 1старт бит, 1стоп бит, делей около полсекунды для антидребезга; скорость 9600.
Столько ошибок - это нормально?

Столько ошибок - это нормально?

- Сообщения: 4077
- Зарегистрирован: Вс мар 22, 2009 17:31:41
Не нормально. Ошибок не должно быть вообще.
Очень маловероятно, но такое возможно.Gurvinok писал(а):Единственное что я предполагаю это глюк МК
Раз reset, два reset - полyчи на диске bad !
Тpанзистоp p-n-p. Plug-n-Play ?
У кого что сбоит, тот о том и говорит.
Тpанзистоp p-n-p. Plug-n-Play ?
У кого что сбоит, тот о том и говорит.
- Реклама
Ошибки в программе отпадают. До этого момента все работало как часы, а когда полез мусор начал из программы все удалять. Осталось только это:
Если замкнуть TXD и RXD начинается постоянная передача.
Код: Выделить всё
#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);
}
}
Я не волшебник, я только лечусь
- Сообщения: 547
- Зарегистрирован: Вт фев 09, 2010 17:52:26
Откуда то передача идет? Видать наводки, попробуйте RXD через 10 ком на +5В подключить.WandererSc писал(а):Если замкнуть TXD и RXD начинается постоянная передача.
Если код передачи выкинули, то стоит запретить передачу.
- Сообщения: 547
- Зарегистрирован: Вт фев 09, 2010 17:52:26
Такой код заставит дисплей сильно мерцать и прочитать принятый символ будет проблематично.Gurvinok писал(а): while(1)
{
lcd_clear();
lcd_putchar(temp);
}
Резистор на 4,7К я уже пробовал ставить. Не помогает. А передачу я запретить не могу, мне же данные передавать надо. Вся засада в том что кода на передачу вообще нет. Работает только прерывание по приходу данных в UDR. Если бы все было нормально, то на ЖК выводился бы один и тот же символ, а не... Прет какой-то мусор. Как будто из порта валят данные сгенерированные генератором случайных чисел.
При условии что передачи нет, символ будет всегда один и тот же. Поэтому мерцать ничего не будет. А вот если разные данные.
При условии что передачи нет, символ будет всегда один и тот же. Поэтому мерцать ничего не будет. А вот если разные данные.
Я не волшебник, я только лечусь
- Сообщения: 547
- Зарегистрирован: Вт фев 09, 2010 17:52:26
Вот когда он будет, тогда и разрешите. Скорости совпадают? CKDIV8 ?Gurvinok писал(а):Вся засада в том что кода на передачу вообще нет.
Последний раз редактировалось codenamehawk Вс июн 29, 2014 17:01:17, всего редактировалось 1 раз.
В этом вся и беда. Я толкаю в UART команду для GSM модуля, а он у меня получает полный пакет хлама. У меня передача не останавливается вне зависимости есть код или его нет. Что толку искать проблему отключив источник ее возникновения. Это получится решить проблему устранив последствия, а вот в чем причина такого неадекватного поведения МК я не могу понять.
С настройками все нормально, так как до этого момента все было зер гуд.
С настройками все нормально, так как до этого момента все было зер гуд.
Я не волшебник, я только лечусь
- Сообщения: 547
- Зарегистрирован: Вт фев 09, 2010 17:52:26
Я вам писал попробовать отключить передатчик, когда нет кода. Какой получился результат?Gurvinok писал(а):У меня передача не останавливается вне зависимости есть код или его нет.
Покажите схему подключения.
Проц, при подключении к компу, работает?
Если отключаю передатчик, то все затыкается.
- Вложения
-
- shema.gif
- (10.73 КБ) 499 скачиваний
Я не волшебник, я только лечусь
- Сообщения: 547
- Зарегистрирован: Вт фев 09, 2010 17:52:26
Если резисторы рассчитаны правильно то ...
Осталось малость, написать "правильный код" передатчика.
Осталось малость, написать "правильный код" передатчика.
А он у меня правильно написан. В куче хлама проскакивает нужная команда, а модуль шлет ERROR из-за мусора. Я еще раз говорю. В пятницу все работало как часы. Команды посылались в порт, а ответы по прерыванию записывались в кольцевой буфер. Вчера сел писать кусок кода для разбора SMS и началось. Ума не приложу где закавыка.
Я не волшебник, я только лечусь
- Сообщения: 547
- Зарегистрирован: Вт фев 09, 2010 17:52:26
Я вам подскажуcodenamehawk писал(а):Ума не приложу где закавыка.
99 % что ошибка в коде
1 % ошибка в схеме.
Возможно вы ошиблись при сборке схемы, не должно быть помех и при включенном передатчике при отсутствии кода , если программа не вылазит куда не надо.
Код покажите, желательно с проектом для протеуса вместе.
Вот этот код раньше выводил на экран оператора к которому подключился модуль.
Это код кольцевого буфера. С ним я еще никогда не работал, но вроде с первого раза все пошло.
Код: Выделить всё
#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++;
}
}
Я не волшебник, я только лечусь
- Сообщения: 547
- Зарегистрирован: Вт фев 09, 2010 17:52:26
Объясню попроще, создаете проект в протеусе и смотрите где затык.
Что за компилятор, что за mylib/usart.h
Что за компилятор, что за mylib/usart.h
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);
}
Я не волшебник, я только лечусь
- Сообщения: 547
- Зарегистрирован: Вт фев 09, 2010 17:52:26
Просто используя модуль Virtual TerminalGurvinok писал(а):А как я в протеусе ГСМ-модуль смоделирую?
Запакуйте все ваши файлы (весь проект) и выложите, посмотрим.


