Главная  Микроконтроллеры 

[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.001