Регистрация | Вход
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 3
  • 1
  • 2
  • 3
  • »
Модератор форума: demanik  
Форум Picbasic.ru » Программирование МК » Proton PicBasic » Индикатор TM1637 (Управление индикатором без библиотек)
Индикатор TM1637
Matrix252005 Дата: Сб, 27.01.2018, 11:32  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 713
Репутация: 43   ±
Замечания:   ±
На сайте с 12.10.2007

Статус: Offline

По просьбе Aleksey_174 открываю новую тему.

THE TRUTH IS OUT THERE.

С уважением, Николай.
ЯНДЕКС Дата: 27.01.2018
Aleksey_174 Дата: Сб, 27.01.2018, 11:59  |                                                                                                                Сообщение # 2
Группа: Проверенные
Ранг:  Начал соображать
Сообщений: 20
Репутация: 0   ±
Замечания:   ±
На сайте с 22.01.2017

Статус: Offline

Всем привет!!!
Приобрел недавно на али индикатор TM1637

Стоит не дорого, управление идет всего по 2 пинам I2C, думал подключу без проблем.
Не тут то было, в инете в основном подключение к Ардуино идет через библиотеки, а про PIC, если и есть что-то то на других языках.
Наткнулся на тему  управление индикатором без библиотек , но опять же не протон пытался перевести, но индикатор даже не подает признаков жизни я уже начинаю думать, что они у меня не рабочие.
Может общими усилиями, мы его запустим.

КодDevice 16F684Xtal = 4
'-------------------------- Конфигурация программирования -------------------------------Config FCMEN_OFF, IESO_OFF, CPD_OFF, CP_OFF, MCLRE_OFF, PWRTE_OFF, WDT_OFF, INTRC_OSC_NOCLKOUT, BOREN_OFF, BOD_OFF
'--------------------------------------Настройки портов----------------------------------'             + ### -'A5             ### Data            A0'A4             ### Clk             A1'A3        Mclr ###                 А2'C5             ###                 С0'C4             ### TM1637/Dio      С1'C3             ### TM1637/Clk      С2
TRISA = %00000000                             'порты АTRISC = %00000110                             'порты С
'OPTION_REG.7 = 0                             'Включаем подтягивающие резисторыOPTION_REG.7 = 1                              'Отключим подтягивающие резисторыDeclare All_Digital = On                      'все порты цифровые
'---------------------------переменные --------------------------------------------------Dim i As ByteDim Keydata As ByteDim Databyte As ByteDim Bright As ByteSymbol TM_Dio = PORTC.1Symbol TM_Clk = PORTC.2'-------------------------главная программа----------------------------------------------main:'Databyte = %11000000 'Начинать с 1 индикатора'Databyte = %11000001 'Начинать с 2 индикатора'Databyte = %11000010 'Начинать с 3 индикатора'Databyte = %11000011 'Начинать с 4 индикатора'Databyte = %11000100 'Начинать с 5 индикатора'Databyte = %11000101 'Начинать с 6 индикатора
'Databyte = %01000000 'Команда записи на дисплей
GoSub tm1637_startDatabyte = %01000000 'Команда записи на дисплейGoSub tm1637_write'Databyte = %01100000 'символ 1'GoSub tm1637_writeGoSub tm1637_stop
GoSub tm1637_startDatabyte = %11000000 'Начинать с 1 индикатораGoSub tm1637_writeDatabyte = $76 'символ 1GoSub tm1637_write'GoSub tm1637_stopDatabyte = $79 'символ 2GoSub tm1637_writeDatabyte = $38 'символ 3GoSub tm1637_writeDatabyte = $73 'символ 4GoSub tm1637_writeGoSub tm1637_stop
Bright = %10001111GoSub tm1637_bright
DelayMS 2000
GoTo main

tm1637_start:TM_Dio = 0                                     ;нога данных в землю-начало передачи по станддарту I2CDelayUS 2                                      ;задержка чтоб slave устройство отреагировалоTM_Clk = 0                                     ;клок на землю,технически с этого начинается функция передачи данныхReturn
tm1637_stop:                                   ;завершение передачи данныхTM_Dio = 0                                     ;Нога данных в зелмлю(клок в земле с предыдщей функции)DelayUS 2                                      ;задержка определяющея скорость (по ДШ до 600 кгц, тут 500)TM_Clk = 1                                     ;клок подтянутDelayUS 2                                      TM_Dio = 1                                     ;переход ноги данных с нуля в подтяг при высоком клоке - завершение                                               ;передачи по стандарту I2CReturn
tm1637_write:                                  ;передача данных  /DatabyteFor i = 7 To 0 Step -1                         ;8 разTM_Dio = GetBit Databyte,iTM_Clk = 1                                     ;клок подтянутDelayUS 2                                      ;формируем такт клокаTM_Clk = 0                                     ;клок в землю где он был сначалаNext i
TM_Dio =0                                      ;нога даты в землю чтоб, во в ремя АСК не спалить портTM_Clk = 1                                     ;клок подтянутDelayUS 3                                      ;формируем такт клокаTM_Clk = 0                                     ;клок в землю где он был сначалаReturn
tm1637_keyscan:                                ;опрос клавишGoSub tm1637_startDatabyte = 66                                  ;Команда считывания состояния клавишь  0b01000010GoSub tm1637_writeInput TM_Dio                                   ;Ставим порт как входOPTION_REG.7 = 0                               ;подтягиваем (pull-up)For i=7 To 0 Step -1                           ;8 разDelayUS 50                                     ;задержка на опрос (по ДШ до 250 (4мкс), меньше 40 не работает)SetBit Keydata,i                               ;Запись данныхNext iTM_Clk = 1                                     ;подтяг клокаDelayUS 2                                      ;формируем такт клокаTM_Clk = 0                                     ;клок в землю где он был сначалаTM_Clk = 1                                     ;клок подтянутDelayUS 2                                      ;в конце передачи байта такт клока по ДШTM_Clk = 0                                     ;клок в землеOutput TM_Dio                                  ;ставим порт обратно в состояние выходаGoSub tm1637_stopReturn
tm1637_bright:                                 ;Яркость  от 0b10001000  до 0b10001111 /BrightDatabyte = BrightGoSub tm1637_startGoSub tm1637_write    GoSub tm1637_stopReturn

Добавлено (27.01.2018, 11:59)
---------------------------------------------
извиняюсь вот код

Device 16F684
Xtal = 4

'-------------------------- Конфигурация программирования -------------------------------
Config FCMEN_OFF, IESO_OFF, CPD_OFF, CP_OFF, MCLRE_OFF, PWRTE_OFF, WDT_OFF, INTRC_OSC_NOCLKOUT, BOREN_OFF, BOD_OFF

'--------------------------------------Настройки портов----------------------------------
'             + ### -
'A5             ### Data            A0
'A4             ### Clk             A1
'A3        Mclr ###                 А2
'C5             ###                 С0
'C4             ### TM1637/Dio      С1
'C3             ### TM1637/Clk      С2

TRISA = %00000000                             'порты А
TRISC = %00000110                             'порты С

'OPTION_REG.7 = 0                             'Включаем подтягивающие резисторы
OPTION_REG.7 = 1                              'Отключим подтягивающие резисторы
Declare All_Digital = On                      'все порты цифровые

'---------------------------переменные --------------------------------------------------
Dim i As Byte
Dim Keydata As Byte
Dim Databyte As Byte
Dim Bright As Byte
Symbol TM_Dio = PORTC.1
Symbol TM_Clk = PORTC.2
'-------------------------главная программа----------------------------------------------
main:
'Databyte = %11000000 'Начинать с 1 индикатора
'Databyte = %11000001 'Начинать с 2 индикатора
'Databyte = %11000010 'Начинать с 3 индикатора
'Databyte = %11000011 'Начинать с 4 индикатора
'Databyte = %11000100 'Начинать с 5 индикатора
'Databyte = %11000101 'Начинать с 6 индикатора

'Databyte = %01000000 'Команда записи на дисплей

GoSub tm1637_start
Databyte = %01000000 'Команда записи на дисплей
GoSub tm1637_write
'Databyte = %01100000 'символ 1
'GoSub tm1637_write
GoSub tm1637_stop

GoSub tm1637_start
Databyte = %11000000 'Начинать с 1 индикатора
GoSub tm1637_write
Databyte = $76 'символ 1
GoSub tm1637_write
'GoSub tm1637_stop
Databyte = $79 'символ 2
GoSub tm1637_write
Databyte = $38 'символ 3
GoSub tm1637_write
Databyte = $73 'символ 4
GoSub tm1637_write
GoSub tm1637_stop

Bright = %10001111
GoSub tm1637_bright

DelayMS 2000

GoTo main

tm1637_start:
TM_Dio = 0                                     ;нога данных в землю-начало передачи по станддарту I2C
DelayUS 2                                      ;задержка чтоб slave устройство отреагировало
TM_Clk = 0                                     ;клок на землю,технически с этого начинается функция передачи данных
Return

tm1637_stop:                                   ;завершение передачи данных
TM_Dio = 0                                     ;Нога данных в зелмлю(клок в земле с предыдщей функции)
DelayUS 2                                      ;задержка определяющея скорость (по ДШ до 600 кгц, тут 500)
TM_Clk = 1                                     ;клок подтянут
DelayUS 2                                      
TM_Dio = 1                                     ;переход ноги данных с нуля в подтяг при высоком клоке - завершение
                                               ;передачи по стандарту I2C
Return

tm1637_write:                                  ;передача данных  /Databyte
For i = 7 To 0 Step -1                         ;8 раз
TM_Dio = GetBit Databyte,i
TM_Clk = 1                                     ;клок подтянут
DelayUS 2                                      ;формируем такт клока
TM_Clk = 0                                     ;клок в землю где он был сначала
Next i

TM_Dio =0                                      ;нога даты в землю чтоб, во в ремя АСК не спалить порт
TM_Clk = 1                                     ;клок подтянут
DelayUS 3                                      ;формируем такт клока
TM_Clk = 0                                     ;клок в землю где он был сначала
Return

tm1637_keyscan:                                ;опрос клавиш
GoSub tm1637_start
Databyte = 66                                  ;Команда считывания состояния клавишь  0b01000010
GoSub tm1637_write
Input TM_Dio                                   ;Ставим порт как вход
OPTION_REG.7 = 0                               ;подтягиваем (pull-up)
For i=7 To 0 Step -1                           ;8 раз
DelayUS 50                                     ;задержка на опрос (по ДШ до 250 (4мкс), меньше 40 не работает)
SetBit Keydata,i                               ;Запись данных
Next i
TM_Clk = 1                                     ;подтяг клока
DelayUS 2                                      ;формируем такт клока
TM_Clk = 0                                     ;клок в землю где он был сначала
TM_Clk = 1                                     ;клок подтянут
DelayUS 2                                      ;в конце передачи байта такт клока по ДШ
TM_Clk = 0                                     ;клок в земле
Output TM_Dio                                  ;ставим порт обратно в состояние выхода
GoSub tm1637_stop
Return

tm1637_bright:                                 ;Яркость  от 0b10001000  до 0b10001111 /Bright
Databyte = Bright
GoSub tm1637_start
GoSub tm1637_write    
GoSub tm1637_stop
Return

Matrix252005 Дата: Сб, 27.01.2018, 12:04  |                                                                                                                Сообщение # 3
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 713
Репутация: 43   ±
Замечания:   ±
На сайте с 12.10.2007

Статус: Offline

Я давно уже не работаю с ПИКами... Если не прав, то извиняюсь!!!

А разве 
TRISC = %00000110                             'порты С 
не говорит, что эти пина настраиваются как вход??? А Вам нужно как выход...


THE TRUTH IS OUT THERE.

С уважением, Николай.
Aleksey_174 Дата: Сб, 27.01.2018, 12:38  |                                                                                                                Сообщение # 4
Группа: Проверенные
Ранг:  Начал соображать
Сообщений: 20
Репутация: 0   ±
Замечания:   ±
На сайте с 22.01.2017

Статус: Offline

Цитата Matrix252005 ()
Я давно уже не работаю с ПИКами... Если не прав, то извиняюсь!!!А разве 
TRISC = %00000110                             'порты С 
не говорит, что эти пина настраиваются как вход??? А Вам нужно как выход...
Да ты прав, это я уже менял просто по разному пробовал, все равно результата нету

Добавлено (27.01.2018, 12:33)
---------------------------------------------
Поменял кое что, и он у меня моргать даж стал

tm1637_write:                                 
'For i = 7 To 0 Step -1                       
For i = 0 To 7
TM_Dio = GetBit Databyte,i
TM_Clk = 1                                   
DelayUS 2                                     
TM_Clk = 0                                   
Next i

TM_Dio =0                                   
TM_Clk = 1                                    
DelayUS 3                                     
TM_Clk = 0                                    
Return

Добавлено (27.01.2018, 12:38)
---------------------------------------------
Поменял кое что, и он у меня моргать даж стал

tm1637_write:                                 
'For i = 7 To 0 Step -1                       
For i = 0 To 7
TM_Dio = GetBit Databyte,i
TM_Clk = 1                                   
DelayUS 2                                     
TM_Clk = 0                                   
Next i

TM_Dio =0                                   
TM_Clk = 1                                    
DelayUS 3                                     
TM_Clk = 0                                    
Return

Matrix252005 Дата: Сб, 27.01.2018, 13:15  |                                                                                                                Сообщение # 5
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 713
Репутация: 43   ±
Замечания:   ±
На сайте с 12.10.2007

Статус: Offline

Еще кое что заметил у Вас!!!
А где у Вас происходит инит дисплея??

Добавлено (27.01.2018, 12:59)
---------------------------------------------
Вот гляньте тут: http://arduino.ru/forum....-228518

Добавлено (27.01.2018, 13:00)
---------------------------------------------
Должно быть что то похожее:
void tm1637_init(void)
{
    unsigned char i;

     tm1637_start();
     tm1637_writeByte(TM1637_DSC | _display_write | _auto_inc | _normal_mode);
     tm1637_stop();
     tm1637_start(); // это очистка 7-сегментного индикатора по желанию
     tm1637_writeByte(TM1637_ASC | _tm1637_r0); // Set the first address
     for(i = 0; i < _TM1637_DIGS_ATTACHED; i++) tm1637_writeByte(0x00); // Send data to clear
     tm1637_stop();
     tm1637_start();
     tm1637_writeByte(TM1637_DCC | _tm1637_disp_on | 0x03); // Open display, set brightness = 3          tm1637_stop();
}

Добавлено (27.01.2018, 13:14)
---------------------------------------------
Из этого получается:
tm1637_init:
    tm1637_start()
    tm1637_writeByte(0х80)
    tm1637_stop()

    tm1637_start()                           ' это очистка 7-сегментного индикатора по желанию
    tm1637_writeByte(0xC0)
    For i = 0 to 3
         tm1637_writeByte(0x00)     ' Send data to clear
    Next i
    tm1637_stop()
    
    tm1637_start();
    tm1637_writeByte(0x8B)            ' Open display, set brightness = 3            
    tm1637_stop();

Добавлено (27.01.2018, 13:15)
---------------------------------------------
Подправьте под себя и под стандарт протона... :))


THE TRUTH IS OUT THERE.

С уважением, Николай.

Сообщение отредактировал Matrix252005 - Сб, 27.01.2018, 13:06
Aleksey_174 Дата: Сб, 27.01.2018, 13:51  |                                                                                                                Сообщение # 6
Группа: Проверенные
Ранг:  Начал соображать
Сообщений: 20
Репутация: 0   ±
Замечания:   ±
На сайте с 22.01.2017

Статус: Offline

Пробовал по всякому, такое ощущение что команды идут совсем не те или не так, там написано что то про передачу может 0 идет подтяжкой, а 1 переводом порта в состояние входа.
На этом индикаторе висят резисторы по 10 ком к плюсу и кондеры еще 1000 пф.
Я как то случайно добился моргания его, пытаюсь ввести другие команды что то меняется моргает в других местах символы корявые.
Matrix252005 Дата: Сб, 27.01.2018, 14:04  |                                                                                                                Сообщение # 7
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 713
Репутация: 43   ±
Замечания:   ±
На сайте с 12.10.2007

Статус: Offline

Значит перепроверьте еще все раз... А именно процедуру:
tm1637_write:                                  ;передача данных  /Databyte

так же покажите процедуры стоп, старт и новую tm1637_write


THE TRUTH IS OUT THERE.

С уважением, Николай.
Aleksey_174 Дата: Сб, 27.01.2018, 14:50  |                                                                                                                Сообщение # 8
Группа: Проверенные
Ранг:  Начал соображать
Сообщений: 20
Репутация: 0   ±
Замечания:   ±
На сайте с 22.01.2017

Статус: Offline

вот с этим кодом моргнут кракозябры меньше чем на пол секунды потом через секунду снова

main:

GoSub tm1637_start
Databyte = %10101010 'здесь без раздницы что писать
GoSub tm1637_write
GoSub tm1637_stop

GoSub tm1637_start
Databyte = %10101010 'здесь без раздницы что писать
GoSub tm1637_write
GoSub tm1637_stop

Bright = %10001111   
GoSub tm1637_bright

DelayMS 1000
GoTo main

tm1637_start:
TM_Dio = 0                                   
DelayUS 2                                     
TM_Clk = 0                                   
Return

tm1637_stop:                                  
TM_Dio = 0                                   
DelayUS 2                                      
TM_Clk = 1                                  
DelayUS 2                                      
TM_Dio = 1                                    
Return

tm1637_write:                                  
For i = 0 To 7
TM_Dio = GetBit Databyte,i
TM_Clk = 1                                 
DelayUS 2                                     
TM_Clk = 0                                   
Next i
TM_Dio =0                                     
TM_Clk = 1                                    
DelayUS 2                                    
TM_Clk = 0                                    
Return

tm1637_bright:                                
Databyte = Bright
GoSub tm1637_start
GoSub tm1637_write    
GoSub tm1637_stop
Return
Matrix252005 Дата: Сб, 27.01.2018, 15:07  |                                                                                                                Сообщение # 9
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 713
Репутация: 43   ±
Замечания:   ±
На сайте с 12.10.2007

Статус: Offline

Попробуйте так:
GoSub tm1637_start
Databyte = $80
GoSub tm1637_write
GoSub tm1637_stop

    GoSub tm1637_start                           ' это очистка 7-сегментного индикатора по желанию
    Databyte = $C0
    GoSub tm1637_write
    For i = 0 to 3
        Databyte = $00
        GoSub tm1637_write
    Next i
    GoSub tm1637_stop
    
    GoSub tm1637_start
    Databyte = $8B
    GoSub tm1637_write            ' Open display, set brightness = 3            
    GoSub tm1637_stop

tm1637_start:
    TM_Dio = 0                                   
    TM_Clk = 0                                   
Return

tm1637_write:                                  
    For i = 0 To 7
        if (Databyte and 0x01) = 1 then
            TM_Dio = 1
        else
            TM_Dio  = 0
        end if
        
        Databyte = Databyte >> 1

        TM_Clk = 1                                 
        DelayUS 2                                     
        TM_Clk = 0                                   
    Next i

    TM_Clk = 1                                    
    DelayUS 2                                    
    TM_Clk = 0                                    
Return

tm1637_stop:                                  
    TM_Dio = 0                                   
    DelayUS 2                                      
    TM_Clk = 1                                  
    DelayUS 2                                      
    TM_Dio = 1                                    
Return


THE TRUTH IS OUT THERE.

С уважением, Николай.
Aleksey_174 Дата: Сб, 27.01.2018, 15:24  |                                                                                                                Сообщение # 10
Группа: Проверенные
Ранг:  Начал соображать
Сообщений: 20
Репутация: 0   ±
Замечания:   ±
На сайте с 22.01.2017

Статус: Offline

так вообще ничего не показывает
если конешно этод код я правильно перевожу
 For i = 0 To 7
        if (Databyte and 0x01) = 1 then
            TM_Dio = 1
        else 
            TM_Dio  = 0
        end if
на бейсике так разбивает на биты
TM_Dio = GetBit Databyte,i
Matrix252005 Дата: Сб, 27.01.2018, 15:32  |                                                                                                                Сообщение # 11
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 713
Репутация: 43   ±
Замечания:   ±
На сайте с 12.10.2007

Статус: Offline

У Вас есть осциллограф или логер??? Встанте на выхода МК и гляньте что у него там...

Можно так, а можно так.


THE TRUTH IS OUT THERE.

С уважением, Николай.
Aleksey_174 Дата: Сб, 27.01.2018, 15:45  |                                                                                                                Сообщение # 12
Группа: Проверенные
Ранг:  Начал соображать
Сообщений: 20
Репутация: 0   ±
Замечания:   ±
На сайте с 22.01.2017

Статус: Offline

да нет к сожалению осциллограф только старенький аналоговый
что то после твоего кода индикатор даж мигать перестал на моем коде
другие мигают
Matrix252005 Дата: Сб, 27.01.2018, 15:48  |                                                                                                                Сообщение # 13
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 713
Репутация: 43   ±
Замечания:   ±
На сайте с 12.10.2007

Статус: Offline

Попробуйте подключить светики на выходы TM_Dio и TM_Clk и при отладке (пошагово) гляньте, будет ли мигать светики или нет.

THE TRUTH IS OUT THERE.

С уважением, Николай.
Aleksey_174 Дата: Сб, 27.01.2018, 16:01  |                                                                                                                Сообщение # 14
Группа: Проверенные
Ранг:  Начал соображать
Сообщений: 20
Репутация: 0   ±
Замечания:   ±
На сайте с 22.01.2017

Статус: Offline

светодиоды горят все время когда увеличиваю delayus 2 на delayms 5, то становится видно мерцание
а на дисплее больше цифр становится моргать с моим кодом
Matrix252005 Дата: Сб, 27.01.2018, 16:02  |                                                                                                                Сообщение # 15
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 713
Репутация: 43   ±
Замечания:   ±
На сайте с 12.10.2007

Статус: Offline

Выложите весь проект, сейчас поставлю протон и гляну что у Вас...

THE TRUTH IS OUT THERE.

С уважением, Николай.
Форум Picbasic.ru » Программирование МК » Proton PicBasic » Индикатор TM1637 (Управление индикатором без библиотек)
  • Страница 1 из 3
  • 1
  • 2
  • 3
  • »
Поиск: