Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: После нескольких вызовов процедур кидает в начало
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > PIC
ArgentumLIME
Я несколько раз вызываю процедуру - в PIC Simulator вижу код
Код
RETURN;  возврат, нормально
MOVLW 0x00
MOVWF PCL; почему после возврата из процедуры меня кидает в начало программы?!


Сама процедура - АЦП
Код
selection        ;Выборка для АЦП каждые 300мс
; очищение и настройки
banksel PORTA
    CLRF     INTCON    ;Запретить все прерывания
    CLRF     PORTA    ;Иницилизация портов
    CLRF     PORTB
    CLRF     PORTC    
    COMF    PORTA
    COMF    PORTB
    COMF    PORTC


    BANKSEL TRISA
    MOVLW     B'00000011'
    MOVWF     TRISA       ;Порт RA0, RA1 - на ввод RA2 - RA5 - на вывод
    MOVLW     00h
    MOVWF     TRISB    ;Порт В настроить на вывод
    MOVLW     00h
    MOVWF     TRISC    ;Порт С настроить на вывод


; переходим к АЦП


    BANKSEL    ADCON1
    MOVLW    B'00000101'
    MOVWF    ADCON1    ; Вход опорного напряжения - Vdd, RA0-1 - аналоговые входы
    
    BANKSEL    ADCON0
    MOVLW    B'10000001'
    MOVWF    ADCON0
;MOVWF     ADCON0    ; Настройка АЦП вкл АЦП f/32 0 раз вход
    BCF    PIR1,ADIF
    BSF    INTCON,GIE
    banksel    PIE1
    BSF    PIE1,ADIE

; аналого-цифровое преобразование  
ACP
    NOP                    
    NOP
    NOP
    NOP
    NOP                ; здесь задержка для схемы выборки-хранения напряжения
    NOP
    NOP
    NOP
    NOP
    NOP

call delayACP


banksel    ADCON0
    BSF     ADCON0,GO_DONE ;старт АЦП

call delayACP
call delayACP


    NOP
    NOP

ACPcurrent    ; АЦПшим ток

;    BTFSS     ADCON0,GO_DONE    ;анализ готовности АЦП
;    GOTO     ACPcurrent    


    MOVF    ADRES,W        ;чтение результата преобразования АЦП
    MOVWF    L_byte1
    BCF     STATUS,C    ; Очищаем флаг переноса
    RLF     L_byte1,1    ; Умножим на два, дабы получить на выходе максимум не 255,а 510
    BTFSC    STATUS,C     ; если при умножение был установлен флаг переноса - сдвинем старшую часть
        RLF    H_byte1,1


    BCF ADCON0,ADON

    BCF    PIR1,ADIF
    BCF    INTCON,GIE
    banksel    PIE1
    BCF    PIE1,ADIE


; подготовка для АЦПирования напряжения

    BANKSEL    ADCON1
    MOVLW    B'00000101'
    MOVWF    ADCON1    ; Вход опорного напряжения - Vdd, RA0-1 - аналоговые входы

      BANKSEL    ADCON0
    BSF     ADCON0,CHS0    ; подключить канал RA1 к АЦП
    BCF     ADCON0,CHS1  
    BCF     ADCON0,CHS2



    

    BSF    INTCON,GIE
    banksel    PIE1
    BSF    PIE1,ADIE

    NOP                    ; задержка для схемы выборки хранения напряжения
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP

call delayACP
    banksel ADCON0
    BSF     ADCON0,GO_DONE     ;старт АЦП
    NOP
    NOP

ACPvoltage        ; АЦПшим напряжение

;    BTFSS     ADCON0,GO_DONE;анализ готовности АЦП
;    GOTO     ACPvoltage    

call delayACP


    MOVLW    00h    ;чтение результата преобразования АЦП
    MOVWF    H_byte2
    MOVF    ADRES,0
    MOVWF    L_byte2

    BCF ADCON0,ADON

    BCF    PIR1,ADIF
    BCF    INTCON,GIE
    banksel    PIE1
    BCF    PIE1,ADIE

return

delayACP - процедура, состоящая из 40 NOP'ов
вот после неё и вылетает.
подскажите в чём может быть проблема?
спасибо.
ar__systems
В этом куске сможете найти ошибку?
Код
call delayACP


    MOVLW    00h;чтение результата преобразования АЦП
    MOVWF    H_byte2
ArgentumLIME
Эмм нет - почему если я заношу в нормально объявленную переменную, это равносильно присвоению к PCL?
я новичок. камнями сильно не закидывать..
volodya
Признайтесь как переменная объявлена H_byte2 ?
Вы не указали КАК. Судя по результатм симуляции компилятор присвоил адрес, совпадающий с PCL соотв запись 00 приводит к переходу по адресу PCLATH:PCL.
ar__systems
Цитата(ArgentumLIME @ May 6 2010, 10:01) *
Эмм нет - почему если я заношу в нормально объявленную переменную, это равносильно присвоению к PCL?
я новичок. камнями сильно не закидывать..

Про банксел забыли


Цитата(volodya @ May 7 2010, 00:18) *
компилятор присвоил адрес, совпадающий с PCL соотв запись 00 приводит к переходу по адресу PCLATH:PCL.

Не весь адрес совпадает, а младшие 8 бит.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.