Показать сообщение отдельно
Старый 29.05.2017, 15:44   #1
delli
Junior Member
 
Регистрация: 27.05.2017
Возраст: 21
Сообщений: 1
Вес репутации: 100/0
delli will become famous soon enoughdelli will become famous soon enough
Question Сортировка данных в РОНах для pic16c52

Здравствуйте , я знаю что похожая тема уже была http://www.microchip.su/showthread.php?t=14735 ,но хотелось что кто-нибудь объяснил точнее как именно происходит сортировка в РОНах ?? Просто программировать для контроллеров начал окло 1 месяцa назад,а тут такое задание и я не знаю что делать...Данные поступают в 8-разрядном параллельном коде на один из портов.Запись производится по положительному фронту тактовых импульсов в ячейки ОЗУ(кроме 5 последних).
Помогите пожалуйста с сортировкой! Нужно по завершении процесса записи расположить эти числа в ячейки ОЗУ по возрастанию. Подсчитать количество тактовых импульсов , сохранить в свободной ячейке ОЗУ и вывести это число в последовательном коде на один из выходов. Далее перейти в режим ввода новых данных ,с последующей сортировкой по убыванию . Ниже представлен код который который я нашел в той теме ,помогите пожалуйста разобраться с процедурой Sort: subwf INDF, W-почему вместо 1 или 0 ставится W ?
Код:
 movf    INDF, W     
        decf    FSR, F
        movwf   INDF    Как работает весь эта часть кода?
        movf    tmp, W  
        incf    FSR, F
        movwf   INDF
зачем нужен индикатор перестановки flag?
Код:
#include <p16f877.inc>

    PROCESSOR PIC16F877

    ERRORLEVEL  -302

  __CONFIG _CP_OFF & _WDT_OFF & _XT_OSC & _LVP_OFF

tmp         EQU 0x1E    ; <-- здесь  будет временно храниться число
flag        EQU 0x1F    ; <-- индикатор перестановок

Buff        EQU 0x20    ; <-- сюда будут заноситься числа


;----------------------- Вектор сброса --------------------------------

    ORG 0x000
             
        goto    begin

;--------------------- Вектор прерываний ------------------------------

    ORG 0x004

        retfie

;----------------------------------------------------------------------            

begin

    banksel TRISA

        movlw   B'00000110'
        movwf   ADCON1      ; отключить аналоговые входы

        movlw   0xFF
        movwf   TRISB       ; PORTB конфигурировать как вход

        movwf   TRISA       ; PORTA конфигурировать как выход
        bsf     TRISA, RA4  ; T0CKI конфигурировать как вход

        movlw   B'00101000'
        movwf   OPTION_REG

    banksel PORTA

        clrf    ADCON0      ; отключить ADC

        clrf    PORTA

        movlw   Buff        ; запись в FSR адреса Buff как адреса первого регистра ОЗУ
        movwf   FSR         ; в который будет записан первый байт, поступивший на PORTB 

        clrf    TMR0

input   movf    TMR0, W     ; ожидаем положительного перепада на T0CKI
        btfsc   STATUS, Z   ;
        goto    input

        movf    PORTB, W    ; перезапись байта данных, поступивших на PORTB, в регистр W
        movwf   INDF        ; перезапись байта данных из W в регистр с адресом, установленным в FSR

        clrf    TMR0        ; подготовить TMR0 к следующему положительному перепаду на T0CKI
        incf    FSR, F      ; FSR на следующий адрес

        movlw   Buff + .20  ; проверка, в последний ли нужный регистр были записаны данные (регист 0x33)
        subwf   FSR, W
        btfss   STATUS, C
        goto    input       ; числа введены не все!

        bsf     PORTA, 1    ;зажечь лампочку, все 20 регистров заполнены!

    ; сортировка методом "пузырька". Этот метод самый простой

sort    clrf    flag        ; сбросим индикатор перестановок

        movlw   Buff        ; запись в FSR адреса Buff как адреса первого регистра ОЗУ
        movwf   FSR         ;

loop    movf    INDF, W     ; прочитаем очередное число
        movwf   tmp         ; и сохраним его временно в tmp

        incf    FSR, F      ; следующий адрес (число)

        subwf   INDF, W     ; сравним очередное число и следующее
        btfsc   STATUS, C
        goto    next        ; числа расположены правильно, переходим к сравнению следующей пары

        movf    INDF, W     ; числа расположены НЕ правильно, переставим числа местами
        decf    FSR, F
        movwf   INDF    
        movf    tmp, W  
        incf    FSR, F
        movwf   INDF

        bsf     flag, 0     ; установим индикатор перестановок

next    movlw   Buff + .19  ; проверка, все ли пары чисел проверены
        subwf   FSR, W
        btfss   STATUS, C
        goto    loop        ; пары чисел проверены не все!

        btfsc   flag, 0     ; были ли перестановки?
        goto    sort        ; перестановки были, "прогоним" ещё разок!

    ; перестановок не было, сортировка закончена!

        nop                 ; зависнем здесь,так как не знаю, что делать дальше
        goto    $ - 1

    END
delli вне форума   Ответить с цитированием