UART постоянно шлет мусор в TXD

Обсуждаем контроллеры компании Atmel.
Ответить
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 198
Зарегистрирован: Вт ноя 07, 2006 00:09:58
Откуда: Москва

Сообщение Gurvinok »

Одну проблему решить не успел как свалилась другая. Может у кого было такое. Короче, после инициализации порта он постоянно шлет мусор на выход в TXD. Раньше такого не было. Единственное что я предполагаю это глюк МК. Он у меня на стенде для испытаний и я его раз 300 перезаливал. Может из-за этого быть?
Я не волшебник, я только лечусь
Контактная информация:
Реклама
Опытный кот
Аватара пользователя
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США

Сообщение Pink-Pank »

Наводка?
Fucking static initialization order fiasco
Контактная информация:
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

Вряд ли из-за многократных перепрошиваний. Скорее что-то изменили в программе.
Ставим плюсы: )
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1315
Зарегистрирован: Пт ноя 27, 2009 19:47:13
Откуда: Казань

Сообщение НАПАЛМ »

Похожий вопрос. Сделал отсылку по USART фразы "23С  " (ATmega88PA) по нажатию на кнопку. Просто протестить работу. Без буфера, 1старт бит, 1стоп бит, делей около полсекунды для антидребезга; скорость 9600.
Столько ошибок - это нормально?
Изображение
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 4077
Зарегистрирован: Вс мар 22, 2009 17:31:41

Сообщение WandererSc »

Не нормально. Ошибок не должно быть вообще.
Gurvinok писал(а):Единственное что я предполагаю это глюк МК
Очень маловероятно, но такое возможно.
Раз reset, два reset - полyчи на диске bad !
Тpанзистоp p-n-p. Plug-n-Play ?
У кого что сбоит, тот о том и говорит.
Реклама
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 198
Зарегистрирован: Вт ноя 07, 2006 00:09:58
Откуда: Москва

Сообщение 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 начинается постоянная передача.
Я не волшебник, я только лечусь
Контактная информация:
Реклама
Вымогатель припоя
Сообщения: 547
Зарегистрирован: Вт фев 09, 2010 17:52:26

Сообщение codenamehawk »

WandererSc писал(а):Если замкнуть TXD и RXD начинается постоянная передача.
Откуда то передача идет? Видать наводки, попробуйте RXD через 10 ком на +5В подключить.
Если код передачи выкинули, то стоит запретить передачу.
Вымогатель припоя
Сообщения: 547
Зарегистрирован: Вт фев 09, 2010 17:52:26

Сообщение codenamehawk »

Gurvinok писал(а): while(1)
{
lcd_clear();
lcd_putchar(temp);
}
Такой код заставит дисплей сильно мерцать и прочитать принятый символ будет проблематично.
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 198
Зарегистрирован: Вт ноя 07, 2006 00:09:58
Откуда: Москва

Сообщение Gurvinok »

Резистор на 4,7К я уже пробовал ставить. Не помогает. А передачу я запретить не могу, мне же данные передавать надо. Вся засада в том что кода на передачу вообще нет. Работает только прерывание по приходу данных в UDR. Если бы все было нормально, то на ЖК выводился бы один и тот же символ, а не... Прет какой-то мусор. Как будто из порта валят данные сгенерированные генератором случайных чисел.

При условии что передачи нет, символ будет всегда один и тот же. Поэтому мерцать ничего не будет. А вот если разные данные.
Я не волшебник, я только лечусь
Контактная информация:
Вымогатель припоя
Сообщения: 547
Зарегистрирован: Вт фев 09, 2010 17:52:26

Сообщение codenamehawk »

Gurvinok писал(а):Вся засада в том что кода на передачу вообще нет.
Вот когда он будет, тогда и разрешите. Скорости совпадают? CKDIV8 ?
Последний раз редактировалось codenamehawk Вс июн 29, 2014 17:01:17, всего редактировалось 1 раз.
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 198
Зарегистрирован: Вт ноя 07, 2006 00:09:58
Откуда: Москва

Сообщение Gurvinok »

В этом вся и беда. Я толкаю в UART команду для GSM модуля, а он у меня получает полный пакет хлама. У меня передача не останавливается вне зависимости есть код или его нет. Что толку искать проблему отключив источник ее возникновения. Это получится решить проблему устранив последствия, а вот в чем причина такого неадекватного поведения МК я не могу понять.
С настройками все нормально, так как до этого момента все было зер гуд.
Я не волшебник, я только лечусь
Контактная информация:
Вымогатель припоя
Сообщения: 547
Зарегистрирован: Вт фев 09, 2010 17:52:26

Сообщение codenamehawk »

Gurvinok писал(а):У меня передача не останавливается вне зависимости есть код или его нет.
Я вам писал попробовать отключить передатчик, когда нет кода. Какой получился результат?
Покажите схему подключения.

Проц, при подключении к компу, работает?
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 198
Зарегистрирован: Вт ноя 07, 2006 00:09:58
Откуда: Москва

Сообщение Gurvinok »

Если отключаю передатчик, то все затыкается.
Вложения
shema.gif
(10.73 КБ) 499 скачиваний
Я не волшебник, я только лечусь
Контактная информация:
Вымогатель припоя
Сообщения: 547
Зарегистрирован: Вт фев 09, 2010 17:52:26

Сообщение codenamehawk »

Если резисторы рассчитаны правильно то ...
Осталось малость, написать "правильный код" передатчика.
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 198
Зарегистрирован: Вт ноя 07, 2006 00:09:58
Откуда: Москва

Сообщение Gurvinok »

А он у меня правильно написан. В куче хлама проскакивает нужная команда, а модуль шлет ERROR из-за мусора. Я еще раз говорю. В пятницу все работало как часы. Команды посылались в порт, а ответы по прерыванию записывались в кольцевой буфер. Вчера сел писать кусок кода для разбора SMS и началось. Ума не приложу где закавыка.
Я не волшебник, я только лечусь
Контактная информация:
Вымогатель припоя
Сообщения: 547
Зарегистрирован: Вт фев 09, 2010 17:52:26

Сообщение codenamehawk »

codenamehawk писал(а):Ума не приложу где закавыка.
Я вам подскажу
99 % что ошибка в коде
1 % ошибка в схеме.

Возможно вы ошиблись при сборке схемы, не должно быть помех и при включенном передатчике при отсутствии кода , если программа не вылазит куда не надо.

Код покажите, желательно с проектом для протеуса вместе.
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 198
Зарегистрирован: Вт ноя 07, 2006 00:09:58
Откуда: Москва

Сообщение 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++;
	}
}
Я не волшебник, я только лечусь
Контактная информация:
Вымогатель припоя
Сообщения: 547
Зарегистрирован: Вт фев 09, 2010 17:52:26

Сообщение codenamehawk »

Объясню попроще, создаете проект в протеусе и смотрите где затык.
Что за компилятор, что за mylib/usart.h
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 198
Зарегистрирован: Вт ноя 07, 2006 00:09:58
Откуда: Москва

Сообщение 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);
	}
А как я в протеусе ГСМ-модуль смоделирую?
Я не волшебник, я только лечусь
Контактная информация:
Вымогатель припоя
Сообщения: 547
Зарегистрирован: Вт фев 09, 2010 17:52:26

Сообщение codenamehawk »

Gurvinok писал(а):А как я в протеусе ГСМ-модуль смоделирую?
Просто используя модуль Virtual Terminal
Запакуйте все ваши файлы (весь проект) и выложите, посмотрим.
Ответить

Вернуться в «AVR»