2013-04-21 7 views
1

Я всегда моргал светодиодами на PORTB в PIC16F628A.PIC BTFSC и BTFSS не работают на PORTA

Теперь мне нужно сделать это на PORTA, потому что я пытаюсь использовать клавиатуру на PORTB.

Код ниже отлично работает на RB3 PORTB, но я не в PORTA.

Вот пример в PORTA. Я протестировал и проблема в функции BTFSS и BTFSC ... Потому что, если я поворачиваю ведомый или вручную, он работает нормально. (также я delay_1s_routine опущен код)

main 
    ;*********CONFIGURACION LED********** 
    clrf Puerto_Led 
    movlw 0x07 
    movwf CMCON 
bsf STATUS,RP0 
     clrf TRISA 
bcf STATUS,RP0 

loop 
    call prende_apaga_Led 
    call delay_1s_routine 
goto loop 


prende_apaga_Led 
btfsc PORTA,RA1 ;si esta en 0 salta el GOTO 
goto $+3 
bsf PORTA,RA1  ;Pongo en '1' el bit del Led Verde 
return 
bcf PORTA,RA1  ;Pongo en '1' el bit del Led Verde 
return 

Спасибо Советы !!

Редакцией: Положите реальные значения на код

PD: Испытано эту инструкцию отдельно и отлично работает - BSF PORTA, RA1 - КБК PORTA, RA1

ответ

1

Я предпочитаю:

Вместо того, чтобы идти в techno quirks и философские дебаты, обходите проблему.

Я всегда использую теневые регистры для состояний портов и тестирую и управляю ими.

Так что используйте бит в своей ОЗУ, чтобы отразить состояние PORTA, RA1. Поверьте мне, он будет работать без проблем.

1

В коде после метки prende_apaga_Led, You похоже, обрабатывают светодиодный вывод один раз в качестве входа (тестирование с использованием btfsc) и один раз в качестве выхода (bsf и bcf). Штырь нельзя использовать одновременно. Либо вы устанавливаете бит TRISA как входной или выходной и придерживаетесь его.

Мне кажется, что код, который вы пытаетесь сделать, переключает значение светодиода на основе его предыдущего состояния. То, как вы это делаете, не будет работать. Более простой способ сделать это - использовать функцию xor следующим образом: movlw 0xYY; где ГГ это шаблон, в котором 0 означает отсутствие изменений в выходной контакт, 1 означает переключать затем следовать по xorlw PORTA

так просто это будет как:

clrf Puerto_Led 
    movlw 0x07 
    movwf CMCON 
    bsf STATUS,RP0 
    clrf Conf_Led 
    bcf STATUS,RP0 
loop 
    movlw 0xYY ; change YY, i.e. if the LED is on RA2 YY will be 0x04 
    xorlw Puerto_Led 
    call delay_1s_routine 
    goto loop 
+0

Я не уверен, о чем вы говорите. Инструкция BTFSS или BTFSC показывает, является ли бит X регистра равным 1 или 0. И если ваш порт TRISA установлен в режиме вывода. Затем вы должны увидеть, установлены ли их выходы или нет. Вы только дали мне решение переключить бит, но нет решения о том, как узнать состояние бит? И этот код отлично работает на TRISB/PORTB. Таким образом, проблема BTFSS здесь является проблемой ... – fefo