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

ПРОЕКТИРОВАНИЕ И МОДЕЛИРОВАНИЕ 56 WWW.SOEL.RU СОВРЕМЕННАЯ ЭЛЕКТРОНИКА ◆ № 6 2021 ция возвращает 0). Если карта не под- ключена, на экран дисплея выводится предупреждающее сообщение «Karta ne podkluchena». Когда карта подключена, на экран дисплея выводится сообще- ние «ОК», выполняется инициализация интерфейса USART для вывода данных на экран терминала, затем чтение одно- го текстового блока объёмом 512 байт (четвёртый параметр функции чте- ния count = 1), начиная с первого сек- тора (третий параметр функции чтения sector = 0), и запись считанных данных в переменную Buff. После паузы длительностью 500 мс с помощью функции lcd_gotoxy(0,1); курсор дисплея устанавливается в первую позицию второй строки и начинается посимвольный вывод в цикле for считанной с карты памя- ти информации на экран терминала (функция send_UART(Buff[i]);) и дис- плея (функция lcd_putchar(Buff[i]);). Запись на карту памяти массива дан- ных из переменной Buff2, начиная с первого сектора (третий параметр функции записи sector = 0), выпол- няется с помощью функции disk_ write (0, Buff2, 0, 1); после паузы дли- тельностью 500 мс. В результате уже имеющаяся в файле образа ММС.mmc информация будет перезаписана (см. рис. 13). Теперь с помощью функции disk_read (0, Buff3, 0, 1); считаем запи- санную информацию с карты памя- ти и после паузы длительностью 500 мс выведем её посимвольно с помо- щью функции send_UART(Buff3[i]); с новой строки на экран терминала. Обмен информацией между микро- контроллером и картой памяти выполняется через линии РВ4…РВ7 микроконтроллера. Для работы с бук- венно-цифровым дисплеем задей- ствованы линии РС0…РС2 и РС4… РС7 микроконтроллера, линия РD1 используется для последовательно- го вывода информации на экран тер- минала. Применение функций библиотеки ff.h для чтения и записи данных во внешнюю память В библиотеке ff.h определены функ- ции работы с картой памяти, отформа- тированной в файловой системе FAT, среди которых следущие: ● f_open(FIL* fp, const char* path, unsigned char mode) – функция создания нового или открытия уже имеющего файла, где fp – ука- затель на структуру данных фай- Листинг 1 include <mega32.h> // Подключение заголовочных файлов #include <alcd.h> // в которых содержатся #include <stdio.h> // прототипы функций #include <delay.h> #include <sdcard.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) // Основная функция программы { unsigned char Buff[512]; unsigned char Buff2[512]="Чтение информации с карты памяти и ее вывод на экран терминала"; unsigned char Buff3[512]; 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") // Проверка подключения карты памяти if((disk_initialize(0))==0) // Если карта подключена {lcd_puts("OK");} // Вывод на экран дисплея сообщения ОК else // иначе {lcd_puts("Karta ne podkluchena");} // Вывод сообщения об отсутствии подключения карты init_USART(); // Инициализация USART disk_read (0, Buff, 0, 1); // Чтение с карты памяти текстового блока // и его запись в переменную Buff delay_ms(500); // Пауза длительностью 500 мс lcd_gotoxy(0,1); // Установка курсора в первую позицию второй строки дисплея for (i=0;i<33;i++) {send_UART(Buff[i]); // Вывод считанной с карты памяти информации на экран терминала lcd_putchar(Buff[i]);} // Вывод считанной с карты памяти информации на экран дисплея delay_ms(500); disk_write (0, Buff2, 0, 1); // Запись на карту памяти блока информа- ции // из переменной Buff2 disk_read (0, Buff3, 0, 1); // Чтение информации с карты памяти // и её запись в переменную Buff3 delay_ms(500); printf("\n\r"); // Переход на новую строку на экране терминала for (i=0;i<64;i++) { send_UART(Buff3[i]); }} // Вывод считанной с карты памяти информа- ции // на экран терминала

RkJQdWJsaXNoZXIy MTQ4NjUy