реклама на сайте
подробности

 
 
> После нескольких вызовов процедур кидает в начало, PIC16F72
ArgentumLIME
сообщение May 3 2010, 11:18
Сообщение #1





Группа: Участник
Сообщений: 4
Регистрация: 30-04-10
Пользователь №: 57 004



Я несколько раз вызываю процедуру - в 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'ов
вот после неё и вылетает.
подскажите в чём может быть проблема?
спасибо.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 21:04
Рейтинг@Mail.ru


Страница сгенерированна за 0.01353 секунд с 7
ELECTRONIX ©2004-2016