zengard

PIC16F877, не работает PORTВ на выход

23 сообщения в этой теме

zengard    0

Доброго времени суток, Уважаемые форумчане. 

Месяц уже изучаю Pic контроллеры, щас дошел до динамической индикации и столкнулся с такой проблемой. Использую 2 разрядный 7 сегментный индикатор с общим катодом, подключаю через NPN транзисторы катоды, код программы и проект проетуса ниже.

Скрытый текст



 LIST        p=16f877
       __CONFIG    H'3F72'        
PORTB       EQU         H'0006'        ; Порты сегментов
TRISB       EQU         H'0006'
PORTA       EQU         H'0005'        ; 0,1 разряды
TRISA       EQU         H'0005'
STATUS      EQU         H'0003'
PCL        EQU        H'0002'
INDICATOR_0 EQU        H'0020'        ;1 индикатор
INDICATOR_1 EQU        H'0021'        ;2 индикатор
COUNT        EQU        H'0024'        
Reg_1       EQU         H'0025'
Reg_2       EQU         H'0026'
Reg_3       EQU         H'0027'
        org 0
       bsf    STATUS,5
       CLRF    TRISA
       CLRF    TRISB
       bcf    STATUS,5
       movlw    .0
       movfw    INDICATOR_0
       movfw    INDICATOR_1
       movlw    .10            
       movwf    COUNT
       
START 
       ;Берем значение из таблицы, записывем в портБ и через А0 выдаем нужную цифру
       movf        INDICATOR_0,0
       call        Tablica
       movwf        PORTB
       movlw        b'00000001'
       movwf        PORTA
       call        delay
       bcf        PORTA,0
       ;Берем значение из таблицы, записывем в портБ и через А1 выдаем нужную цифру
       movf        INDICATOR_1,0
       call        Tablica
       movwf        PORTB
       movlw        b'00000010'
       movwf        PORTA
       call        delay
       bcf        PORTA,1
       decfsz        COUNT,1
       goto        START
       movlw        .10            ;счетчик
       movwf        COUNT
       
       incf        INDICATOR_0,1
       bcf        STATUS,2
       movlw        .10
       subwf        INDICATOR_0,0
       btfsc        STATUS,2
       goto        RESTART_IND
       goto        START
     
; Задержка 500 000 машинных циклов
; Длительность задержки 250 миллисекунд
; Частота задающего генератора 8 МГц

delay       movlw       .85
            movwf       Reg_1
            movlw       .138
            movwf       Reg_2
            movlw       .3
            movwf       Reg_3
            decfsz      Reg_1,F
            goto        $-1
            decfsz      Reg_2,F
            goto        $-3
            decfsz      Reg_3,F
            goto        $-5
            nop
            nop
        return
        
Tablica        
    addwf        PCL,1    
    retlw        b'00000110'    ;1
    retlw        b'11011011'    ;2
    retlw        b'01001111'    ;3  
    retlw        b'01100110'    ;4
    retlw        b'01101101'    ;5
    retlw        b'01111101'    ;6
    retlw        b'00000111'    ;7
    retlw        b'01111111'    ;8
    retlw        b'01101111'    ;9
    retlw        b'00111111'    ;0

RESTART_IND
    movlw        .0
    movwf        INDICATOR_0
    incf        INDICATOR_1,1
    bcf        STATUS,2
    movlw        .1
    subwf        INDICATOR_1,0
    btfsc        STATUS,2
    goto        RESTART_IND_2
    goto        START
        
RESTART_IND_2
    clrf        INDICATOR_1
    clrf        INDICATOR_0
    
PAUSE    movlw        b'01000000'
    movwf        PORTB
    bsf        PORTA,0
    call        delay
    bcf        PORTA,0

    movlw        b'01000000'
    movwf        PORTB
    bsf        PORTA,1
    call        delay
    bcf        PORTA,1
    goto        PAUSE
       END


 

В протеусе программа работает исправно, на практике к сожалению нет. Если подключаю выводы разрядов к плюсу напрямую все работает четко, мерю питание на выходе с портовБ 15мв. 

Читая даташит вроде как я понял , что проблема в том, что состояние TRISB  на момент начала записи у меня состояние 0, записывал значение b'00000001', не помогло(

Помогите пожалуйста. 

Может быть сторожевой таймер или что то в этом духе, не могу найти ошибку

.1.thumb.png.a4ee1e152b9a8894fc2e7153611c4252.png

autoloader_prot.zip

Суть программы обычный перебор чисел, и когда дошла до конца высветить 2 тире

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Yurkin2015    297

При старте процессора пины порта А являются аналоговыми входами. Надо их переконфигурировать в цифровые.

Для этого в самом начале программы надо в ADCON1 записать 6.

bsf    STATUS,5
MOVLW 0x06 ; Делаем пины цифровыми
MOVWF ADCON1 
CLRF    TRISA
CLRF    TRISB
... дальше остальной код

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
zengard    0

Сделал как вы посоветовали, теперь на выходы А0 и А1 питание 4,9В, но на светодиоды все так же 15мв

Щас получается что открывается транзистор, только тока нету с портов Б(

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Bugrim    2

Какое напряжение на коллекторе транзистора? 15мв это где? Какое напряжение на portb? Задайте статический режим для измерений, если "лёд тронется" то потом потихоньку на динамику переходить.

Отправлено с моего Lenovo A5000 через Tapatalk
 

И какой тип индикатора и транзистора?

Отправлено с моего Lenovo A5000 через Tapatalk
 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
zengard    0

К коллектору транзистора подключены разряды индикатора, поидее тогда и питание 15мв, потому-что индикатор с общим катодом, что следует что ток течёт от порта В по сегментам и в коллектор.

15мв это напряжение питания с выходов порта В на сегменты индикатора.

На базу транзистора подаётся питание 4.5вольта, транзистор значит открыт, эмиттер транзистора подключён к земле

Индикатор с общим катодом, семисегментный 2х разрядный

Транзистор 2n4401 npn биополярный

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
zengard    0

Если подключаю эмиттер транзистора к минусу светодиода, то все чётко работает, а через индикатор ничего. Индикатор исправен.4efade0c07d90926d8a339cde7a8fe72.jpg&key=209f9fc71b4daafd8867c43d6b5bb94bc7734d21c723a77bff2e768aa0963551

69858c20569e981bd131387d04b43ed2.jpg&key=2c780fe202878c34e98d9f2039dae3fd1dd539b2f4c52975e6e0dede58851ccc

Напряжение на коллекторе 1вольт

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Bugrim    2

Если ставлю в цепь коллектора светодиод (вместо индикатора), то он светит? И не моргает?
 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
zengard    0

Да, светит, а почему должен моргать? Пауза не такая высокая, чтобы видеть частоту моргания, если я не ошибаюсь.


 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
IMXO    1 277

потому-что переключается с частотой 2Гц

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
IMXO    1 277

и прочитайте как оформляется код на асме

http://pic24.ru/lib/exe/fetch.php/osa/articles/mpasm_formatting.pdf

мозг можно сломать пока поймешь, че вы там быкодели

  • Одобряю 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
IMXO    1 277

@zengard  еще один тупой копипаст предыдущего поста и отправлю в баню , читаем правила форума

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
IMXO    1 277

 

нет , вы бы просто видели мигающие цифры на индикаторах.

19 часов назад, zengard сказал:

подключаю выводы разрядов к плюсу напрямую все работает четко,

разряды ? или все таки сегменты

ЗЫ напишите простую прогу установки портаВ в лог1 и проверьте работоспособность порта.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
zengard    0

Доброго времени суток

	LIST  p=16F877
	__CONFIG H'3F72'
INTCON			equ 0x0B
STATUS			equ 0x03
PORTB			equ 0x06
TRISB			equ 0x86
PORTA       EQU         H'0005'		; 0,1 ???????
TRISA       EQU         H'0005'
RP0			equ 0x05
	ORG 0x00
	goto Start



	ORG 0x05

Start:
	clrf INTCON			

	bsf STATUS, RP0 			;переходим в банк 1
	
	movlw b'00000000'		;помещаем в аккумулятор число 0 
	movwf TRISB			;устанавливаем линии порта 
	clrf	TRISA				;PortB на выход

	bcf STATUS, RP0			
	movlw .255 			
	movwf	PORTB
	bsf	PORTA,0;

Loop:	
	nop				
	goto Loop			

	End

Вот этот код работает на ура, сегменты все горят через транзистор. 

Может ли быть где то прерывание в моей предыдущей программе?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
IMXO    1 277
2 часа назад, zengard сказал:

Может ли быть где то прерывание в моей предыдущей программе?

в теории - нет, по дефолту прерывания запрещены. практически - да может.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
zengard    0

Буду искать, а по опыту не у кого подобных проблем не было?

Использую среду MPLAB X IDE 4.05

Компилятор их родной mpasmwin 5.76

Может компилятор неправильно переводит двоичный код?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
IMXO    1 277
1 час назад, zengard сказал:

Может компилятор неправильно переводит двоичный код?

это шутка такой? асм и есть по сути двоичный код...

1 час назад, zengard сказал:

по опыту не у кого подобных проблем не было?

почему не было, было вот тут к примеру http://forum.cxem.net/index.php?/topic/159325-внешнее-прерывание-на-pic/&tab=comments#comment-2327520

минимальная настройка портов на цифровой  выход для 877

 INTCON = 0;
 PIE1 = 0;
 ADCON1 = 0b00000111; // цифровой вывод
 TRISA = 0b11111111; //порт А - на вход
 TRISB = 0; //порт В - выходы
 TRISC = 0b11111111;// порт С - входы
 TRISD = 0; // порт Д - выходы
 PORTA = 0; //очищаем порт А
 PORTB = 0; //очищаем порт В
 PORTC = 0;
 PORTD = 0;
 OPTION = 0b10000000; //Конфигурация переферии по умолчанию, предделитель таймера 0 на 0

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Electric_84    24
В ‎17‎.‎12‎.‎2017 в 21:53, zengard сказал:

код программы... ниже

какую функцию выполняет вот этот код?

	movlw	.0
	movfw	INDICATOR_0
	movfw	INDICATOR_1
	movlw	.10
	movwf	COUNT

я так понимаю Вы хотите обнулить индикаторы? Тогда может movwf INDICATOR_0 / INDICATOR_1?

И после метки RESTART_IND_2 и выполнения двух команд clrf Вы входите в цикл PAUSE, а где выход? Вы же в нем "зависаете"...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Electric_84    24
14 часа назад, zengard сказал:

Попробую перестроить

симуляцией в MPLAB'е пользуетесь? Протеус это хорошо (не пользуюсь, если что), но все же в симуляторе MPLAB'а можно посмотреть состояние нужных регистров, что должно быть (по задумке), что получилось. Легче "выловить" ошибку в случае чего.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
IMXO    1 277

 типа в протезе это сделать нельзя...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Electric_84    24
20 часов назад, IMXO сказал:

типа в протезе это сделать нельзя...

не знаю. Я же написал что Протеусом не пользуюсь. Я прогнал программу топикстартера в MPLAB'е, есть моменты которые вызывают вопросы и если бы человек использовал симулятор в пошаговом режиме, то таких бы косяков (или как это назвать) можно было бы избежать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сообщения