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    328

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

Для этого в самом начале программы надо в 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 414

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

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


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

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

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

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

  • Одобряю 1

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


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

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

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


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

 

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

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 414
2 часа назад, zengard сказал:

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

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

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


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

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

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

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

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

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


Ссылка на сообщение
Поделиться на других сайтах
IMXO    1 414
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 414

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

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


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

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

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

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


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

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

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

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

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

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

Войти

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

Войти сейчас


  • Сообщения

    • ключевые слова..-надо идти к тем кто смыслит.тем более есть от чего плясать(схема).найдите мастера делов там на вечер-он и подскажет где найти трансформатор.  
    • Здравствуйте.Прошу сильно не пинать.Попался в ремонт такой динамик:http://ldsound.ru/4-gdsh-3-8-4-gd-53a/ Оказался со сдвинутой МС(магнит вместе с шайбой с керном,относительно корзины).Отклеил диффузор с ЧШ от корзины ,отделил МС от корзины и увидел лопнуный магнит (пополам).Видимо на заводе при сборке клея было мало и был промазан небольшой сектор и вследствии удара или падения МС отклеилась.Но когда разьединил магнит и шайбу с керном увидел что и магнит был приклеен в одном месте(клея по окружности не было,только в одном месте).Магнит склеил,но сомневаюсь,что динамик будет работать.Есть в наличии магнит от такого:http://ldsound.ru/5-gdv-1-8-3-gd-31/    Но у него другие габариты и соответственно другой тип магнита.Подойдет ли? Знаю ,что можно найти на развалах(или на выброс) ,но сначала хочется  пройти по ремонту до конца.
    • Я не понимаю ПОЧЕМУ их нет, это что технологически так сложно реализуемо, сделать отражатель на задней стенке панели? Или их принципиально не делают чтобы они рассеивали свет во все стороны но не светили куда-то конкретно? Вы знаете, я вчера нашел вот такую лампочку. Они есть и под Е27 патрон. Она лед, угод 25 градусов. https://www.lighting.philips.ru/consumer/p/led-reflector-dimmable/8718696460436/specifications Я думаю купить просто потолочный светильник под Е27 патрон, в принципе можно и его с рефлектором. И купить такую лампу, только не 13 Вт, а где-то 25 Вт, чтобы наверняка. Но есть вопрос: Не знаете, такая лампа имеет направленный луч или направленный свет? Она в точку светит маленькую или она 25 градусов дает световой поток?
    • А я что не заморачиваюсь разной химией. Перевязываю проводящий пятачек тоненькой жилкой, чтобы была поперек гребенки, от многожильного провода прокалывая резинку и делаю скрутка с обратной стороны.
    • По личным наблюдениям, основных причин две: 1. Изменение интересов с возрастом. Много друзей и знакомых, с кем радиолюбительствовал в детстве и юности, после начала самостоятельной жизни потеряли интерес к этому занятию. Кто в торговлю пошел, кто в автосервис, кто ещё куда. Даже те, у кого работа близка к электронике, уже давно ничего не паяют.  2. Повышение благосостояния. Как ни странно, чем лучше жизнь, тем меньше желания что-то спаять самому. Проще купить готовое. Обленились. И это несмотря на то, что купить разные детали не в пример легче, чем раньше. Кстати, яркий пример - Украина.  Давно уже заметил, как начнешь что-то искать по радиолюбительской тематике, основная часть материала или с украинских сайтов, или автор с Украины. Может, конечно, это только мне так кажется, но впечатление именно такое: Украина экономически "застряла" в 90-х, и мозги у народа еще активно шевелятся в нужном направлении, не только в радиолюбительстве, но и вообще в самодельничестве.  А в России уже перешли на ардуину и соединение китайских плат между собой.  Не интересно. 
    • Я настоящую шестерку только вчера скачал, а то все на пятерке подписанной как шестерка работал.
    • Не надо ничего удалять! Читаешь эту тему как юмореску. Настроения к Новому году прибавилось.