atmega8535 в Proteus не верное значение на LCD

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Сообщения: 3
Зарегистрирован: Пт ноя 22, 2019 07:01:10

Сообщение texac123 »

Привет всем , в программировании новечек, есть задание:
Реализовать МПС на базе МК фирмы Atmel серии AVR, которая принимает с
компьютера по UART 16 случайных чисел (байт). Произвести обработку принятых чисел
на Микро Контроллере согласно заданию. Исходник компилировал в CodevisionAWR. Язык программирования С.

Есть фрагмент исходника , код работает, должен выводить массив 16 чисел который ввожу я, а он выводит совсем не то число..
Я приложил скрин1, слева в Virtual terminal массив чисел которые ввожу , передаю по COM порту, а справа на LCD должно быть максимальное число 208. А появляется число 56... То есть терминал информацию получает , а LCD почему то нет.Подскажите где я допустил ошибку.Ниже приложил скриншоты и исходник.Исходник из методички , по идее должен работать
Hel[P!!! Спасибо !


// инициализация внешних библиотек
#include <mega8535.h>
#include "lcd.h"
#include "delay.h"
#include "stdlib.h"
//Инициализация порта А для передачи данных в ЖКИ.
//Для просмотра номера порта, нужно обратиться к заголовочному //файлу mega8535.h, с
целью определения номера порта.
//PortA = 0x1b;
#asm
.equ __lcd_port=0x1b; //PORTA
#endasm
//объявление служебных переменных
//однобайтный буфер
volatile unsigned char usartRxBuf = 0;
//Определение констант для конфигурации UART
#define RXCIE 7
#define RXEN 4
#define TXEN 3
#define URSEL 7
#define UCSZ1 2
#define UCSZ0 1
unsigned char MAXnum,buff = 0;
unsigned char i,j,n = 0;
unsigned char mas1 [16];
char* str1;
//Процедуры для управления передачей через UART
//инициализация usart`a
void USART_Init(void)
{
UBRRH = 0;
//скорость обмена 9600 бод
UBRRL = 51;
//разр. прерыв при приеме, разр приема, разр передачи.
UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);
//размер слова 8 разрядов
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); }
#define UDRE 5
//отправка символа по usart`у
void USART_SendChar(unsigned char sym)
{
while(!(UCSRA & (1<<UDRE)));
UDR = sym;
}
//чтение буфера
unsigned char USART_GetChar(void)
{
unsigned char tmp;
unsigned char saveState = SREG;
#asm("cli");
tmp = usartRxBuf;
usartRxBuf = 0;
SREG = saveState;
return tmp;
}
//прерывание при приеме символа по usart в буфер
interrupt [USART_RXC] void usart_rxc_my(void)
{
usartRxBuf = UDR;
buff = usartRxBuf;
if(buff)
{
if(i<16)
{
mas1 = buff;
i++;
}
}
}
void main( void )
{
lcd_init(20); //инициализация ЖКИ
USART_Init(); //инициализация UART
lcd_clear(); //очистка ЖКИ
lcd_gotoxy(0,0); //переместить курсор на ЖКИ в позицию 0,0
#asm("sei"); //разрешение прерываний
while(1) //бесконечный цикл
{
if(i == 15)
{
//обработка массива
for(i=0;i<16;i++)
{
if (mas1%2 == 0)
{
if (MAXnum<=mas1)
{
MAXnum = mas1;
}
}
}
//вывод массива на ЖКИ
for(i=0;i<16;i++)
{
itoa(mas1,str1);
lcd_puts(str1);
j++;
if(j%4!=0)
{
lcd_gotoxy(j*5,n);
}
else
{
j = 0;
n++;
lcd_gotoxy(j*5,n);
}
}
delay_ms(10000);
//вывод результата на ЖКИ
lcd_clear();
lcd_gotoxy(0,0);
itoa(MAXnum,str1);
lcd_puts(str1);
}
}}
Вложения
скрин 1.png
(85.74 КБ) 261 скачивание
Реклама
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Отладка Вас спасёт.
Тем более, в Протеусе есть все необходимые для этого инструменты.
Хотите, чтобы этим занялись Мы ?
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

UBRRH = 0;
//скорость обмена 9600 бод
UBRRL = 51;
А в свойствах микроконтроллера модели протеуса столько же?
Docendo discimus
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 6322
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

to texac123 Эх, не в тот раздел ты обратился. Я же тебе советовал
https://radiokot.ru/forum/viewforum.php?f=2
может, и реакция была бы другой.
А слово "новичок" продолжаешь писать с ошибками. :))
Изображение
Реклама
Эиком - электронные компоненты и радиодетали
Модератор
Аватара пользователя
Сообщения: 19055
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Сообщение Starichok51 »

а что бы ты хотел от поколения ЕГЭ?
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Реклама
Родился
Сообщения: 3
Зарегистрирован: Пт ноя 22, 2019 07:01:10

Сообщение texac123 »

pyzhman, Да на МК все поставлено верно, я пробовал менять разные значения и в коде и на МК , в результате на табло то больше то меньше цифер. Еще вопрос, если массив из 16 чисел, а на табло только 13, код из методички , получается не верный?)
Реклама
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

texac123, вы объявили указатель char* str1; но не привязали его ни к чему.
К примеру так

Код: Выделить всё

str1 = &mas1[0];	// присваиваем указателю адрес самого первого элемента массива mas1
А так все правильно выводит

Код: Выделить всё

itoa(mas1[i],str1); // преобразует integer (целое) mas1[i] в символы в строке str1
lcd_puts(str1);		// вывод на дисплей

Допустим вы терминале нажали цифровую клавишу 1, HEX код этого символа 0х31 в десятичном представлении 49
lcd_puts(str1) у вас выведет 49
В чем проблема?
Родился
Сообщения: 3
Зарегистрирован: Пт ноя 22, 2019 07:01:10

Сообщение texac123 »

Хорошо, а если массив чисел конкретный : 85,199,140,135,172,203,157,83,199,208,100,180,122,253,104,195.
Как вывести из этого массива максимальное четное число 208?
Спасибо!
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

А разве этот код у вас не выводит

Код: Выделить всё

for(i=0;i<16;i++)
{
	if (mas1[i]%2 == 0)
	{
		if (MAXnum<=mas1[i])
		{
		MAXnum = mas1[i];
		}
	}
}
Ответить

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