Перейти к содержанию

Uart В Proteus Не Работает


Braimik

Рекомендуемые сообщения

Всем добрый день, с толкнулся с такой проблемой , что при написании кода для UART в протеусе симуляция не работает, то есть терминал вылазит, символы печатаю в терминале все отображается, но Микроконтроллер не реагирует на них, пробовал разные коды , с разных сайтов , если открыть готовый проект в протеусе то все работает , создаю свой проект либо исправляю готовый , на нужный мне МК , он перестает , работать , вот один из примеров кода

/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.0 Evaluation
Automatic Program Generator
© Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
Project : RS485 Test
Version :
Date    : 15.10.2014
Author  : Brain
Company :
Comments:

Chip type			   : ATmega8515
Program type		    : Application
AVR Core Clock frequency: 8,000000 MHz
Memory model		    : Small
External RAM size	   : 0
Data Stack size		 : 128
*****************************************************/
#include <mega8515.h>
// Standard Input/Output functions
#include <stdio.h>
 char read;

// Declare your global variables here
void main(void)
{
DDRA=0xFF;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
EMCUCR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
// SPI initialization
// SPI disabled
SPCR=0x00;
while (1)
  {
  // Place your code here
	   read=getchar(); //
	   if( read == 'A') PORTA.0 = 1;
	   if( read == 'B') PORTA.0 = 0;
	   if( read == 'C') PORTA.1 = 1;
	   if( read == 'D') PORTA.1 = 0;
	   if( read == 'E'){ PORTA.1 = 0; PORTA.0 = 1; }
  }
}

Ссылка на комментарий
Поделиться на другие сайты

И не будет работать! У Вас неверный подход к решению задачи. Чуть позже скину рабочий пример .

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Проверьте тактовую в протеусе. И 8МГц дают ошибку (не помню какую).

Самое , что странное, в рабочем коде исправляю команду , либо пишу все тоже самое под МК другой и все не работает, в основном на 16МГц пишу

Ссылка на комментарий
Поделиться на другие сайты

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

void clear_buffer_rx()
{
char x_=0;
	 for(x_=0; x_<16; x_++) rx_buffer[x_]=0;
		 rx_counter=0;	
		 rx_wr_index=0;
}
void AT_cmd()
{
error=0;

	 for (x=6; x<9; x++) if(rx_buffer[x]<48 || rx_buffer[x]>57)error=1;

	 if(error==0 && rx_buffer[0]=='A' && rx_buffer[1]=='T' && rx_buffer[2]=='+' && rx_buffer[3]=='P' && rx_buffer[4]=='R' && rx_buffer[5]=='G')
	 {
	 #asm("cli")
	 eep_data_buff[0] = rx_buffer[6]-48;
	 eep_data_buff[1] = rx_buffer[7]-48;
	 if(eep_data_buff[0]==0)eep_data_buff[0]=1;
	 if(eep_data_buff[1]==0)eep_data_buff[1]=1;

	 eep_data_buff[2] = (rx_buffer[8]-48)*2;
	 if(eep_data_buff[2]==0)eep_data_buff[2]=20;
	 else if (eep_data_buff[2]!=0 && eep_data_buff[2]<5) eep_data_buff[2]=5;

	 for (x=0; x<9; x++) printf("%c" , rx_buffer[x]);
	 timer_eep=0;
	 #asm("sei")
	 printf("\r\n");
	 clear_buffer_rx();
	 x_=0;
	 }
	 else if (rx_buffer[0]=='A' && rx_buffer[1]=='T' && rx_buffer[2]=='+' && rx_buffer[3]=='S'&& rx_buffer[4]=='T'&& rx_buffer[5]=='E'&& rx_buffer[6]=='='&& rx_buffer[7]=='E')
	 {
	 start_process=1;
	 start=1;
		 printf("START=ON!");
	 printf("\r\n");
	 clear_buffer_rx();
	 menu=0;
	 x_=0;
	 }
	 else if (rx_buffer[0]=='A' && rx_buffer[1]=='T' && rx_buffer[2]=='+' && rx_buffer[3]=='S'&& rx_buffer[4]=='T'&& rx_buffer[5]=='E'&& rx_buffer[6]=='='&& rx_buffer[7]=='D')
	 {
	 start_process=0;
		 printf("START=OFF!");
	 printf("\r\n");
	 clear_buffer_rx();
	 menu=0;
	 x_=0;
	 }
	 else if (rx_buffer[0]=='A' && rx_buffer[1]=='T' && rx_buffer[2]=='+' && rx_buffer[3]=='D'&& rx_buffer[4]=='T'&& rx_buffer[5]=='A'&& rx_buffer[6]=='?')
	 {
	 printf("Setting data:");
	 for (x=0; x<4; x++) printf("%d" , eep_data[x]);
	 printf("\r\n");
	 clear_buffer_rx();
	 x_=0;
	 }
	 else if (rx_buffer[0]=='A' && rx_buffer[1]=='T' && rx_buffer[2]=='+' && rx_buffer[3]=='R'&& rx_buffer[4]=='E'&& rx_buffer[5]=='V'&& rx_buffer[6]=='?')
	 {
	 printf("##########################\r\n");
	 printf("LED Progect 11.01.2015\r\n");
	 printf("7 SEG LED 4DIG\r\n");
	 printf("Autor: Ugrimov Artem Aleksandrovich\r\n");
	 printf("Program V1.0.0\r\n");
	 printf("Automatic system for press control\r\n");
	 printf("##########################\r\n");
	 clear_buffer_rx();
	 x_=0;
	 }
	 else if (rx_buffer[0]=='A' && rx_buffer[1]=='T' && rx_buffer[2]=='+' && rx_buffer[3]=='S'&& rx_buffer[4]=='T'&& rx_buffer[5]=='E'&& rx_buffer[6]=='?')
	 {
	 if(start_process)
	 {
		 printf("START=ON!");
		 printf("\r\n");
	 }
	 else
	 {
		 printf("START=OFF!");
		 printf("\r\n");
	 }

	 if(OUT_LEFT)
	 {
		 printf("OUT_LEFT=ON!");
		 printf("\r\n");
	 }
	 else
	 {
		 printf("OUT_LEFT=OFF!");
		 printf("\r\n");
	 }
	 if(OUT_RIGHT)
	 {
		 printf("OUT_RIGHT=ON!");
		 printf("\r\n");
	 }
	 else
	 {
		 printf("OUT_RIGHT=OFF!");
		 printf("\r\n");
	 }
	 if(RELAY_MOTOR)
	 {
		 printf("REL_MOTOR=ON!");
		 printf("\r\n");
	 }
	 else
	 {
		 printf("REL_MOTOR=OFF!");
		 printf("\r\n");
	 }
	 if(SENS_1==0)
	 {
		 printf("SENS_1=ON!");
		 printf("\r\n");
	 }
	 else
	 {
		 printf("SENS_1=OFF!");
		 printf("\r\n");
	 }
	 if(SENS_2==0)
	 {
		 printf("SENS_2=ON!");
		 printf("\r\n");
	 }
	 else
	 {
		 printf("SENS_2=OFF!");
		 printf("\r\n");
	 }
	 clear_buffer_rx();
	 x_=0;
	 }
	 else if(rx_buffer[0]=='A' && rx_buffer[1]=='T' && rx_buffer[2]==0 && x_)
	 {
	 printf("OK!\r\n");
	 clear_buffer_rx();
	 x_=0;
	 }
	 else
	 {
	 for(x=0;x<8;x++)
	 {
		 if(rx_buffer[x]>0)
		 {
			 delay_ms(300);
			 x=9;
			 x_++;
		 }

	 }
	 if(x_==2)
	 {
		 for(x=0;x<8;x++)
		 {
			 if(rx_buffer[x]>0)
			 {
				 printf("ERROR!\r\n");
				 for (x=0; x<9; x++) printf("%c" , rx_buffer[x]);
				 clear_buffer_rx();
				 x=9;
				 x_=0;
			 }
		 }
	 }
	 }
	 #asm("sei")
}

вот вырезки из проекта , который отлично работает.

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

[

вот вырезки из проекта , который отлично работает.

несовсем понял смысл кода, мне надо как на порты пришла буква он либо"1" либо "0"

Ссылка на комментарий
Поделиться на другие сайты

мне надо как на порты пришла буква он либо"1" либо "0"

ну так напиши свои обработчики , делов то?

напиши if(rx_buffer[0]=='A') PORTA|=0x01; ......
......................

и т.д. :)

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

Матерьбожья!!! Да с этим кодом ТС голову поломает.

Ещё раз - выберите в даташите нормальную тактовую частоту мк в разделе UART и будет вам счастие. Не забудьте такую же установить в протеусе.

Я не раздаю удочки. Я продаю рыбу.

Ссылка на комментарий
Поделиться на другие сайты

Матерьбожья!!! Да с этим кодом ТС голову поломает.

Что в нем сложного то?

Видно как проверяются данные на валидность , и потом обрабатываются АТ команды в зависимости от типа запроса :)

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

Решил немного мозг по напрягать , и написал функцию , которая сравнивает два массива символов (фактически строку) и возвращает значение:

1 - если строки одинаковы.

0 - если разные.

вот так вызывается функция :

if(string_cmp(rx_buffer, "AT+REV?"))
{
printf("REV1.0.0\n\r");
clear_buffer_rx();
}
else
{
printf("error command!");
clear_buffer_rx();
}

Если кому интересно - выложу саму функцию сюда :)

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

А чем вас стандартная функция strcmp не устроила? И да, очень интересно взглянуть на ваш вариант.

Изменено пользователем BerZerKku
Ссылка на комментарий
Поделиться на другие сайты

BerZerKku, просто захотелось свою функцию сделать :)

Вот:

char string_cmp(char *str1,char *str2)
{
unsigned char  x=0, error=1;
char *txt1, *txt2;
txt1 = str1+0;
txt2 = str2+0;
while(txt1[x]!=0 || txt2[x]!=0 && (error!=0))
{
if(txt1[x] != txt2[x])
{
error=0;
}
x++;
}
return error;
}

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

Пусть и не с первой попытки, но рабочий код появился. Но, если честно, он ужасен )

Это Вы с кем общаетесь? :)

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

1) я не ищу решения , так как у меня нет трудностей и соответственно, зачем меня поздравлять? Или с чем? :)

2) и первый кусок , и второй - рабочие.

3) чем код ужасен?

Вполне обычный и понятный код . Проверяем пришедшие символы , если совпадают - выполняем команду и очищаем буфер .

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

Странно, мне показалось что-ли, что сначала вами был выложен код с некой переменной "z" который работал лишь частично?

Что в не так? Отвечаю:

Во-первых, появились некие промежуточные переменные txt1 и txt2. Зачем ?! Проще, да и правильнее, передать в функцию указатель на константные данные.

Во-вторых, переменная с неподходящим именем error, которая сравнивается в каждом цикле, хотя было достаточно использовать break или return ?

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

Да и "понятный код" - это только для вас, автора данного кода. Лично я далеко не сразу понял, что за конструкция у вас в проверке цикла и почему она вообще работает.

Изменено пользователем BerZerKku
Ссылка на комментарий
Поделиться на другие сайты

С промежуточными переменными погорячился . error возвращает значение .

Да писал еще немного бухим , так что можно смягчить приговор )))

так лучше? :)

char string_cmp(char *str1,char *str2)
{
unsigned char  x=0, error=1;
str1+=0;
str2+=0;
while(str1[x]!=0 || str2[x]!=0 && (error!=0))
{
if(str1[x] != str2[x])
{
error=0;
}
x++;
}
return error;
}

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

Да это и не приговор был. А попытка донести, что не стоит изобретать велосипед. Одно из достоинств языка С/С++ это возможность использовать чужой код. Вы сами написали простейшую функцию, причем она заработала далеко не сразу и было потрачено N-ое количество времени. А результат думаю в разы медленнее библиотечного.

Ссылка на комментарий
Поделиться на другие сайты

Чушь ... Написал я её за 5 минут. И заработала она сразу )))

Работает нормально . Не знаю быстрее или медленнее ) это в данном случае не важно.

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

так лучше? :)

char string_cmp(char *str1,char *str2)
{
unsigned char x=0, error=1;
str1+=0;
str2+=0;
while(str1[x]!=0 || str2[x]!=0 && (error!=0))
{
if(str1[x] != str2[x])
{
error=0;
}
x++;
}
return error;
}

У тебя проход по символам будет всегда полным, невзирая даже на неравенство самых первых символов. А это может затянуться на долго...

Сделай return 0; при первом же несовпадении. Тогда из цикла будешь вылетать быстрее.

Ссылка на комментарий
Поделиться на другие сайты

Ну да, логично ;)

Это подправлю.

одна голова хорошо , а две еще лучше :)

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

одна голова хорошо , а две еще лучше :)

А с третей змей горынычем станешь=)) а вот такой вопрос в конечно итоге мне надо , PORTA PORTC чтобы принимали символы(A, G, C и т.д.) А Вот порт B хотелось бы со сдвигом 10010101 и т.д. как это организовать ? лучше будет как мне кажется через прерывание

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...