Форум "РАДИОЛЮБИТЕЛЬ"

Добро пожаловать на наш форум
Текущее время: 18 ноя 2019, 21:28

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
 Заголовок сообщения: Файл из ПК в МК
СообщениеДобавлено: 25 фев 2015, 11:35 
Не в сети

Зарегистрирован: 30 май 2013, 08:05
Сообщений: 6
Очков репутации: 1

Добавить очки репутацииУменьшить очки репутации
Здравствуйте! Прошу подсказать, где прочитать о том, как вывести небольшой (до 1 Кб) файл с диска
через COM1 (USART) в микроконтроллер ATmega16. Спасибо!


Информация о сообщении Вынести предупреждение
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Файл из ПК в МК
СообщениеДобавлено: 26 фев 2015, 10:13 
Не в сети
Администратор
Аватара пользователя

Зарегистрирован: 26 окт 2009, 10:34
Сообщений: 1846
Откуда: Yerevan
Очков репутации: 139

Добавить очки репутацииУменьшить очки репутации
https://www.drive2.ru/c/922936/
http://www.getchip.net/posts/028-unipro ... -com-port/

_________________
Изображение


Информация о сообщении Вынести предупреждение
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Файл из ПК в МК
СообщениеДобавлено: 05 мар 2015, 07:34 
Не в сети

Зарегистрирован: 30 май 2013, 08:05
Сообщений: 6
Очков репутации: 1

Добавить очки репутацииУменьшить очки репутации
Прошу прощения, но вопрос я задал слишком общё. Сейчас конкретизирую.
Программатор аналогичен STK-200, язык Си. С помощью программы Hyper Terminal, встроенной в W-XP, пересылаю через UART в МК код нажатой клавиши. В МК этот код принимаю с помощью функции getchar() в переменную типа char и отображаю её значение светодиодами.
В Hyper Terminal есть опция «Отправить файл».
Вопрос: Какую функцию нужно использовать в МК, чтобы МК мог побайтно принять файл из ПК с возможностью обработки каждого байта требуемым образом, например, записи в память?
Спасибо!


Информация о сообщении Вынести предупреждение
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Файл из ПК в МК
СообщениеДобавлено: 05 мар 2015, 08:31 
Не в сети

Зарегистрирован: 05 окт 2013, 10:04
Сообщений: 259
Очков репутации: 22

Добавить очки репутацииУменьшить очки репутации
Ту же getchar() и складировать принимаемые данные в буфер. Ну а по окончании приема файла делайте с ним что заблагорассудится.


Информация о сообщении Вынести предупреждение
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Файл из ПК в МК
СообщениеДобавлено: 18 мар 2015, 13:32 
Не в сети

Зарегистрирован: 30 май 2013, 08:05
Сообщений: 6
Очков репутации: 1

Добавить очки репутацииУменьшить очки репутации
Вот что получается.
Текстовый файл для передачи из ПК в МК такой:
0 1 2 3 4 5 6 7 8 9 : ; < = > ? (без пробелов).
Ожидал, что на светодиодах будут отражаться числа от 30 до 3F, как это было при приёме кодов нажатых клавиш. Однако оказались совершенно другие числа (72, A3, 7A, 64 и т.д.). Понять логику этого ряда не смог.
Текст программы прилагаю.
При написании функций пользовался примером из книги В.С.Прокопенко «Программирование микроконтроллеров ATMEL на языке С», стр.252.
Попутный вопрос: При переписке с каким расширением можно прилагать файлы? .с и .txt были отвергнуты.
Спасибо!



/*********************************
Попытка прочитывания микроконтроллером дискового файла
через COM-порт.
Функции заимствованы из книги В.С.Прокопенко "Программирование микроконтроллеров ATMEL на языке C"

**********************************/

#define F_CPU 11059200UL // частота
#include <avr/io.h>
#include <stdlib,h>
#include <stdio.h>
#include <util/delay.h>
#include <string.h>
#include <avr/pgmspace.h>


void USART_INIT(unsigned int UBRR_baud) // функция инициализации UART
{
// Устанавливаем скорость передачи/приёма. Она записывается в два регистра:
// черырёхразрядный UBRRH и восьмиразрядный UBRRL. Для начала значение,
// хранящееся в UBRR_baund, сдвигаем вправо на 8 разрядов
UBRRH = (unsigned char)(UBRR_baud >> 8);
// Поскольку выполняется явное преобразование к восьмиразрядному числу,
// в UBRRL будет записано 8 младших разрядов, а все старшие разряды после восьмого будут отброшены
UBRRL = (unsigned char)UBRR_baud;

// Для обращения к регистру UCSRC необходимо записать 1 в разряд URSEL,
// и одновремённо с этим установить требуемые разряды в регистре UCSRC.

// Режим работы асинхронный: UMSEL=0;
// Отключен контроль по чётности: UPM1=0 и UPM0 = 0;
// Один стоп-бит: USBS= 0;
// Восемь бит данных: UCSZ1 = 1, UCSZ0=1, UCSZ2 (регистр UCSRB) =0;
// Асинхронный режим UCPOL=0;
UCSRC = (1 << URSEL) | (0 << UMSEL) | (0 << UPM1) | (0 << UPM0) | (0 << USBS) | (1 << UCSZ1) | (1 << UCSZ0) | (0 << UCPOL);
UCSRB &= ~(1 << 2); // Включаем приёмник и передатчик USART
UCSRB |= (1 << 4) | (1 << 3); // RXEN=1 и TXEN =1

// Разряды U2X=0 и MPCM=0, т.е., отключаем удвоение скорости и режим мультипроцессорного обмена
UCSRA &= ~(1 << 1) & ~(1 << 0);
}


static int uart_putchar(char simvol, FILE *stream) // Функция, которая будет вызываться при обращении потока на вывод
{
loop_until_bit_is_set (UCSRA, UDRE); // ожидаем появления 1 в разряде UDRE, что означает, что буфер пуст и готов к приёму.
UDR = simvol; // пересылаем через UART байт данных, содержащихся в переменной simvol
return 0;
}


static int uart_getchar(FILE *stream) // Функция, которая будет вызываться при обращении потока на ввод
{
loop_until_bit_is_set (UCSRA, RXC); // ожидаем появления 1 в разряде RXC (приём заершён)
return (UDR); // Фунция вернёт принятый символ
}


// Иниацилизация ввода-вывода
// Создаём поток mystdout_mystdin, назначив функцию
// uart_putchar для вывода, а Функцию uart_getchar - для ввода.
// Используем ввод и вывод, установив флаг _FDEV_SETUP_RW

static FILE mystdout_mystdin = FDEV_SETUP_STREAM(uart_putchar, uart_getchar, _FDEV_SETUP_RW);


int main(void) //начало основной программы
{
DDRC = 255;
char c; // Знак, считываемый из файла
int i = 0; // Текущая переменная
int n = 0; // Число знаков, считанных из файла
char buf[25]; // Буфер
USART_INIT(71); // 11059200/9600/16-1=71 // функция инициализации UART
// Настройка COM-порта: 9600 - 8 - нет - 1 - нет
stdin = stdout = &mystdout_mystdin; // Перенаправляем стандартные потоки на пользовательский


//while ((c=getchar()) !='\0') // Этот вариант тоже не прошёл

for (i=0; i<16; i++)
{
buf[i] = getchar();
i = i+1;
n=i;
}
PORTC = ~n;
_delay_ms(6000); // Чтобы успеть записать вручную код со светодиодов
PORTC = 255;
_delay_ms(1000);

for (i=0; i<(n); i++)
{
PORTC = ~buf[i];
_delay_ms(6000);
PORTC = 255;
_delay_ms(1000);
}

/*
while(1)
{
PORTC = ~(getchar()); // Код нажатой клавиши
}
*/
}


Информация о сообщении Вынести предупреждение
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Файл из ПК в МК
СообщениеДобавлено: 18 мар 2015, 20:24 
Не в сети

Зарегистрирован: 05 окт 2013, 10:04
Сообщений: 259
Очков репутации: 22

Добавить очки репутацииУменьшить очки репутации
Что-то я не понял:
1. Как на одном порту С вы выводите те же 72, А3 и т.д?
2.
Код:
static int uart_getchar(FILE *stream) // Функция, которая будет вызываться при обращении потока на ввод
{
loop_until_bit_is_set (UCSRA, RXC); // ожидаем появления 1 в разряде RXC (приём заершён)
return (UDR); // Фунция вернёт принятый символ
}

Возвращает 1 байт. А где же поток?
ps. В программе особо не разбирался.


Информация о сообщении Вынести предупреждение
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Файл из ПК в МК
СообщениеДобавлено: 19 мар 2015, 13:03 
Не в сети

Зарегистрирован: 30 май 2013, 08:05
Сообщений: 6
Очков репутации: 1

Добавить очки репутацииУменьшить очки репутации
Запомнил в буфер принятый поток, а потом выводил по одному байту в порт на светодиоды с задержкой в 7 секунд, чтобы успеть записать вручную принятые числа.
Если есть вопросы к функциям приёма и передачи, то мне сказать тут мало есть что - я их тупо передрал из книги.
Спасибо!


Информация о сообщении Вынести предупреждение
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Часовой пояс: UTC + 4 часа



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Быстрые действия:
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Вы можете создать форум бесплатно PHPBB3 на Getbb.Ru, Также возможно сделать готовый форум PHPBB2 на Mybb2.ru
Русская поддержка phpBB