![]() |
Главная Микроконтроллеры [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] [26] [27] [28] [29] [30] [31] [32] [33] [34] [35] [36] [37] [38] [39] [40] [41] [42] [43] [44] [ 45 ] [46] [47] [48] [49] [50] [51] [52] [53] [54] [55] [56] [57] [58] [59] [60] [61] [62] [63] [64] [65] [66] [67] [68] [69] [70] [71] [72] [73] [74] [75] [76] [77] [78] [79] [80] [81] [82] [83] [84] [85] [86] [87] [88] [89] [90] [91] [92] [93] outpCled, PORTB); /• Зажечь светодиоды •/ > SIGNAL(SIG 1NTERRUPT1) /• Обработчик внешнего прерывания inti •/ register u08 led = inp(PORTB); if (led & 0x80) led &= "OxfO; else led 1= OxfO; outpded, PORTB); /* Зажечь светодиоды •/ > int main(void) { outp(Oxff, DDRB); /• Bee линии порта В на вывод (светодиоды) */ outp(OxOO, DDRD); /« Все линии порта D на ввод (кнопки) */ Bif AVR MEGA outp((1«INT0)(1«INT1), EIMSK); /• Разрешить внешние прерывания intO, inti */ Seise outp((1«INT0)(1«INT1), GIMSK): /• Разрешить внешние прерывания intO, inti •/ outp((1«ISC01) 1 (1«ISC10) I (1«ISC11). MCUCR); /* По спаду: intO, no нарастанию: int 1 •/ sendif sei(); /* Разрешить прерывания •/ for (;;) {) /* Бесконечный цикл •/ > Иллюстрация применения UART Автор: Volker 0th. Иллюстрация применения UART. Работает совместно с программой terminal или подобной. Формат UART: 9600 бод, 8 битов, 1 стоп-бит, без проверки четности. Текст программы: sinclude <io.h> Sinclude <interrupt.h> Sinclude <signal.h> Bdefine F CPU 4000000 /* 4 МГц •/ Bdefine UART BAUD RATE 9600 /• 9600 бод •/ Bdefine UART BAUD SEIECT (F CPU/(UART BAUD RATE-161)-1) typedef unsigned char u08; typedef char s08; typedef unsigned short u16; typedef short s16; static volatile u08 •uart data ptr; static volatile u08 uart counter; SIGHAL(SIG UART TRANS) uart data ptr++; if (--uart counter) outp(«uart data ptr, UDR); > SIGNAL(SIG UART RECV) register char led; led = inp(UDR); outpCled, PORTB); /• Обработчик прерывания UART txd готов •/ /• Записать байт в буфер данных •/ /• Обработчик прерывания "прием завершен" •/ /* Прочитать байт из буфера данных UART •/ /• Отобразить полученный байт на светодиодах, •/ /• Подключенных к порту В •/ void uart send(u08 -buf, u08 size) { if (!uart counter) { uart data ptr = buf; uart counter = size; outp(buf, UDR); void uart init(void) { /* разрешить прерывания RxD/TxD */ outp((1«RXCIE)(1«TXCIE)(1«RXEN)(1«TXEN),UCR); /• установить скорость «/ Outp((uD8)UART BAUD SELECT, UBRR); > int main(void) { outp(Oxff,DDRB); outp(OxOO, PORTB); /• Записать первый байт в буфер данных «/ /* Инициализировать UART •/ uart init(); seiO; /• Все пинии порта В на вывод •/ /* Зажечь светодиоды •/ /• Разрешить прерывания •/ for (;:) ( /• Бесконечный цикл •/ uart send("Serla] Data frorn AVR receivedtttttt", 32); Работа с EEPROM и UART Автор: Volker Oth. Читает и записывает EEPROM. При возникновении прерывания UART «передача завершена», содержимое EEPROM пересылается на компьютер. После получения байта от компьютера прерывание «прием завершен» отображает полученный байт на светодиодах и сохраняет его в EEPROM. Формат UART: 9600 бод, 8 битов, 1 стоп-бит, без проверки четности. Текст программы: einclude <io.h> einclude <interrupt.h> Binclude <signal.h> Binclude <eeprom.h> Bdefine F CPU 4000000 Bdefine UART BAUD RATE 9600 /• 4 МГц •/ /. 9600 бод V Bdefine EEPROM SIZE (E2END+1) Bdefine UART BAUD SELECT (F CPU/(UART BAUD RATE.161)-1) typedef unsigned char u08; typedef char s08; typedef unsigned short u16; typedef short s16: u16 read counter; u16 write counter; SIGNAL(SIG UART RECV) register u08 ee write; ee write = inp(UDR); outp("ee write, PORTB); eeprom wb(write counter, ee write); if (++write counter >= EEPROM SIZE) write counter = 0; /• Обработчик прерывания "прием завершен" •/ /• Прочитать байт из буфера данных UART */ /• Отобразить байт на светодиодах */ /. Записать байт в EEPROM •/ /• Переполнение: установить смещение О */ SIGNAL(SIG UART TRANS) < register u08 ee read; /• Обработчик прерывания "передача завершена"*/ ee read = eeprom rb(read counter); outр(ее read, UDR); if (++read counter >= write counter) read counter = 0; /• Прочитать следующий байт из EEprom •/ /• Записать байт в буфер данных UART ♦/ /• Переполнение: начать с 1-го символа */ [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] [26] [27] [28] [29] [30] [31] [32] [33] [34] [35] [36] [37] [38] [39] [40] [41] [42] [43] [44] [ 45 ] [46] [47] [48] [49] [50] [51] [52] [53] [54] [55] [56] [57] [58] [59] [60] [61] [62] [63] [64] [65] [66] [67] [68] [69] [70] [71] [72] [73] [74] [75] [76] [77] [78] [79] [80] [81] [82] [83] [84] [85] [86] [87] [88] [89] [90] [91] [92] [93] 0.0011 |