Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Вопросы начинающих

Вопросы начинающих Прежде чем задать вопрос, стоит воспользоваться поиском

Ответ
 
Опции темы Опции просмотра
Старый 24.11.2010, 22:12   #1
DanilinS
Junior Member
 
Регистрация: 10.08.2010
Возраст: 49
Сообщений: 4
Вес репутации: 100/0
DanilinS will become famous soon enoughDanilinS will become famous soon enough
По умолчанию Помогите связать PIC 16F688 и индикатор G77E0

Сам я пока начинаю осваивать ПИК контроллеры, а потому сразу не бейте.
Собрал макетку, осваиваю чип. Помигать светодиодом, опросить кнопочку ... Всё нормально получалось. С поправкой на кривизну рук
Но возникла необходимость запустить в работу индикатор G77E0. Сам индикатор ЖКИ 128 x 64 (морозостойкий аналог TIC77), COG, PCF8535, I2C, -30..+60°С, 3..5 V, габ. 72.5 x 50.8, угол 11:00, черный, позитив, полупропускание, дополнительные крепежные выводы.

Пишу на JAL V2. Это простенький паскалеподобный язык. Так как PIC 16F688 не содержит аппаратный I2C, то пришлось задействовать стандартную софтовую библиотеку. Скопировал инициализацию из даташита на PCF8535. И тишина ... Индикатор совершенно не подает признаков жизни. Пробовал адреса менять (78 7A 7C 7E) - без результата. На выводе VLSD - 0 вольт. Как будто вообще кристалл не инициализировался и внутренний преобразователь не стартовал.
Сама прога:
Код:
--
include 16f688                    -- target PICmicro
--
pragma target clock 4_000_000
pragma target OSC INTOSC_NOCLKOUT
pragma target WDT disabled
pragma target PWRTE disabled
pragma target MCLR external
pragma target BROWNOUT disabled
pragma target CPD disabled
pragma target CP disabled
--
alias i2c_scl            is pin_c3
alias i2c_scl_direction  is pin_c3_direction
alias i2c_sda            is pin_c4
alias i2c_sda_direction  is pin_c4_direction

const word _i2c_bus_speed = 1 ; * 100kHz
const bit _i2c_level = true   ; i2c levels (not SMB)
const _i2c_scl_timeout = 100  -- units are in bit-times.
include i2c_software
include delay
--
enable_digital_io()           -- disable analog I/O (if any)
alias led is pin_A0
pin_A0_direction = output
--  78 7A 7C 7E
const LCD_ADDR = 0x78
--

        i2c_initialize()
        i2c_start()
        i2c_transmit_byte(LCD_ADDR)
        i2c_transmit_byte(0b00000000)  --2
        i2c_transmit_byte(0x00)        --3
        i2c_transmit_byte(0b00000001)  --4
        i2c_transmit_byte(0b00010000)  --5
        i2c_transmit_byte(0b00001110)  --6
        i2c_transmit_byte(0b00010010)  --7
        i2c_transmit_byte(0b00000110)  --8
        i2c_transmit_byte(0b10000100)  --9
        i2c_transmit_byte(0b00000001)  --10
        i2c_transmit_byte(0b00001101)  --11
        i2c_transmit_byte(0b00001001)  --12
        i2c_transmit_byte(0b00010010)  --13
        i2c_transmit_byte(0b10101000)  --14
        i2c_transmit_byte(0b00000111)  --15
        i2c_restart()
        i2c_transmit_byte(LCD_ADDR)    --17
        i2c_transmit_byte(0b01000000)  --18
        i2c_transmit_byte(0b00011111)  --19
        i2c_transmit_byte(0b00000101)  --20
        i2c_transmit_byte(0b00000111)  --21
        i2c_transmit_byte(0b00000000)  --22
        i2c_transmit_byte(0b00011111)  --23
        i2c_transmit_byte(0b00000100)  --24
        i2c_transmit_byte(0b00011111)  --25
        i2c_stop()
--
forever loop
led = on
_usec_delay(100000)
led = off
_usec_delay(100000)
end loop
На всякий случай реализация I2Cбиблиотеки:
Код:
include delay

-- prototypes
procedure  _i2c_wait()
procedure _i2c_bit_in(bit out x)
procedure _i2c_bit_out(bit in x)
procedure i2c_start()
procedure i2c_stop()

-- ------------------------------------------------------------------------
-- i2c_initialize - initialize the software i2c bus
-- ------------------------------------------------------------------------
-- The output latch values are always low,
-- the lines are switched open-collector fashion by
-- manipulating the direction registers.
-- ------------------------------------------------------------------------
procedure i2c_initialize() is
   i2c_scl              = low
   i2c_sda              = low
   i2c_scl_direction    = high
   i2c_sda_direction    = high

   -- Clear the bus, regardless the state it is in.
   --
   -- This code is based on atmel AT24C32C datasheet, page 6
   -- http://www.atmel.com/dyn/resources/prod_documents/doc5298.pdf
   --
   i2c_start()
   for 9 loop
      _i2c_bit_out(1);
   end loop
   i2c_start()
   i2c_stop()

end procedure

-- ------------------------------------------------------------------------
-- i2c_start - output a start condition
-- ------------------------------------------------------------------------
-- ------------------------------------------------------------------------
procedure i2c_start() is
   _i2c_wait()
   i2c_sda_direction = high       -- data high
   _i2c_wait()
   i2c_scl_direction = high       -- clock high
   _i2c_wait()
   i2c_sda_direction = low        -- data low
   _i2c_wait()
   i2c_scl_direction = low        -- clock low
   _i2c_wait()
end procedure

-- ------------------------------------------------------------------------
-- i2c_restart - output a (re)start condition
-- ------------------------------------------------------------------------
-- A restart is a start without a previous stop.
-- This procedure is provided as part of the API to maintain compatibility
-- with the i2c hardware master lib.
-- ------------------------------------------------------------------------
procedure i2c_restart() is
   i2c_start()
end procedure

-- ------------------------------------------------------------------------
-- i2c_stop - output a stop condition
-- ------------------------------------------------------------------------
-- ------------------------------------------------------------------------
procedure i2c_stop() is
   _i2c_wait()
   i2c_sda_direction   = low        -- data low
   _i2c_wait()
   i2c_scl_direction   = low        -- clock low
   _i2c_wait()
   i2c_scl_direction   = high       -- clock high
   _i2c_wait()
   i2c_sda_direction   = high       -- data high
   _i2c_wait()
end procedure

-- ------------------------------------------------------------------------
-- i2c_transmit_byte - output one byte
-- ------------------------------------------------------------------------
-- return true = okay, false = no ack received
-- ------------------------------------------------------------------------
function i2c_transmit_byte( byte in x ) return bit is
   var bit b at x : 7
   var bit r

   for 8 loop
      _i2c_bit_out( b )
      x = x << 1
   end loop

   -- wait for an ack condition
   ;procedure  _i2c_wait()_ack is
   _i2c_wait()
   i2c_sda_direction    = high       -- data open
   _i2c_wait()
   i2c_scl_direction    = high       -- clock high
   _i2c_wait()
   if (defined(_i2c_scl_timeout) == true) then
      for _i2c_scl_timeout loop
         if i2c_scl == high then
            exit loop
         end if
         _i2c_wait()
      end loop
   else
      while i2c_scl == low loop
      end loop                     -- wait for slow slave
   end if

   -- check for the slave's acknowledge
   r = ! i2c_sda
   _i2c_wait()
   i2c_scl_direction    = low        -- clock low
   _i2c_wait()

   return r -- true = okay, false = no ack received
end function

-- ------------------------------------------------------------------------
-- i2c_receive_byte - read one byte
-- ------------------------------------------------------------------------
-- The ACK flag indicated if the byte read must be acked.
--
-- In general, all bytes read by the master are acked, except the last one.
-- Failing to NACK the last byte read will give unpredictable results.
-- (Often it will provide repeatable sequences, where one out of 2 to 4 of
-- the reads from a specific device is correct. You are warned!)
-- ------------------------------------------------------------------------
function i2c_receive_byte( bit in ack) return byte is
   var byte ret

   var bit b at ret : 0
   for 8 loop
      ret = ret << 1
      _i2c_bit_in( b )
   end loop

   if (ack) then
      _i2c_bit_out( low ) -- ack
   else
      _i2c_bit_out( high ) -- nack
   end if

   return ret

end function

-- ------------------------------------------------------------------------
-- ------------------------------------------------------------------------
-- internal
-- ------------------------------------------------------------------------
-- ------------------------------------------------------------------------

-- ------------------------------------------------------------------------
-- _i2c_wait - wait for a change to settle (for internal use only)
-- ------------------------------------------------------------------------
-- The delay is determined by i2c_bus_speed and is 1/4 of the cycle time.
-- Given the delay resolution of 1 us and all actions required by
-- i2c_software routines, the actual bus speed will be lower then the
-- configured maximum.
-- ------------------------------------------------------------------------
procedure  _i2c_wait() is

   if _i2c_bus_speed == 10 then
      ; i2c_1MHz
      delay_1us()
      return
   elsif _i2c_bus_speed == 4  then
      ; i2c_400kHz
      delay_2us()
      return
   else
      ; i2c_100kHz
      delay_5us()
      return
   end if

end procedure

-- ------------------------------------------------------------------------
-- _i2c_bit_out- output a single bit (for internal use only)
-- ------------------------------------------------------------------------
-- ------------------------------------------------------------------------
procedure _i2c_bit_out(bit in x) is

   i2c_sda_direction   = x          -- high data bit
   _i2c_wait()
   i2c_scl_direction  = high        -- clock high
   _i2c_wait()
   if (defined(_i2c_scl_timeout) == true) then
      for _i2c_scl_timeout loop
         if i2c_scl == high then
            exit loop
         end if
         _i2c_wait()
      end loop
   else
      while i2c_scl == low loop
      end loop                     -- wait for slow slave
   end if
   _i2c_wait()
   i2c_scl_direction  = low         -- clock low
   _i2c_wait()

end procedure

-- ------------------------------------------------------------------------
-- _i2c_bit_in- input a single bit (for internal use only)
-- ------------------------------------------------------------------------
-- ------------------------------------------------------------------------
procedure _i2c_bit_in(bit out x) is
;   _i2c_wait()
   i2c_sda_direction   = high -- data open
   _i2c_wait()
   i2c_scl_direction  = high  -- clock high
   _i2c_wait()
   if (defined(_i2c_scl_timeout) == true) then
      for _i2c_scl_timeout loop
         if i2c_scl == high then
            exit loop
         end if
         _i2c_wait()
      end loop
   else
      while i2c_scl == low loop
      end loop                     -- wait for slow slave
   end if
   _i2c_wait()
   x = i2c_sda                -- sample data
   _i2c_wait()
   i2c_scl_direction  = low   -- clock low
   _i2c_wait()
end procedure
В основном цикле мигает светодиод как "контролька" того, что проц работает.

Сам PIC тактируется внутренним генератором. На выводе 13 (А0) - светодиод на + через 500 ом. Вывод 6 (С4) - SDA - нога 3 индикатора.
Вывод 7 (С3) - SCL - нога 1 индикатора. Оба сигнала SDA и SCL притянуты к + через сопротивления 10к.

Маркировка G77E0 (если не врет даташит):
1) SCL - подтяжка и на ПИК
2) SA (GND) - посажен на землю
3) SDA - подтяжка и на ПИК
4) VDD(OSC) - посажен на +
5) /RES - посажен на +
6) VLCD = должен конденсатор на землю, но пока висит в воздухе.

Фотки смогу выложить только завтра.

А так - светодиод мигает, а индикатор чист. Пробовал разные варианты иниацилизации (в т.ч. с этого форума) - всё без толку. Мигает светодиод. На VLCD=0. Шина I2C под потенциалом 5В. Замыканий монтажа нет. ПИК шил с верификацией на нормальном программаторе. Прогнал программу на симуляторе - выводы шины I2C дергает исправно.

В аттаче - выходной бинарник + АСМ файл промежуточной компиляции.
Вложения
Тип файла: rar 16f688_View1.rar (3.4 Кб, 10 просмотров)
DanilinS вне форума   Ответить с цитированием
Старый 27.11.2010, 12:14   #2
Greg
Super Moderator
 
Регистрация: 25.02.2007
Адрес: Moscow, ODBS
Сообщений: 7,073
Вес репутации: 6158/182
Greg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond repute
По умолчанию Re: Помогите связать PIC 16F688 и индикатор G77E0

Цитата:
Сообщение от DanilinS Посмотреть сообщение
Сам я пока начинаю осваивать ПИК контроллеры, а потому сразу не бейте.
Собрал макетку, осваиваю чип. Помигать светодиодом, опросить кнопочку ... Всё нормально получалось. С поправкой на кривизну рук
Но возникла необходимость запустить в работу индикатор G77E0. Сам индикатор ЖКИ 128 x 64 (морозостойкий аналог TIC77), COG, PCF8535, I2C, -30..+60°С, 3..5 V, габ. 72.5 x 50.8, угол 11:00, черный, позитив, полупропускание, дополнительные крепежные выводы.
вам надо потренироваться с интерфейсом иис. подключите какую-нибудь простенькую память (типа at24c0x) и попробуйте записывать-считывать данные. у вас там проблемный инструментарий, разбираться придётся самому.
Greg вне форума   Ответить с цитированием
Старый 27.11.2010, 14:38   #3
Марк
Senior Member
 
Аватар для Марк
 
Регистрация: 18.08.2007
Адрес: Московская область
Возраст: 61
Сообщений: 3,544
Вес репутации: 4234/126
Марк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond repute
По умолчанию Re: Помогите связать PIC 16F688 и индикатор G77E0

Цитата:
Сообщение от DanilinS Посмотреть сообщение
........... Так как PIC 16F688 не содержит аппаратный I2C, то пришлось задействовать стандартную софтовую библиотеку. Скопировал инициализацию из даташита на PCF8535. И тишина ... Индикатор совершенно не подает признаков жизни. Пробовал адреса менять (78 7A 7C 7E) - без результата. На выводе VLSD - 0 вольт. Как будто вообще кристалл не инициализировался и внутренний преобразователь не стартовал.
.............

................

Маркировка G77E0 (если не врет даташит):
1) SCL - подтяжка и на ПИК
2) SA (GND) - посажен на землю
3) SDA - подтяжка и на ПИК
4) VDD(OSC) - посажен на +
5) /RES - посажен на +
6) VLCD = должен конденсатор на землю, но пока висит в воздухе.

Фотки смогу выложить только завтра.
Это Вы так прикалываетесь?
Как, позвольте, Вы собирались получить напряжение на матрицу, если сам конденсатор внутреннего умножителя Вы "пока не подключили"?
Может Вы и питание на МК "пока не подавали"? И вообще пока ничего не паяли?
Марк вне форума   Ответить с цитированием
Старый 30.11.2010, 11:11   #4
DanilinS
Junior Member
 
Регистрация: 10.08.2010
Возраст: 49
Сообщений: 4
Вес репутации: 100/0
DanilinS will become famous soon enoughDanilinS will become famous soon enough
По умолчанию Re: Помогите связать PIC 16F688 и индикатор G77E0

Цитата:
Сообщение от Марк Посмотреть сообщение
Это Вы так прикалываетесь?
Как, позвольте, Вы собирались получить напряжение на матрицу, если сам конденсатор внутреннего умножителя Вы "пока не подключили"?
Может Вы и питание на МК "пока не подавали"? И вообще пока ничего не паяли?
А мы не путаем внутренние конденсаторы умножителя и внешний конденсатор для сглаживания пульсаций умножителя?
А насчет "не паяли" - не поверишь, не паял. Собрал на плате для монтажа без пайки ( у меня EIC-402).

Вчера удалось "засветить" индикатор. Все косяки росли из инициализации. Пробовал строки из разных источников - ничего не получалось. Открыл мануал на PCF8535 и ручками набил инициализацию из "Programming example for PCF8535". И нидикатор "засветился".
Теперь изучаю режимы отображения, адресацию и вывод изображения. Когда индикатор ожил - уже проще.
По поводу конденсатора на линии VLCD: в посте http://www.microchip.su/showthread.p...highlight=VLCD ясно указывалось: "1. Отключите Vlcd. Желательно повесить кондер к земле, но можете и так оставить."
После того, как индикатор ""заработал" попробовал поэкспериментировать с конденсатором. Индикатор нормально работал как с ним так и без него. Т.е. его можно и не ставить (правда народ жаловался, что без конденсатора падала контрастность при выводе большого количества информации на экран. Я не заметил. Может плохо смотрел)
DanilinS вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подключить 7-сегментный индикатор к PIC Vovka Общетехнические вопросы 51 31.08.2010 17:03
Помогите подключить ДОЗУ к PIC 16f874 claymanm Вопросы начинающих 7 04.12.2008 13:11
Помогите с прошивкой на PIC 16F628A на данный дескремблер SSAVI. eler Продукция MICROCHIP 0 25.07.2008 13:28
Помогите пожалуйста с зависанием PIC djdiablo Продукция MICROCHIP 4 19.12.2007 11:10
Помогите с программой для PIC контроллера UA3BL Продукция MICROCHIP 14 20.05.2007 22:03


Часовой пояс GMT +3, время: 03:27.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd. Перевод: zCarot