AVR Assembler Source Blog

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

Thursday, October 3, 2013

Transmit_data



                              ;Цель: передать в последовательном формате из микроконтроллера во внешний регистр 4 байта полезных данных, находящихся в RAM по адресам:$060, $061, $062, $063, $064 с формированием для внешнего регистра сигнала завершения цикла передачи load.
                              ;Вариант решения задачи программно, передавая на те же выходы порта B программно формируемые сигналы, для адресации данных в RAM, будем использовать регистр косвенной адресации X (с этим кодом требуется 303 команды)


.NOLIST                       ;не включать последующие команды в листинг
.INCLUDE "m32def.inc"         ;включить в код файл описаний команд и регистров конкретного контроллера
.LIST                         ;включить последующие команды в листинг
.DEF temp=r16                 ;определить переменную temp как регистр r16
.CSEG                         ;указываем, что далее будем работать с памятью программ FLASH
.ORG $000                     ;установка положения в начальный $000 адрес памяти
 rjmp init                    ;условный переход на метку init: (прерывание по reset)
.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
       sbi PORTB, PB7         ;установить PB7

start:                        ;запуск цикла с выводом первого байта в последовательном формате

       cli                    ;очистить флаг разрешения прерываний
       clr XH                 ;очистка старшего байта спец. регистра косв. адресации X (состоит из 2 РОН)
       ldi XL, $60            ;занести начальный адрес данных в регистр X

byte:
       
       ld temp, X+            ;занести в temp байт с постинкрементом(использовать адрес, затем увеличить на 1) адреса в X
       ldi r17, $08           ;определить количество бит в байте

bit:   

       sbrs temp, 7           ;пропустить, если бит 7 очищен
       sbi PORTB, PB5         ;установить PB5
       cbi PORTB, PB7         ;очистить PB7 (сигнал SCK)             
       lsl temp               ;сдвиг влево байта данных
       sbi PORTB, PB7         ;установить PB7 (сигнал SCK)
       dec r17                ;декремент числа бит в r17
       brpl bit               ;перейти к метке bit:, если не все биты переданы (r17 еще не равен нулю)

       cpi XL, $64            ;сравниваем текущий XL с конечным адресом
       brne byte              ;переходим на метку byte:, если еще не весь байт передан

end: 

       sbi PORTB, PB4         ;установить PB4 (сигнал load)
       nop                    ;пустая инструкция (задержка)
       cbi PORTB, PB4         ;сбросить PB4
       sei                    ;общее разрешение прерываний

main:                         ;общий бессодержательный бесконечный цикл, может быть заменен любой программой

       nop                    ;пустая инструкция (задержка)
       rjmp main              ;переход по метке main:

No comments:

Post a Comment