Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Технологии > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail


Ответ
 
Опции темы
Старый 20.11.2019, 15:53   #1
texac123
Новичок
Джуниор
 
Регистрация: 19.01.2018
Сообщений: 3
По умолчанию вывод массива чисел

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

Есть фрагмент исходника , код работает, должен выводить массив 16 чисел который ввожу я, а он выводит совсем не то число..
Я приложил скрины, слева в Virtual terminal массив чисел которые ввожу я, передаю по COM порту, а справа на LCD должно быть максимальное число 208. А появляется число 56... Где я допустил ошибку. Исходник ниже
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[i] = 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[i]%2 == 0)
{
if (MAXnum<=mas1[i])
{
MAXnum = mas1[i];
}
}
}
//вывод массива на ЖКИ
for(i=0;i<16;i++)
{
itoa(mas1[i],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);
}
}}
texac123 вне форума Ответить с цитированием
Старый 20.11.2019, 15:56   #2
texac123
Новичок
Джуниор
 
Регистрация: 19.01.2018
Сообщений: 3
По умолчанию скрины

скрины
Изображения
Тип файла: jpg скрин 1.jpg (73.5 Кб, 19 просмотров)
Тип файла: jpg 6.jpg (25.8 Кб, 17 просмотров)
texac123 вне форума Ответить с цитированием
Старый 20.11.2019, 21:54   #3
digitalis
Участник клуба
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 1,999
По умолчанию

Все вооружились лупами и бросились рассматривать, что там на экранчике накорябал Протеус.
Разбей задачу на 2 части: поиск четного максимума и передача заданного числа.
Навскидку: не вижу начального присваивания i = 0 и Maxnum.
Если не заниматься ###ом в Протеусе, с помощью отладчика в Студии ошибка находится минуты за 3.
------------------
И что-то я не въеду: в одном модуле - и передача, и прием по UART? Я так думал, на компе должна крутиться программа генерации рандома и передачи, на МК - приема и отображения. Это 2 разных проги в двух разных средах программирования. Или это какой-то виртуальный терминал = комп?
А судя по тому, что видим на правом экранчике - 56 это и есть нормальный максимум. Только чисел всего 13 - это, похоже, следствие того, что (см.выше) .
Проще всего забить массив 16 известными значениями и прокрутить прогу от //обработка массива. Насчет виртуального терминала ничего сказать не могу, никогда такой хней не пользовался.
------------------------------
В поиске максимума ошибок нет, кроме (см. выше), да тут и ошибиться невозможно. Фигурных скобок {} лишняя куча, но это не ошибка.
Код:
for(i=0;i<16;i++)
    if (mas1[i]%2 == 0)
       if (MAXnum<=mas1[i])  MAXnum = mas1[i];
Или это у CV так принято ?

Царица Екатерина в слове из 3 букв делала 4 ошибки: "исчо" Но ты уже близко: новечек. Ну разве что забугорный иностранец? В связи с веяниями на форуме - местоположение участника - top secret

Последний раз редактировалось digitalis; 20.11.2019 в 22:24.
digitalis вне форума Ответить с цитированием
Старый 20.11.2019, 23:49   #4
Desc
Форумчанин
 
Аватар для Desc
 
Регистрация: 21.11.2007
Сообщений: 315
По умолчанию

Цитата:
Сообщение от digitalis Посмотреть сообщение
Или это какой-то виртуальный терминал = комп?
В "Протеусе" есть виртуальный терминал для тестирования проектов. Удобная фишка.
Desc вне форума Ответить с цитированием
Старый 21.11.2019, 09:23   #5
texac123
Новичок
Джуниор
 
Регистрация: 19.01.2018
Сообщений: 3
По умолчанию

На компьютере прога для передачи информации по COM порту, в нее записываю 16 чисел , и отправляю их по COM порту на Virtual Terminal, там они и отображаются, дело в том что код готовый был из метод, по сути должен работать...
Если не трудно можешь указать поточнее где именно ошибка у меня? в С новечек...несколько дней уже пытаюсь с этим кодом что то сделать.
Спасибо !
texac123 вне форума Ответить с цитированием
Старый 21.11.2019, 15:21   #6
digitalis
Участник клуба
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 1,999
По умолчанию

Насчет виртуального терминала ничего не могу сказать, не в курсе, мне Шпротес был без надобности - все легко отлаживалось в Студии и проверялось на железе.
Поэтому почему записалось 13 чисел, а не 16 - х.з. Само определение максимума правильное - 56 он и есть.
На этом форуме не приветствуются ссылки на другие, даже не конкурирующие, поэтому сделаем так: я знаю место, где мучаются дурью тусуются любители Шпротеуса, напиши на digitun@tut.by. Они смогут объяснить, наверно, каким боком эта хрень слилась с виртуального терминала не по задумке. А в остальном прога сработала правильно.
PS А слово новичок пишется вот так.

Последний раз редактировалось digitalis; 21.11.2019 в 15:27.
digitalis вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Дано 9 массивов в каждом 5 чисел. Вывести комбинации вариантов из 5-и чисел таким образом, чтобы все числа одного массива повторились с числами другого массива 1 раз. i_lisenok Помощь студентам 7 26.11.2018 15:06
Дан массив,состоящий N (N>1) вещественных чисел. Найти среднеарифметическое значение чисел массива. nikola_orsha Паскаль, Turbo Pascal, PascalABC.NET 2 11.10.2016 14:05
Можно ли среди чисел массива найти две разных пары чисел, суммы которых одинаковы? (Pascal) Soms Помощь студентам 3 16.03.2016 02:34
инициализация массива, вывод массива и обработка массива должны быть реализованы с помоshью функций airesjke Помощь студентам 0 02.03.2012 16:14
Вывод в фаил массива из 20 случайных чисел от -10 до 10 в C++ xnise Помощь студентам 3 19.02.2010 23:02