Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Вопросы начинающих

Вопросы начинающих Прежде чем задать вопрос, стоит воспользоваться поиском

Ответ
 
Опции темы Опции просмотра
Старый 29.05.2017, 15:44   #1
delli
Junior Member
 
Регистрация: 27.05.2017
Возраст: 23
Сообщений: 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 вне форума   Ответить с цитированием
Старый 29.05.2017, 20:08   #2
Guaho
Senior Member
 
Аватар для Guaho
 
Регистрация: 28.06.2013
Возраст: 47
Сообщений: 727
Вес репутации: 1505/45
Guaho has a brilliant futureGuaho has a brilliant futureGuaho has a brilliant futureGuaho has a brilliant futureGuaho has a brilliant futureGuaho has a brilliant futureGuaho has a brilliant futureGuaho has a brilliant futureGuaho has a brilliant futureGuaho has a brilliant futureGuaho has a brilliant future
По умолчанию Re: Сортировка данных в РОНах для pic16c52

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


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите с интерфейсом I2C maxNTF Продукция MICROCHIP 34 23.03.2009 12:45
pic 16f877 + spi... Кто понимает? floke Вопросы начинающих 3 17.01.2009 15:21
LCD и PIC16F628 DrejAn Продукция MICROCHIP 60 29.05.2008 09:37
Замечательная програмка для мониторинга данных, находка просто)) maagalex Общетехнические вопросы 0 16.04.2008 11:53
проблемка с PIC16F628A bereg_ok Продукция MICROCHIP 72 07.09.2007 11:00


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


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