AVR Assembler Source Blog

Ремонт частотных преобразователей AVR Assembler Source Blog: Transmit_data_SPI

Thursday, October 3, 2013

Transmit_data_SPI


                              ;Цель: передать в последовательном формате из микроконтроллера во внешний регистр 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                   ;возврат из прерывания

No comments:

Post a Comment