Форум Микро-Чип

Форум Микро-Чип (http://www.microchip.su/index.php)
-   Вопросы начинающих (http://www.microchip.su/forumdisplay.php?f=14)
-   -   Сортировка данных в РОНах для pic16c52 (http://www.microchip.su/showthread.php?t=18074)

delli 29.05.2017 15:44

Сортировка данных в РОНах для pic16c52
 
Здравствуйте , я знаю что похожая тема уже была http://www.microchip.su/showthread.php?t=14735 ,но хотелось что кто-нибудь объяснил точнее как именно происходит сортировка в РОНах ??:confused: Просто программировать для контроллеров начал окло 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


Guaho 29.05.2017 20:08

Re: Сортировка данных в РОНах для pic16c52
 
Писать w или f вместо 0 и 1 удобнее - так понятнее, какой операнд используется. С нулём и единицей можно запутаться, забыть. То есть так придумано для удобства программистов, и использование такого подхода однозначно улучшает читаемость кода. Я, например, давно забыл, чему соответствует 0, а чему - 1. Если я встречу код с "0" и "1" в качестве данных операндов, придётся лезть в даташит. Неудобно!
А флаг перестановки flag для того и нужен, чтобы зафиксировать факт перестановки. Смотрите внимательно код: сначала этот флаг сбрасывается, а затем, если была перестановка, - устанавливается. Установленный флаг сообщает последующему куску кода, что имел место факт перестановки:
Код:

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

В коде всё прекрасно откомментировано, просто читайте внимательно.


Часовой пояс GMT +3, время: 18:43.

Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd. Перевод: zCarot