roboforum.ru

Технический форум по робототехнике.

PIC-оводы - помогите с i2c slave аппаратным

PIC-оводы - помогите с i2c slave аппаратным

dccharacter » 01 июн 2011, 11:01

Перепост с microchip.su - может кто поможет...

Сделал еще один двухдневный подход к i2c slave на PIC. Сил и нервов уже никаких не осталось. Ладно, к делу. Есть сетап: pic18f25k22 читает байт из i2c, пишет на его место другой байт, читает снова и сверяет записанное и прочитанное.

Функция чтения: старт - байт адреса+бит записи - запись адреса регистра - рестарт - байт адреса+бит чтения - чтение значения регистра - стоп.
Функция записи - старт - байт адреса+бит записи - запись адреса регистра - запись значения в регистр - стоп.

Функции проверены-перепроверены на датчике цвета, предполагается, что этот поллер нормально работает. Когда слейв от него отключен, он спокойно пуляет в пустоту адреса, ничего не получает и т.д. Подключаем слейв - поллер тыркается в него и зависает.

Теперь слейв - pic16f1827. Все на прерываниях, пять условий в соответствии с AN734. В каждом условии сделал выгрузку в УАРТ одного байта. Судя по этой отладочной информации, первое и последнее условие, в которое попадает обработчик прерывания - это условие №3 - STATE 3: MASTER READ, LAST BYTE WAS AN ADDRESS
• S = 1 (Start condition occurred last)
• R/W = 1 (Master reading data from the slave)
• D/A = 0 (Last byte was an address)
А, да, еще важно - включен слейв-режим семибайтный с прерываниями на старте/стопе.

Код сетапа камня слейва:

Код: Выделить всёРазвернуть
   //-----------------------------------------------------------------
    //-----------------------------------------------------------------
    //i2c setup
       
        //SSP1CON1 = 0b00011110;
        //SSP1CON1bits.WCOL
        //SSP1CON1bits.SSP1OV
        //SSP1CON1bits.SSP1EN
        SSP1CON1bits.CKP = 1; //enable clock
        SSP1CON1bits.SSPM3 = 1; //i2c
        SSP1CON1bits.SSPM2 = 1; //slave
        SSP1CON1bits.SSPM1 = 1; //7-bit address
        SSP1CON1bits.SSPM0 = 0; // w START-STOP interrupts
   
    SSP1ADD = I2C_ADDR;
       
        //SSP1STAT = 0b10000000;
        SSP1STATbits.SMP = 1; //1 = Slew rate control disabled for standard speed mode (100 kHz and 1 MHz)
        SSP1STATbits.CKE = 1; //0 = Disable SM bus� specific inputs
       
   
       //SSP1CON2 = 0x00;
       SSP1CON2bits.GCEN = 1; //0 = General call address disabled
       SSP1CON2bits.SEN = 1; //1 = Clock stretching enabled
       
           //SSP1CON3 = 0b00011000;
           SSP1CON3bits.BOEN = 1; //1 = SSPxBUF is updated and ACK is generated for a received address/data byte, ignoring the
                                //state of the SSPxOV bit only if the BF bit = 0.
        SSP1CON3bits.SDAHT = 1; //1 = Minimum of 300 ns hold time on SDAx after the falling edge of SCLx
                SSP1CON3bits.AHEN = 0;
                SSP1CON3bits.DHEN = 0;
           
       //SSP1MSK = 0xFF;
       
         SSP1CON1bits.SSPEN = 1;
        SSP1STAT = 0x00;
       SSP1IF = 0;
    SSP1IE = 1;
    //-----------------------------------------------------------------
    //-----------------------------------------------------------------
    PEIE = 1;
    GIE = 1;


Код обработчика прерывания:

Код: Выделить всёРазвернуть
       if (SSP1IF && SSP1IE)
        {
            //    unsigned char SSPSTAT_TEMP = SSPSTAT & 0b00101101;
            if ((SSP1STATbits.S) && (!SSP1STATbits.R_nW) && (!SSP1STATbits.D_nA) && (SSP1STATbits.BF))
            //if (!(0b00001001 ^ SSPSTAT_TEMP))
                //STATE 1: MASTER WRITE, LAST BYTE WAS AN ADDRESS
            {
                while (!TXIF);
    TXREG = 'A';
                SSP1IF = 0;
                unsigned char xxxx = SSPBUF;
                if (!SSP1CON1bits.CKP) SSP1CON1bits.CKP = 1;
                i2c_set_register = 1;
                while (!TXIF);
    TXREG = '.';
            }
/*           else if ((SSP1STATbits.S) && (!SSP1STATbits.R_nW) && (SSP1STATbits.D_nA) && (SSP1STATbits.BF))
            //else if (!(0b00101001 ^ SSPSTAT_TEMP))
                //STATE 2: MASTER WRITE, LAST BYTE WAS DATA
            {
                while (!TXIF);
    TXREG = 'B';
                SSP1IF = 0;
                if (i2c_set_register)
                {
                    i2c_register = SSPBUF;
                    i2c_set_register = 0;
                } else
                {
                    if (i2c_register < sizeof(CONTROL_REG))
                        CONTROL_REG[i2c_register] = SSPBUF;
                }
                if (!SSP1CON1bits.CKP) SSP1CON1bits.CKP = 1;
                while (!TXIF);
    TXREG = ',';
            }
            else if ((SSP1STATbits.S) && (SSP1STATbits.R_nW) && (!SSP1STATbits.D_nA))
            //else if (!(0b00001100 ^ (SSPSTAT_TEMP & 00101100)))
                //STATE 3: MASTER READ, LAST BYTE WAS AN ADDRESS
            {
                while (!TXIF);
    TXREG = 'C';
                SSP1IF = 0;
                unsigned char xxxxx = SSP1BUF;
                //while (SSP1STATbits.BF) SSPBUF;
                while (SSP1CON1bits.WCOL)
                {
                    SSP1CON1bits.WCOL = 0;
                    SSPBUF = 0x11;//CONTROL_REG[i2c_register];
                }
                SSP1BUF = 'T';
                SSP1CON1bits.CKP = 1;
                //if (!SSP1CON1bits.CKP) SSP1CON1bits.CKP = 1;
                while (!TXIF);
    TXREG = '-';
            }
            else if ((SSP1STATbits.S) && (SSP1STATbits.R_nW) && (SSP1STATbits.D_nA) && (!SSP1STATbits.BF))
            //else if (!(0b00101100 ^ SSPSTAT_TEMP))
                //STATE 4: MASTER READ, LAST BYTE WAS DATA
            {
                while (!TXIF);
    TXREG = 'D';
                SSP1IF = 0;
                //while (SSP1STATbits.BF) SSPBUF;
                while (SSP1CON1bits.WCOL)
                {
                    SSP1CON1bits.WCOL = 0;
                    SSPBUF = 0x11;//CONTROL_REG[i2c_register];
                }
                if (!SSP1CON1bits.CKP) SSP1CON1bits.CKP = 1;
                while (!TXIF);
    TXREG = ';';
            }
            else if ((SSP1STATbits.S) && (SSP1STATbits.D_nA) && (!SSP1STATbits.BF) && (SSP1CON1bits.CKP))
            //else if ((!(0b00101000 ^ (SSPSTAT_TEMP & 00101001))) && SSP1CON1bits.CKP)
                //STATE 5: MASTER NACK
            {
                while (!TXIF);
    TXREG = 'E';
                SSP1IF = 0;
                //SSPBUF;
                i2c_register = 0x00;
                if (!SSP1CON1bits.CKP) SSP1CON1bits.CKP = 1;
                while (!TXIF);
    TXREG = '#';
            }
            else if ((SSP1STATbits.P))
                //STATE 6: STOP
            {
                while (!TXIF);
    TXREG = 'F';
                SSP1IF = 0;
                //SSPBUF;
                i2c_register = 0x00;
                if (!SSP1CON1bits.CKP) SSP1CON1bits.CKP = 1;
                while (!TXIF);
    TXREG = '/';
            }
            else
            {
                while (!TXIF);
    TXREG = 'G';
                SSP1CON1bits.SSPEN = 0;
                SSP1IF = 0;
                SSP1CON1bits.SSPEN = 1;
                while (!TXIF);
    TXREG = '&';
            }*/
        }


Ребят, помогите, а то уже застрелиться охота. Спасибо заранее.

Re: PIC-оводы - помогите с i2c slave аппаратным

dccharacter » 02 июн 2011, 16:39

Ребят, надоело работать без инструмента - строю PICKit Serial Analyzer. Хочу заменить несколько компонентов на, как мне кажется, аналоги. Подскажите, можно ли?

1. Можно ли заменить ОУ MCP6001U (U2 в схеме) на TL028C (http://pdf1.alldatasheet.com/datashe...TI/TL082C.html, http://www.elitan.ru/price/index.php...=y&find=TL082C) - у меня такой на балконе валяется....
2. Вот этот транзистор: MMBT3906 на bc857b заменить? У 857 меньший ток - 100мА, но пиковые 200 держать должен

Re: PIC-оводы - помогите с i2c slave аппаратным

dccharacter » 04 июн 2011, 04:49

Хе хе хе
PICkit Serial Analyzer correctly updated.[Ad]A8[RX]05[RX]FE[P_]
[Ad]A8[RX]05[Ad]A9[DR]


Только не работает пока линия питания... Но хоть что-то...

Добавлено спустя 12 минут:
ОУ не пашет... Заменил, блин.

Re: PIC-оводы - помогите с i2c slave аппаратным

avr123.nm.ru » 04 июн 2011, 04:51

Рекомендую bc817 bc807 500 мА

Re: PIC-оводы - помогите с i2c slave аппаратным

dccharacter » 04 июн 2011, 05:18

Типа это транзисторы, а не работает типа ОУ

Добавлено спустя 21 минуту 21 секунду:
Warning: Vdd is less than 2.5 volts.

PICkit Serial Analyzer correctly updated.

PICkit Serial Analyzer correctly updated.

Sent I2C Write Cmd:
[S_][A8][05][DD][P_]


[S_][P_]

Sent I2C Write Cmd:
[S_][A8][05][DD][P_]


[S_][P_]

Sent I2C Write Cmd:
[S_][A8][05][DD][P_]


[S_][P_]

Sent I2C Read Cmd:
[S_][A8][05][RS][A9][01][P_]


[S_][52][P_]

Добавлено спустя 17 секунд:
хи хи х их хи хи хи хи

Re: PIC-оводы - помогите с i2c slave аппаратным

dccharacter » 04 июн 2011, 16:49

Ребята, пытаюсь понять, почему же у меня анализатор не выдает напряжение в схему. На картинке кусок каскада, формирующего напряжение на таргете. Когда мы в ГУЕ включаем напряжение, МК шимит свой выход и в т. А устанавливается напряжение в зависимости от желаемого - от 40мВ до 3В. При этом ОУ никак не реагирует и на его выходе всегда 5В. Из того, что я читаю вот тут: http://easyelectronics.ru/operacionnyj- ... l#more-367, при росте напряжения на инвертирующем входе, напряжение на выходе должно в какой-то момент грохнуться и транзистор должен открыться. Этого не происходит. Помогите, ПЛЗ, понять, в чем дело.

ОУ - TL082C.
Вложения
OU_HELP.png
OU_HELP.png (9.11 КиБ) Просмотров: 4847

Re: PIC-оводы - помогите с i2c slave аппаратным

avr123.nm.ru » 04 июн 2011, 21:28

R9-10-11 эпохальный шедевр схемотехники от микрочипа ! 3 резистора конечно лучше 2-х.

Добавлено спустя 4 минуты 29 секунд:
dccharacter писал(а):читаю вот тут: http://бредни про электронику.ru Этого не происходит. TL082C
На ОУ и полевике сделан усилитель напруги конденсатора на 2. На затворе будет тем меньше напруга ( ОУ должен его открывать ) чем она больше на конденсаторе и чем сильнее нагрузка с полевика на землю. Либо контакты проверяйте, либо поставьте правильный рэйл ту рэйл ОУ mcp60xx

На выоде этого ОУ 5 вольт вообше не должно быть при 5 вольтовом питании и какой либо минимальной нагрузке.

Поставьте резитор 1-4 кОм с выхода ОУ на землю чтоб нагрузить его.

Re: PIC-оводы - помогите с i2c slave аппаратным

dccharacter » 05 июн 2011, 20:17

"нагрузил". этот резистор притягивает выход к земле, транзистор постоянно открыт и на выходе 4,7В...

про три резистора - я один еще вчера отпаивал, "приводя" схему к референсной дихальта. Не помогает.

"правильный" ОУ ставить - надо, но жалко: такая платка получалась красивая...

Добавлено спустя 11 минут 18 секунд:
avr123, а зачем вообще эта морока с внешним ОУ? Почему нельзя компаратор в МК использовать, например? Ножкой дерг-дерг, транзистор открылся-закрылся????

Добавлено спустя 7 минут 10 секунд:
О, а вот эта штука чудесным образом совпадает по пинауту: AD8542 ARMZ 50 рублей восхитительный операционный усилитель сдвоенный.

Добавлено спустя 3 минуты 13 секунд:
оооооооооо
MCP6002.... ыыыыыы... у кого есть рядом с Красногорском МО? :-)))

Добавлено спустя 3 часа 55 минут:
Впаял MCP6022 - все заработало. Ае!!!! ХА ХА ХА :-) Теперь у меня есть анализатор. Ьудем им дальше потрошить i2c slave.
Вложения
IMG_0037[1].JPG

Re: PIC-оводы - помогите с i2c slave аппаратным

dccharacter » 06 июн 2011, 02:26

О, как интересно. При подключении нагрузки вырубается USB порт. Выпаял джампер R6, на его место впаял резистор 68 Ом. Заодно выкинул R11 - частично ради интереса. Все работает :-)

Re: PIC-оводы - помогите с i2c slave аппаратным

dccharacter » 06 июн 2011, 06:57

Starting ...Writing 0x8C to 0x05... done. Reading value...0x8C... OK!
Starting ...Writing 0x5B to 0x05... done. Reading value...0x5B... OK!
Starting ...Writing 0x84 to 0x05... done. Reading value...0x84... OK!

Короче, проблема была в том, что AN374 уже достаточно старый и не содержит информации о том, что логика MSSP модуля в PIC16F1827 (а может, и во всех новых ПИКах) была обновлена вслед за ПИК18. В частности, после приема адреса МССП модуль всегда пихает его в буфер. В результате поднимается флаг, который, если все делать по аппноуту, тестируется как уроненный, и мы пролетаем мимо запроса на чтение.

И все-таки, не совсем работает мой анализатор (т.е. логика-то вся ОК, а вот ВДД - не работает). авр123, помоги дожать его ПЛЗ. Симптомы:
1. Если на место R6 впаян джампер, а к модулю подключается нагрузка, то на напряжениях выше ~3.5В USB порт вырубается (судя по всему срабатывает защита).
2. Если на место R6 впаян резистор 68 Ом, то без нагрузки на выходе 5В, при подключении нагрузки просаживается до 3,4В.
3. МК в анализаторе всегда занижает реальное напряжение (на выходе 4,7В, в ГУЕ показывает 4,3-4,4В).

Среди возможных причин - замена диода ZHCS1000 на SS14 ???

Добавлено спустя 7 минут 5 секунд:
Вроде диоды похожи как близнецы-братья... Не должно быть в них дело-то.

Re: PIC-оводы - помогите с i2c slave аппаратным

avr123.nm.ru » 06 июн 2011, 15:36

dccharacter писал(а): 1. Если на место R6 впаян джампер, а к модулю подключается нагрузка, то на напряжениях выше ~3.5В USB порт вырубается (судя по всему срабатывает защита).
нагрузка то какая ? С малой нагрузкой ( не более 100 мА) нормально работает ?

dccharacter писал(а):2. Если на место R6 впаян резистор 68 Ом, то без нагрузки на выходе 5В, при подключении нагрузки просаживается до 3,4В.
все верно, на резисторе напруга падает.

dccharacter писал(а): 3. МК в анализаторе всегда занижает реальное напряжение (на выходе 4,7В, в ГУЕ показывает 4,3-4,4В).
НАверно надо калибровку делать как в PicKit2.

Добавлено спустя 6 минут 57 секунд:
dccharacter писал(а): avr123, а зачем вообще эта морока с внешним ОУ? Почему нельзя компаратор в МК использовать, например? Ножкой дерг-дерг, транзистор открылся-закрылся????
пульсации получаться большие, а на ОУ с полевиком выполнен усилитель напряжения в 2 раза.

Re: PIC-оводы - помогите с i2c slave аппаратным

dccharacter » 06 июн 2011, 16:22

avr123.nm.ru писал(а):
dccharacter писал(а): 1. Если на место R6 впаян джампер, а к модулю подключается нагрузка, то на напряжениях выше ~3.5В USB порт вырубается (судя по всему срабатывает защита).
нагрузка то какая ? С малой нагрузкой ( не более 100 мА) нормально работает ?

Ставил светодиод с резистором 100 Ом, мультиметр показывал около 30мА (через нагрузку). На входе сериал анализатора не смотрел - дорожки рвать надо. Мож подкорачивает что???? И когда транзистор полностью открывается, ток на нагрузке-то в районе 30мА, а куда-то еще мА 100 стравливается. И порт уходит в аут?

Re: PIC-оводы - помогите с i2c slave аппаратным

dccharacter » 06 июн 2011, 21:02

Продолжаю думать над схемой, смотрю на выходной каскад. Когда у нас подано напряжение на таргет, у нас получается, что Vdd_TGT внутри нагружен на землю диодом D2 плюс резистором R25 (820 Ом). Т.е. у нас получается источник напряжения, в котором R1 = R6+Rк, а R2 = Rдиода+R25. Как включили нагрузку, R2 меняется и напряжение на выходе плывет. Будет ли такой эффект, если замыканий в схеме нет? Или у меня скорее всего где-то что-то подкорачивает?
Вложения
PKSA_out_cascade.png

Re: PIC-оводы - помогите с i2c slave аппаратным

avr123.nm.ru » 06 июн 2011, 21:20

вы про R2 ? 820 Ом ?

========
Похоже вместо полевика у вас p-n-p биполярный слабый. И ОУ пытается через Б-Э просадить питание для его открытия.
========
На схеме в посте 847 в провод "С" можно воткнуть шоттки аналогичный тому что уже используется и R11 сделать 1 кОм - так мы компенсируем падение на шиоттки.

Re: PIC-оводы - помогите с i2c slave аппаратным

dccharacter » 06 июн 2011, 22:06

Тут это, цирк...

Выпаял конденсатор С10, и впаял на его место выводной электролит. И сейчас PKSA тянет две схемы и не перегружает порт. Че за фигня?

Добавлено спустя 3 минуты 32 секунды:
А, нет, еще смешнее. При выпайке С10 оборвал дорожку к С11.ю который, соответственно, выпал из схемы. И перезагрузка прекратилась. Точнее так: при подсоединении нагрузки, PKSA перегружается, но после этого все тянет.

Добавлено спустя 13 минут 40 секунд:
блин. похоже тупо кондер вылетел

Добавлено спустя 6 минут 28 секунд:
оба десятимикрофарадных кондера были дохлые. е-маё, не все, что с балкона - годное. тьфу ты.


Rambler\'s Top100 Mail.ru counter