Современная электроника №6/2021

ПРОЕКТИРОВАНИЕ И МОДЕЛИРОВАНИЕ 59 WWW.SOEL.RU СОВРЕМЕННАЯ ЭЛЕКТРОНИКА ◆ № 6 2021 Листинг 2 #include <mega32.h> // Подключение заголовочных файлов #include <alcd.h> // в которых содержатся #include <stdio.h> // прототипы функций #include <delay.h> #include <ff.h> #define F_CPU 2000000 // Рабочая частота микроконтроллера #define BAUD 9600L // Скорость обмена данными #define UBRRL_value (F_CPU/(BAUD*16))-1 // Согласно заданной скорости // подсчитываем значение для регистра UBRR void init_USART() { // Функция инициализации USART UBRRL = UBRRL_value; // Младшие 8 бит UBRRL_value UBRRH = UBRRL_value >> 8; // Старшие 8 бит UBRRL_value UCSRB = (1<<TXEN); // Бит разрешения передачи UCSRC = (1<< UCSZ0)|(1<< UCSZ1); } // Устанавливаем формат 8 бит дан- ных void send_UART(char value) { while(!( UCSRA & (1 << UDRE))); // Ожидаем когда очистится буфер передачи UDR = value; } // Помещаем данные в буфер, начинаем передачу interrupt [TIM1_COMPA] void timer1_compa_isr(void) {disk_timerproc();} // Вызов функции синхронизации void main(void) // Основная функция программы { FATFS fat; // Выделение рабочей области памяти для логического диска FIL file; // Указатель на структуру данных файла unsigned char Buff[542]; // Переменная для записи считанных данных // из файла 1.txt карты памяти unsigned int br; // Число прочитанных из файла 1.txt байтов int i; // Инициализация портов микроконтроллера // Port A DDRA=(0<<DDA7) | (0<<DDA6) | (0<<DDA5) | (0<<DDA4) | (0<<DDA3) | (0<<DDA2) | (0<<DDA1) | (0<<DDA0); PORTA=(0<<PORTA7) | (0<<PORTA6) | (0<<PORTA5) | (0<<PORTA4) | (0<<PORTA3) | (0<<PORTA2) | (0<<PORTA1) | (0<<PORTA0); // Port B DDRB=(1<<DDB7) | (0<<DDB6) | (1<<DDB5) | (1<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) | (0<<DDB0); PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0); // Port C DDRC=(1<<DDC7) | (1<<DDC6) | (1<<DDC5) | (1<<DDC4) | (1<<DDC3) | (1<<DDC2) | (1<<DDC1) | (1<<DDC0); PORTC=(0<<PORTC7) | (0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) | (0<<PORTC3) | (0<<PORTC2) | (0<<PORTC1) | (0<<PORTC0); // Port D DDRD=(1<<DDD7) | (1<<DDD6) | (1<<DDD5) | (1<<DDD4) | (1<<DDD3) | (1<<DDD2) | (1<<DDD1) | (1<<DDD0); PORTD=(0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0); // Инициализация таймера TCCR1A=0x00; TCCR1B=0x0D; TCNT1H=0x00; TCNT1L=0x00; OCR1AH=0x00; OCR1AL=0x4E; TIMSK=0x10; lcd_init(20); // Инициализация дисплея #asm("sei") delay_ms(200); init_USART(); // Инициализация USART delay_ms(200); f_mount(0, &fat); // Выделение рабочей области памяти для логического раздела f_open(&file,"0:/1.txt", FA_OPEN_EXISTING | FA_READ); // Открываем файл 1.txt // только для чтения f_read(&file, Buff, sizeof(Buff), &br); // Читаем в переменную Buff данные из файла 1.txt f_close(&file); // Закрываем файл 1.txt delay_ms(50); // Пауза длительностью 50 мс lcd_gotoxy(0,0); // Установка курсора в первую позицию первой строки дисплея for (i=0;i<br;i++) {send_UART(Buff[i]);} // Вывод считанных из файла 1.txt карты памяти данных // на экран терминала for (i=0;i<19;i++) {lcd_putchar(Buff[i]);} // Вывод на экран дисплея 19 символов считан- ных // из файла 1.txt карты памяти } − FR_INT_ERR – внутренняя ошибка карты памяти или файловой систе- мы FAT; − FR_INVALID_OBJECT – файл не был открыт с помощью функции f_open. ● f_read(FIL* fp, void* buff, unsigned int btr, unsigned int* br) – функция чтения данных из предваритель- но открытого файла, где fp – ука- затель на открытый файловый объ- ект, buff – переменная для записи считанных данных, btr – количе- ство байтов для чтения, br – коли- чество реально прочитанных бай- тов. Значения, которые возвращает функция: − FR_OK – успешное выполнение функции; − FR_DENIED – в доступе к файлу от- казано, так как он открыт только для записи; − FR_NOT_READY – доступ к карте памяти невозможен из-за отсут- ствия её подключения или по дру- гой причине; − FR_DISK_ERR – ошибка доступа к карте памяти; − FR_INT_ERR – внутренняя ошибка карты памяти или файловой систе- мы FAT; − FR_INVALID_OBJECT – файл не был открыт с помощью функции f_open. Рассмотрим работу с функцией чте- ния данных из внешней памяти на кон- кретном примере, для чего создадим с помощью программыWinImage образ карты памяти, добавим в образ файл с расширением *.txt, который содер- жит блок текстовых данных, сохра- ним образ в папке FAT16 в каталоге с проектом Proteus, изменим его расши- рение на .mmc и укажем путь к файлу образа и его имя в поле Card Image File в окне свойств карты памяти. Для чте- ния данных из размещённого во внеш- ней памяти файла и их отображения на экране терминала и буквенно-циф- рового дисплея напишем программу инициализации микроконтроллера на языке С с применением стандарт- ных функций CodeVisionAVR. Текстпрограммыприведёнвлистинге2. Введем текст программы в окне кода CodeVisionAVR и запустим компиля- цию. После чего перейдём в Proteus и в окне свойств микросхемы ATmega32 укажем путь к файлу прошивки на диске компьютера. Запустим модели- рование собранной схемы, результат которого представлен на рис. 14, и про- анализируем её работу. После запуска симуляции проис- ходит монтирование карты памяти, а затем открытие размещённого на ней файла 1.txt для чтения из него в переменную Buff фрагмента тексто- вых данных. Объём реально прочи- танных данных в байтах записывает- ся в переменную br и может отличаться от заданного. После закрытия файла выполняется посимвольный вывод в цикле for всего блока считанных дан- ных на экран терминала. На экран дис- плея посимвольно выводятся в цикле for 19 символов из файла 1.txt. Литература: 1. ISIS Help, Labcenter Electronics, 2014. 2. CodeVisionAVR Help, HP InfoTech, 2014. 3. HD44780U (LCD-II) (Dot Matrix Liquid Crystal Display Controller/Driver). Hitachi, Ltd. 1998.

RkJQdWJsaXNoZXIy MTQ4NjUy