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

 
 
 
Reply to this topicStart new topic
> После нескольких вызовов процедур кидает в начало, 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
ar__systems
сообщение May 5 2010, 19:51
Сообщение #2


self made
****

Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795



В этом куске сможете найти ошибку?
Код
call delayACP


    MOVLW    00h;чтение результата преобразования АЦП
    MOVWF    H_byte2
Go to the top of the page
 
+Quote Post
ArgentumLIME
сообщение May 6 2010, 15:01
Сообщение #3





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



Эмм нет - почему если я заношу в нормально объявленную переменную, это равносильно присвоению к PCL?
я новичок. камнями сильно не закидывать..
Go to the top of the page
 
+Quote Post
volodya
сообщение May 7 2010, 05:18
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 194
Регистрация: 14-02-07
Из: УКРАИНА
Пользователь №: 25 344



Признайтесь как переменная объявлена H_byte2 ?
Вы не указали КАК. Судя по результатм симуляции компилятор присвоил адрес, совпадающий с PCL соотв запись 00 приводит к переходу по адресу PCLATH:PCL.


--------------------
"Для того чтобы избежать критики, надо ничего не делать, ничего не говорить и никем не быть"
"Каждый из нас бывает дураком по крайней мере пять минут в день; мудрость заключается в том, чтобы не превысить лимит." Элберт Хаббард
Go to the top of the page
 
+Quote Post
ar__systems
сообщение May 7 2010, 13:29
Сообщение #5


self made
****

Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795



Цитата(ArgentumLIME @ May 6 2010, 10:01) *
Эмм нет - почему если я заношу в нормально объявленную переменную, это равносильно присвоению к PCL?
я новичок. камнями сильно не закидывать..

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


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

Не весь адрес совпадает, а младшие 8 бит.
Go to the top of the page
 
+Quote Post

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

 


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


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