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

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

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

Ответ
 
Опции темы Опции просмотра
Старый 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 вне форума   Ответить с цитированием
Старый 29.05.2017, 20:08   #2
Guaho
Senior Member
 
Аватар для Guaho
 
Регистрация: 28.06.2013
Возраст: 45
Сообщений: 656
Вес репутации: 1416/36
Guaho has much to be proud ofGuaho has much to be proud ofGuaho has much to be proud ofGuaho has much to be proud ofGuaho has much to be proud ofGuaho has much to be proud ofGuaho has much to be proud ofGuaho has much to be proud ofGuaho has much to be proud ofGuaho has much to be proud of
По умолчанию 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, время: 05:51.


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