Товарищи! подскажите? в протеусе на команде GOTO MAIN он переходит на GOTO D1 (в подпрограмме задержки), всё перекопал, всё равно туда уходит постоянно, даже если задержку делать не таймером, а циклами
в mplab при отладке всё работает как надо
LIST p=16f873
__CONFIG 03FF1H
STATUS EQU 03H
PORTB EQU 06H
TRISB EQU 86H
TMR1L EQU 0EH ;младший байт таймера
TMR1H EQU 0FH ;старший байт таймера
PIR1 EQU 0CH ;тут флаг переполнения таймера
TMRN EQU 21H
T1CON EQU 10H
ORG 0x0000
GOTO MAIN
ORG 0x0100
MAIN CLRF PORTB
BCF STATUS, 0 ;убираем С
BCF STATUS, 2 ;убираем Z
BSF STATUS, 5
CLRF TRISB ;portb выход
BCF STATUS, 5
BSF T1CON,4 ;предделитель 1/8
BSF T1CON,5
RIGHT BTFSC STATUS,0 ;проверка флага С
GOTO LEFT ;С поднят
BSF PORTB,0
CALL DELAY
MOVF PORTB, 0 ;значение огоньков в акум
CLRF PORTB ;огоньки пропадают
CALL DELAY ;вызов задержки
MOVWF PORTB ;возвращаем сохранённое значение огоньков
RLF PORTB ;вращаем порт
GOTO RIGHT
LEFT BCF STATUS, 0 ;очистка С
MOVF PORTB,0 ;знакомая уже процедура
CLRF PORTB
CALL DELAY
MOVWF PORTB
RLF PORTB
CALL DELAY
MOVF PORTB,1 ;здесь проверяем порт на 0, сохраняем самого в себя
BTFSS STATUS, 2 ;если portb = 0, поднимается флаг Z, проверяем его
GOTO LEFT
BCF STATUS, 0 ;после вращения еденичка из 7го бита уходит в бит С, очищаем его
GOTO RIGHT ;всё заново
DELAY MOVLW 02H ;переполнения ожидаем 2 раза
MOVWF TMRN
D2 CLRF TMR1L
CLRF TMR1H
BSF T1CON,0 ;запуск таймера
D1 BTFSS PIR1, 0 ;ждём флаг переполнения
GOTO D1
BCF T1CON,0 ;остановка таймера
BCF PIR1, 0 ;очистка флага
DECFSZ TMRN ;декрементируем счётчик, если 0 пропускаем след ком
GOTO D2
RETURN
END