Jump to content
Braimik

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

Recommended Posts

Всем добрый день, с толкнулся с такой проблемой , что при написании кода для 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; }
  }
}

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Литиевые батарейки Fanso для систем телеметрии и дистанционного контроля

Системы телеметрии находят все более широкое применение во многих отраслях на промышленных и коммунальных объектах. Требования, предъявляемые к условиям эксплуатации приборов телеметрии и, как следствие, источников питания для них, могут быть довольно жесткими. Fanso предоставляет широкую линейку продукции, рассчитанной на различные условия эксплуатации, что позволяет подобрать батарейку для каждого конкретного применения, в том числе и для устройств телеметрии.

Подробнее

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

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

Share this post


Link to post
Share on other sites
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")
}

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

Share this post


Link to post
Share on other sites
                     

Материалы вебинара STM32G0 – новый лидер бюджетных 32-битных микроконтроллеров от STMicroelectronics

На вебинаре были продемонстрированы современные методы тестирования производительности микроконтроллеров на примере самых бюджетных 32-битных семейств общего назначения STM32G0 и STM32F0, проведено их подробное сравнение. Мы подготовили для вас материалы. Вы можете посмотреть видеозапись вебинара, ознакомиться с ответами на вопросы, загрузить код для тестирования, прочитать статьи по теме

Подробнее...

[

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

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

Share this post


Link to post
Share on other sites

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

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

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

и т.д. :)

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

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();
}

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

Share this post


Link to post
Share on other sites

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

Edited by BerZerKku

Share this post


Link to post
Share on other sites

А что там можно увидеть нового ? Скорее всего обычное циклическое посимвольное сравнение. Лучше ничего и не придумаешь.

Share this post


Link to post
Share on other sites

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;
}

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

Edited by BerZerKku

Share this post


Link to post
Share on other sites

С промежуточными переменными погорячился . 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;
}

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

так лучше? :)

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; при первом же несовпадении. Тогда из цикла будешь вылетать быстрее.

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Similar Content

    • By Kirill Lubinets
      Где можно симулировать сеть Modbus? Предполагаю использовать Proteus.
      Все это необходимо чтобы научится в симуляции работать с Modbus
       

       
    • By IgnatiusF
      Не удается проинициализировать работу UART2 на скорость 19200 бод.
      Не вызывается прервание совсем, отсылаются постоянно нули на всех скоростях, если ставить System clock switch в 01 (HSE). При работе от RC генератора выдает уже просто не то, что нужно. 
      Кварц рабочий, и вообще все работает, при использовании библиотек HAL.
      SysTick выключил потому, что были подозрения на конлфикт приоритетов.
      Внизу представлена именно та часть кода программы, которая не работает, то есть сам UART.
      Проект скоро сдавать, а использовать готовую библиотеку HAL не хочется совсем, уже несколько дней парюсь и не могу найти проблему. Попробовал разобраться что пишет в регистры HAL, однако не смог т.к. не хватает знаний, значения регистров все такие же, кроме PLL (не используется) и RCC_CR1 (в HAL почему-то полностью равен 0). Проверял передачей данных по UART. Регистр BRR не удалось считать т.к. он только для записи. У меня записано так:
      USART1->BRR = 0x412;  //20MHz/16/19200 = 65,104.
      Где искать следует ошибку?
    • By Elementary
      Всем добрый день, кто может подсказать, пытаюсь моделировать схему, выдает ошибку Sumulation Failed due to fatal simulator error.
      Совсем уже не знаю что делать.


    • By IgnatiusF
      Появилась надобность в микроконтрллере STM32 для проектирования устройства. И вопрос вот в чем - в программировании этих стм-ов. Прочитал несколько статей по их программированию - что вообще для этого нужно. Выяснил, что в них (во всех?) есть вшитый bootloader, который может сам прошить МК.
      То есть для этого необходимо подключить какой-либо ...to UART преобразователь, а именно TX, RX, VCC и gnd к соответсвующим ногам микроконтроллера и все? Или надо еще куда-то подавать управляющий сигнал?
      Еще вопрос по поводу бутлоадера - если он занимает 8 КБ (или по разному?), то МК с 16 КБ памяти, по сути, будет иметь 8 КБ для программ?
      Datasheet я только начинаю читать и пока еще не нашел точной информации, так что за помощь буду очень признателен
    • Guest Proton
      By Guest Proton
      Здравствуйте.
      Имеется сигнальный трансформатор 1:1, которому нужно работать на пару сотнях кГц. Одна его обмотка идёт на линию, вторая служит для приёма и передачи сигнала, например с UART. Но как это реализовать? Выходной каскад, скорее всего, на биполярном транзисторе, входной - на ОУ, но имею малые представления о совмещении этого воедино.
      Прошу объяснить и направить на необходимую литературу.
      Спасибо.
×
×
  • Create New...