Например TDA7294

Форум РадиоКот • Просмотр темы - PIC12F675: диалог с расширителем PCF8574 через i2c (asm)
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Пт май 16, 2025 03:31:49

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: PIC12F675: диалог с расширителем PCF8574 через i2c (asm)
СообщениеДобавлено: Пт янв 15, 2016 12:04:19 
Родился

Зарегистрирован: Пт янв 15, 2016 11:59:01
Сообщений: 8
Рейтинг сообщения: 0
Задача простая:
есть пик12, он мастер, к нему подключен расширитель. В разрез соединения подключен I2C Debugger.
Необходимо используя протокол i2c снять данные с расширителя портов и записать их в регистр пика. Дебагер в данном случае будет гарантом того, что мы общаемся по протоколу i2c.

Выглядит схема вот так:
Изображение


Я прочитал про сам протокол, понял что мне надо выводить тактовую частоту на SCL и используя её как несущую передавать данные по SDA. Прочёл про то как происходит обмен данными, про стартовый и стоповый биты, про подтверждение/непотверждение, про чтение и запись.

В общем к делу я подошёл немного по-тупому. Что я сделал? Написал собственно следующие подпрограммы:
- отправления стартового бита
- отправления данных (адрес слейва или саму дату)
- считывания с порта сигналов и сохранения её в регистре (сохранение даты с канала SDA)
- отправления подтверждения
- отправления стопового бита

Короче, я запустил всё это и попытался сделать запрос данных с PCF8574 и ничего в ответ не получил. Кроме того даже I2C Debugger не дал ничего кроме вопросов:
Изображение
Ну а вот сами сигналы:
Изображение
Вот они же ближе:
Изображение

В общем я пока пинаю на то, что у меня есть какой-то рассинхрон по тактовой частоте. Но чёрт возьми: почему стартовый бит-то не читается? я сделал прямо как в доках от филипса.
Вот стартовый бит из книжки по микрочипу:
Изображение
Вот мой стартовый бит:
Изображение
Они похожи.
Справа от линии я настраивал порты МК, слева от линии уже работали подпрограммы и вроде как по спаду должно было прийти "S" - стартовый сигнал на дебаггер, но его там нет.

В общем: что вы думаете? куда мне идти? я уже думаю блин начать просто компоновать пакет и запускать таймер который выдаёт импульсы такта на SCL, и там как-нить по тактам таймера выпихивать пакет на линию SDA (но едрён батон, как я вот читать буду - я пока хрен знаю).

Ну а код у меня написан из расчёта машинных тактов - может в этом и косяк?
Сам код:
Код:
;==============
; Main.asm file generated by New Project wizard
;
; Created:   Чт янв 14 2016
; Processor: PIC12F675
; Compiler:  MPASM (Proteus)
;==============
 
;==============
; DEFINITIONS
;==============
 
#include p12f675.inc                ; Include register definition file
 
__CONFIG _INTRC_OSC_CLKOUT & _MCLRE_OFF
 
      ;_INTRC_OSC_CLKOUT - INTOSC oscillator: CLKOUT function on GP4/OSC2/CLKOUT pin, I/O function on GP5/OSC1/CLKIN
      ;_WDT_OFF - WDT disabled
      ;_MCLRE_OFF - GP3/MCLR pin function is digital I/O, MCLR internally tied to VDD
     
;настройки для I2C
#define     slave1  b'01001111'
#define     scl GPIO,1      ;Clock I2C line
#define     sda GPIO,2      ;Data I2C line
 
;Регистры для шины I2C
cblock  020h            ;БАНК памяти 0
     SLAVE_ADDR
     MASTER_input_DATA
     MASTER_output_DATA
     temp           ;Счётчик битов
endc
 
 
;==============
; RESET and INTERRUPT VECTORS
;==============
 
      ; Reset Vector
RST   code  0x0
      goto  Start
 
;==============
; CODE INTERRUPT
;==============
     
;INT    code  0x0004
 ;     goto interrupt
  ;    retfie
 
;==============
; CODE SEGMENT
;==============
 
PGM   code
Start
      ;гп0 - вход/выход семисегментника
      ;гп1 - вход/выход семисегментника
      ;гп2 - вход/выход I2C / sda
      ;гп3 - вход прерывания клавиатуры
      ;гп4 - выход такта I2C / scl
      ;гп5 - выход светодиода
     
      ;------ настройка портов GPIO
     
        ; перешли в банк памяти 0
        bcf STATUS, RP0 ;установить бит RP0 в регистре STATUS в ноль
                ;(непосредственная адресация в банке памяти 00 = банк 0 000h-07Fh)
        ; обнуление портов и/о
        clrf GPIO       ;установка в ноль регистра GPIO начиная с 7 бита:
                ;хх/000000
 
        ; отключение выходов компаратора на ногах пика
        movlw B'00000111'
        movwf CMCON     ;из аккумулятора переслать содержимое (???) в CMCON
                ;видимо тут переданы нули - хх/000(хз чё)/000(компораторы выключены)
       
        ;перешли в банк памяти 1
        bsf STATUS, RP0 ;установить бит RP0 в регистре STATUS в единицу
                ;(непосредственная адресация в банке памяти 01 = банк 0 80h-FFh)
        ; DONT USE ANY PINS AS ANALOGUE, ONLY DIGITAL
        MOVLW 0
        MOVWF ANSEL
        ; настройка ввода/вывода портов
        movlw B'00001000'   ;записать в аккумулятор 00001000
        movwf TRISIO    ;из аккумулятора переслать содержимое (00001000) в TRISIO
                ;конфигурируем 6ти разрядный порт GPIО отдельно на каждый GP0,...,GP5
                ;0 - канал работает на выход, 1 - на вход
                ;'хх001000' - GP5-вsх/GP4-вых/GP3-вх(всегда только вход)/GP2-вых/GP1-вых/GP0-вsх
        ;GP4 настраивается как вывод тактового сигнала командой __CONFIG
 
      ;------ настройка прерываний
     
        ; разрешить прерывание на входе GP3
        ;movlw B'00001000'  ;маска для допуска прерывания на GP3
        ;movwf IOCB     ;установили маску в регистр - разрешили прерывание на GP3
        ; разрешение прерываний на GPIO и вообще
        ;movlw B'10001000'  ;маска для допуска глобальных прерываний и прерываний по изменению сигнала на GPIO
        ;movwf INTCON   ;становили маску в регистр
       
        movlw 0
        movwf slave1
        movwf MASTER_input_DATA
        movwf MASTER_output_DATA
 
Loop
       bsf sda
       bsf scl
       goto interrupt_gpie
 
     
;==============
; обработка прерываний
;==============
 
;interrupt 
;       btfsc INTCON, GPIF
;          goto interrupt_gpie
;       return
         
interrupt_gpie
        ;прерывание по гп3 - ввели цифру на клавиатуре, надо её получить и сохранить
        movlw   slave1          ;в аккумулятор записать 8=00001000
        movwf   SLAVE_ADDR
        call    Read_I2C
        return
 
;==============
; библиотека I2C
;==============
     
Read_I2C   
        movlw   8           ;в аккумулятор записать счётчик до семи
        movwf   temp
        call    Send_Start_Bit_I2C  ;1. Послать стартовую последовательность
        call    Choose_Slave_I2C    ;2. Послать адрес устройства к которому обращаемся с нулевым битом чтения/записи (четный адрес)
        call    Wait_ack_I2C        ;3
        call    Read_data_I2C
        call    Send_NACK_Bit_I2C
        call    Send_Stop_Bit_I2C
       
        return
       
       
Choose_Slave_I2C
    metka   btfsc   SLAVE_ADDR,7
        bsf sda
        nop
        bsf scl
        rlf SLAVE_ADDR,1
        nop
        nop
        nop
        bcf scl
        bcf sda
        decfsz  temp,1
        goto metka
        return
       
Wait_ack_I2C   
        bsf scl
        nop
        movlw   7           ;в аккумулятор записать счётчик до семи
        movwf   temp
        nop
        bcf scl
        bcf sda
        return
       
Read_data_I2C   
    metka2  btfsc   sda
        bsf MASTER_input_DATA,1
        nop
        bsf scl
        rrf MASTER_input_DATA,1
        nop
        nop
        nop
        bcf scl
        bcf sda
        decfsz  temp,1
        goto metka2
        nop
        return
       
Send_NACK_Bit_I2C
        nop
        nop
        nop
        bsf sda;
        bsf scl
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        bcf scl
        bcf sda
        return
   
Send_Stop_Bit_I2C
        bsf scl;
        bsf sda
        nop
        nop
        return
       
       
Send_Start_Bit_I2C 
        bsf sda
        bsf scl
        nop
        bcf scl
        bcf sda
        return 
     
;==============
      END


Может есть какой-то путь по-проще?


Вложения:
метода.PNG [63.31 KiB]
Скачиваний: 673
старт бит.PNG [4.45 KiB]
Скачиваний: 546
сигнал ближе.PNG [15.68 KiB]
Скачиваний: 653
сигнал.PNG [9.45 KiB]
Скачиваний: 526
схема.PNG [28.14 KiB]
Скачиваний: 687


Последний раз редактировалось Gudsaf Пт янв 15, 2016 12:13:13, всего редактировалось 1 раз.
Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: PIC12F675: диалог с расширителем PCF8574 через i2c (asm)
СообщениеДобавлено: Пт янв 15, 2016 12:07:57 
Модератор
Аватар пользователя

Карма: 120
Рейтинг сообщений: 1088
Зарегистрирован: Пн дек 08, 2008 19:28:04
Сообщений: 22812
Откуда: 10км от Москвы на Север
Рейтинг сообщения: 0
Что-то картинки не открываются ...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: PIC12F675: диалог с расширителем PCF8574 через i2c (asm)
СообщениеДобавлено: Пт янв 15, 2016 12:10:00 
Родился

Зарегистрирован: Пт янв 15, 2016 11:59:01
Сообщений: 8
Рейтинг сообщения: 0
Borodach писал(а):
Что-то картинки не открываются ...

Может просто скинуть проект? Странно у меня показывает..


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: PIC12F675: диалог с расширителем PCF8574 через i2c (asm)
СообщениеДобавлено: Пт янв 15, 2016 12:13:48 
Родился

Зарегистрирован: Пт янв 15, 2016 11:59:01
Сообщений: 8
Рейтинг сообщения: 0
Borodach писал(а):
Что-то картинки не открываются ...

Доложил картинки в сообщение


Вернуться наверх
 
Открыт интернет-магазин MEAN WELL.Market – весь ассортимент MEAN WELL, выгодные цены

Открыта удобная площадка с выгодными ценами, поставляющая весь ассортимент продукции, производимой компанией MEAN WELL – от завоевавших популярность и известных на рынке изделий до новинок. MEAN WELL.Market предоставляет гарантийную и сервисную поддержку, удобный подбор продукции, оперативную доставку по России. На сайте интернет-магазина посетители смогут найти обзоры, интересные статьи о применении, максимальный объем технических сведений.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: PIC12F675: диалог с расширителем PCF8574 через i2c (asm)
СообщениеДобавлено: Пт янв 15, 2016 12:30:39 
Друг Кота
Аватар пользователя

Карма: 90
Рейтинг сообщений: 1859
Зарегистрирован: Чт сен 12, 2013 00:54:12
Сообщений: 4119
Откуда: ЗаМКАДье. Там, где ЦУП
Рейтинг сообщения: 0
Медали: 5
Получил миской по аватаре (5)
Gudsaf писал(а):
...Я прочитал про сам протокол, понял что мне надо выводить тактовую частоту на SCL и используя её как несущую передавать данные по SDA. Прочёл про то как происходит обмен данными, про стартовый и стоповый биты, про подтверждение/непотверждение, про чтение и запись.
...
В общем: что вы думаете? куда мне идти?
...
Может есть какой-то путь по-проще?

Есть.
Читать pdf на PCF8574 и увидеть минимально рекомендованные времена при общении по I2C.
Это:
Спойлер
Код:
Send_Start_Bit_I2C 
        bsf sda
        bsf scl
        nop
        bcf scl
        bcf sda
        return 

работать не будет при Fosc (PIC12F675) =4MHz.


Вернуться наверх
 
LED-драйверы MOSO - надежные решения для индустриальных приложений

Продукция MOSO предназначена в основном для индустриальных приложений, использует инновационные решения на основе более 200 собственных патентов для силовой электроники и соответствует международным стандартам. LED-драйверы MOSO применяются в системах наружного освещения разных отраслей, включая промышленность, сельское хозяйство, транспорт и железную дорогу. В ряде серий реализована возможность дистанционного контроля и программирования работы по заданному сценарию. Разберем решения MOSO подробнее>>
Не в сети
 Заголовок сообщения: Re: PIC12F675: диалог с расширителем PCF8574 через i2c (asm)
СообщениеДобавлено: Пт янв 15, 2016 22:01:22 
Родился

Зарегистрирован: Пт янв 15, 2016 11:59:01
Сообщений: 8
Рейтинг сообщения: 0
ага, значит только 100 кГц) хорошо сейчас подумаем

А по сути я пока думаю над таймером: можно же как-то сделать прерывание по таймеру? Чтобы, к примеру, начался счёт таймера, пока счёт идёт - мы выполняем какой-то другой код, потом как таймер просчитал до числа нужного, происходило прерывание, там прерывание я бы обработал, а таймер дальше бы считал себе после того как произошло прерывание. Так можно было бы сделать тактовый сигнал для выхода SCL. Что думаете?


Вернуться наверх
 
Распродажа паяльного оборудования ATTEN!
Паяльные станции, паяльники и аксессуары по самой выгодной цене.

По промокоду radiokot скидка 10%
Не в сети
 Заголовок сообщения: Re: PIC12F675: диалог с расширителем PCF8574 через i2c (asm)
СообщениеДобавлено: Чт янв 21, 2016 14:01:59 
Друг Кота
Аватар пользователя

Карма: 94
Рейтинг сообщений: 1464
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 14984
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
Почитаньки для начала чегось на тему "многоканальный логический анализатор", логгер, сигнатурный анализатор.
Перехват/съём протокола с чипсета картриджа для струйного принтера...
:roll:


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5


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

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y