;Цель: передать в последовательном формате из микроконтроллера во внешний регистр 4 байта полезных данных, находящихся в RAM по адресам:$060, $061, $062, $063, $064 с формированием для внешнего регистра сигнала завершения цикла передачи load. ;Вариант с использованием SPI ;Для передачи данных необходимо определить в SPI режим master с формированием сигналов SCK(PB7), MOSI(PB5). Вход MISO(PB6) в данной задаче не используется, сигнал завершения цикла может быть сформирован только программно на одном из выходов, например, PB4. ;Регистр управления SRCR должен быть инициализирован следующим образом 0b01011100, старший бит SPIE этого регистра должен программно устанавливаться в начале цикла и очищаться в конце цикла ;Необходимо также использовать вектор прерывания SPITC с адресом $00a (с этим кодом требуется 27 команд) .NOLIST ;не включать последующие команды в листинг .INCLUDE "m32def.inc" ;включить в код файл описаний команд и регистров конкретного контроллера .LIST ;включить последующие команды в листинг .DEF temp=r16 ;определить переменную temp как регистр r16 .CSEG ;указываем, что далее будем работать с памятью программ FLASH .ORG $000 ;установка положения в начальный $000 адрес памяти rjmp init ;условный переход на метку init: (прерывание по reset) .ORG $00a ;установка положения в $00a адрес памяти rjmp spitc ;условный переход на метку spitc: (прерывание по завершению передачи байта) .ORG $011 ;установка положения в $00a адрес памяти init: ;инициализация используемых аппаратных средств, назначение портов на вход и выход ldi temp, LOW(RAMEND) ;значение переменной RAMEND указано во включаемом файле .inc, различное значение для каждого контроллера out SPL, temp ldi temp, HIGH(RAMEND) out SPH, temp ldi temp, $f0 ;запись в temp числа 11110000 out DDRB, temp ;задействовать четыре старших бита регистра DDRB порта B как выходы, по умолчанию задействованы как входы 00000000 ldi temp, 0b01011100 out SPCR, temp ;инициализация SPI start: ;запуск цикла с выводом первого байта в последовательном формате clr XH ;очистка старшего байта спец. регистра косв. адресации X (состоит из 2 РОН) ldi XL, $60 ;занести начальный адрес данных в регистр X ld temp, X+ ;занести в temp байт с постинкрементом(использовать адрес, затем увеличить на 1) адреса в X out SPDR, temp ;переслать байт в регистр данных SPI sbi SPCR, SPIE ;установить разрешение прерывания SPI sei ;установить флаг общего разрешения прерываний main: ;безсодержательный бесконечный цикл, может быть заменен любой программой nop rjmp main spitc: ;программа для вектора прерываний SPI cpi XL, $64 ;сравнить младший байт регистра X с конечным адресом полезных данных breq end ;перейти на метку end: если значения одинаковы ld temp, X+ ;занести в temp байт с постинкрементом(использовать адрес, затем увеличить на 1) адреса в X reti ;возврат из прерывания end: ;программ окончания цикла sbi PORTB, PB4 ;установить сигнал LOAD cbi SPCR, SPIE ;запретить прерывание SPI cbi PORTB, PB4 ;сбросить сигнал LOAD reti ;возврат из прерывания
Thursday, October 3, 2013
Transmit_data_SPI
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment