Отговори на тема  [ 281 мнения ]  Отиди на страница Предишна  1 ... 5, 6, 7, 8, 9, 10, 11 ... 19  Следваща
I2C малко помощ 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Фев 07, 2012 11:22 pm
Мнения: 3084
Мнение Re: I2C малко помощ
Една кратка лекция за кафето.
Процесорът може да прави само три неща - чете от адрес , пише на адрес и прекъсва. За пълнота ще спомена и 4-то : може да променя данните.
Всичко останало е следствие.
Като напишеш
INT BUFFER [11]
караш компилатора да задели памет за 11 обекта int.
BUFFER [ z]= x;
Това кара компилатора да
генерира код, който сумира адреса на първия елемент от буфера с променливата z, после резултатът се ползва за адрес , на който да се запише числото , прочетено от адреса x.
Компилаторът се опитва да помага, където може.
Ако напишеш buffer [123]= x;
ще забележи, че 123 е повече от 11 и ще свирне. В случая buffer [x] няма как да помогне и оставя това на твоя отговорност.


Пет Авг 11, 2017 8:12 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Фев 07, 2012 11:22 pm
Мнения: 3084
Мнение Re: I2C малко помощ
Какво става, когато декларираш
Int buffer []
?
......
Това е за домашно :D


Пет Авг 11, 2017 9:28 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Фев 07, 2012 11:22 pm
Мнения: 3084
Мнение Re: I2C малко помощ
Какво става, когато декларираш
Int buffer []
?
......
Това е за домашно :D


Пет Авг 11, 2017 9:28 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пон Май 12, 2014 11:49 pm
Мнения: 4394
Местоположение: София
Мнение Re: I2C малко помощ
Благодаря за обяснението!

Когато напиша Int buffer [] не ме плюе.

В частност - за декларацията "uint8_t RXbuffer_forslave_1[];" по метода проба-грешка стигнах до извода, че с [] се подразбира [52].
До този извод стигнах, като пробвах да чета RXbuffer_forslave_1[1]; RXbuffer_forslave_1[2]................
До RXbuffer_forslave_1[52] минава и от там нагоре започва да реве.
Ако декларацията съм я направил, както трябва (примерно uint8_t RXbuffer_forslave_1[87];) респективно реве над RXbuffer_forslave_1[87].

По въпроса за:

stefan63 написа:
void interrupt INTERRUPT_InterruptManager (void)
{

//сложи тукнякакво цъкане на някой порт - да видиш сосцилоскопа, че се вика тоя хандлер
// interrupt handler
if(INTCONbits.PEIE == 1
//тоя бит някой рзрешав ли го ???


сложих порт да цъка и той не цъка.

За INTCONbits.PEIE никъде не видях нещо, което да го сетва. Изобщо никъде не видях нещо да има бизнес с INTCON регистъра.


Пет Авг 11, 2017 10:59 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Юни 03, 2005 9:39 pm
Мнения: 2277
Мнение Re: I2C малко помощ
lcr написа:
...
Когато напиша Int buffer [] не ме плюе.
...


Ако mcu-то имаше memory protection, щеше да питаш "що гърми" ?
Виж в документацията на компилатора какво пише за този тип дефиниране на масив.
gcc-то пише нещо от сорта warning: 'array 'blabla' assumed to have one element'.

_________________
Определянето стойността на дадена величина се нарича ИЗМЕРВАНЕ! Опонентът се оборва с ФАКТИ, а не с ЕПИТЕТИ!


Пет Авг 11, 2017 11:57 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Фев 07, 2012 11:22 pm
Мнения: 3084
Мнение Re: I2C малко помощ
Цитат:

За INTCONbits.PEIE никъде не видях нещо, което да го сетва. Изобщо никъде не видях нещо да има бизнес с INTCON регистъра.

Просто успокой малко топката и се върни малко назад. Направи прекъсване по таймер, неговия хандлер да съка порт-лед. Разучи го , както и прекъсванията.


Пет Авг 11, 2017 12:22 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 6:52 pm
Мнения: 11266
Местоположение: Добрич
Мнение Re: I2C малко помощ
syscop написа:
gcc-то пише нещо от сорта warning: 'array 'blabla' assumed to have one element'.


много ме съмнява gcc да пише такива неща... все пак gcc следва стандартите ;-)

А стандартно подобно нещо се нарича "отворен масив" (търси в гугъл "open array"). И по принцип може да се ползва за тип или за член на структура, но не и да изпляскаш глобална променлива от такъв тип. Не че е нещо лошо, просто отворения масив в дефиниция е де-факто масив с НУЛА елемента. Но както казах по-добре да се ползва за тип (примерно функция, която може да получава масиви с различни дължини) или като последно поле в структура (виж flexible array member).


Пет Авг 11, 2017 12:24 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Юни 03, 2005 9:39 pm
Мнения: 2277
Мнение Re: I2C малко помощ
Това пише.

Дефиницията е int blabla[]; глобална променлива.
warning: main.c|20|warning: array 'blabla' assumed to have one element|
Компилатор: gcc version 6.3.1 20170215 (release) [ARM/embedded-6-branch revision 245512] (GNU Tools for ARM Embedded Processors 6-2017-q1-update)

_________________
Определянето стойността на дадена величина се нарича ИЗМЕРВАНЕ! Опонентът се оборва с ФАКТИ, а не с ЕПИТЕТИ!


Пет Авг 11, 2017 12:38 pm
Профил
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Вто Фев 06, 2007 2:45 am
Мнения: 263
Мнение Re: I2C малко помощ
Изненада - XC8 компилира и линква int blabla[] 8O

Код:
void I2C2_MasterRead(uint8_t *pdata,
                           uint8_t length,
                           uint16_t address,
                           I2C2_MESSAGE_STATUS *pflag);


Първия аргумент трябва да е от тип 'указател към uint8_t'. Ако ще се подава не-начален елемент от масив, трябва да има & преди елемента, т.е.
Код:
&myBuffer[2]

и то при условие, че my_buffer е масив от uint8_t; ако е от тип int - трябва да има каст:
Код:
(uint8_t*)&myBuffer[2]

Ако myBuffer има нулева дължина, вероятно ще има намазани други променливи.
Накратко, трябва да имаш нещо подобно:
Код:
uint8_t   myBuffer[10];
uint16_t  address;
I2C2_MESSAGE_STATUS  msgStatus;

I2C2_MasterRead(&myBuffer[0],
              2,
              address,
              &msgStatus);


Пет Авг 11, 2017 1:32 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 6:52 pm
Мнения: 11266
Местоположение: Добрич
Мнение Re: I2C малко помощ
syscop написа:
Това пише.


хм... прав си! Чак се изненадох... според С99 (clause 6.9.2) трябвало да се заделя един елемент и да се инициализира с 0. Тъпо! Отворените масиви се ползват много във всякакви комуникациионни протоколи и тем подонни библиотечки. Навсякъде се разчита че sizeof на структура не се променя с добавянето на поле с отворен масив. Демек в структура не заема място, а извън заема... Тъпо, тъпо...


Пет Авг 11, 2017 1:54 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пон Май 12, 2014 11:49 pm
Мнения: 4394
Местоположение: София
Мнение Re: I2C малко помощ
@tolstolob:

Така въведено:

uint8_t myBuffer[10];
uint16_t address;
I2C2_MESSAGE_STATUS msgStatus;

I2C2_MasterRead(&myBuffer[0],
2,
address,
&msgStatus);


ми дава грешка.


Все си мислех, че MCC е създаден за такива, като мен за да могат хора, които не са много навътре в бизнеса да си свършат работа. В случая се получава обратното. Губя маса време, занимавам и вас за да вникна в нещо неработещо и неразбираемо.

На този етап възнамерявам да изоставя това начинание (i2c) и да си реша задачата с други, по ясни за мен средства - примерно SPI. Осигуряването на достатъчен брой пинове за целта ще ми отнеме несравнимо по-малко време.

Благодаря ви, за помощта. Бъдете живи и здрави!

:)


Пет Авг 11, 2017 5:37 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пон Май 12, 2014 11:49 pm
Мнения: 4394
Местоположение: София
Мнение Re: I2C малко помощ
Луд умора няма. Само се поти :)

Мислех да я изоставя тая пущина, но сега мира не ми дава. Не че нямам вариант да мина и без I2C....

Накратко - продължавам с копането :)

И така - това което открих до момента е:

1 - То си го пише, че в потребителския софтуер на slave и на master трябва изрично да се разрешат прекъсванията (global и peripherial) ама някой трябва и да го прочете....

2 - След като ги разреших и за да видя, дали реално ISR функцията в slave се изпълнява, сложих тя да пали led но той се пали само при положение, че в потребителския софтуер на master се извика функцията I2C1_MasterReadTRBBuild ().
При викане на I2C1_MasterRead () - комуникация не се наблюдава и прекъсване в Slave няма.

3 - Впредвид вида на функцията I2C1_MasterRead ():

Код:
void I2C1_MasterRead(
                                uint8_t *pdata,
                                uint8_t length,
                                uint16_t address,
                                I2C1_MESSAGE_STATUS *pflag)
{
    static I2C1_TRANSACTION_REQUEST_BLOCK   trBlock;


    // check if there is space in the queue
    if (i2c1_object.trStatus.s.full != true)
    {
        I2C1_MasterReadTRBBuild(&trBlock, pdata, length, address);
        I2C1_MasterTRBInsert(1, &trBlock, pflag);
    }
    else
    {
        *pflag = I2C1_MESSAGE_FAIL;
    }


и описаното в т. 2, си мисля, че не се изпълнява условието (i2c1_object.trStatus.s.full != true), което към настоящия момент не ми е много ясно, какво означава, респективно, какво трябва да направя за да се изпълни.


Пон Авг 14, 2017 8:43 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Фев 07, 2012 11:22 pm
Мнения: 3084
Мнение Re: I2C малко помощ
Цитат:
void I2C1_MasterRead(
uint8_t *pdata,
uint8_t length,
uint16_t address,
I2C1_MESSAGE_STATUS *pflag)
{
static I2C1_TRANSACTION_REQUEST_BLOCK trBlock;


// check if there is space in the queue
if (i2c1_object.trStatus.s.full != true)
{ Цъкни тука едно ледче
I2C1_MasterReadTRBBuild(&trBlock, pdata, length, address);
I2C1_MasterTRBInsert(1, &trBlock, pflag);
}
else
{
*pflag = I2C1_MESSAGE_FAIL;
}




Според мене не се изпълнява
в Insert
Цитат:
// for interrupt based
if (*pflag == I2C_MESSAGE_PENDING)
{

if (i2c_state == S_MASTER_IDLE ) PIR1bits.SSP1IF = true; мисля че е нужен такъв ред тук защото

while(i2c_state != S_MASTER_IDLE); //
при инициализация i2c_state = S_MASTER_IDLE и микой не го променя извън прекъсването
{
// force the task to run since we know that the queue has
// something that needs to be sent
PIR1bits.SSP1IF = true;
така че това няма да се изпълни


}
} // block until request is complete




Пон Авг 14, 2017 10:52 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пон Май 12, 2014 11:49 pm
Мнения: 4394
Местоположение: София
Мнение Re: I2C малко помощ
stefan63 написа:
Цитат:
void I2C1_MasterRead(
uint8_t *pdata,
uint8_t length,
uint16_t address,
I2C1_MESSAGE_STATUS *pflag)
{
static I2C1_TRANSACTION_REQUEST_BLOCK trBlock;


// check if there is space in the queue
if (i2c1_object.trStatus.s.full != true)
{ Цъкни тука едно ледче
I2C1_MasterReadTRBBuild(&trBlock, pdata, length, address);
I2C1_MasterTRBInsert(1, &trBlock, pflag);
}
else
{
*pflag = I2C1_MESSAGE_FAIL;
}


Led - чето се пали при викане на I2C1_MasterRead в потребителския цикъл, но комуникация не се наблюдава и не стартира ISR в slave.

stefan63 написа:

Според мене не се изпълнява
в Insert
Цитат:
// for interrupt based
if (*pflag == I2C_MESSAGE_PENDING)
{

if (i2c_state == S_MASTER_IDLE ) PIR1bits.SSP1IF = true; мисля че е нужен такъв ред тук защото

while(i2c_state != S_MASTER_IDLE); //
при инициализация i2c_state = S_MASTER_IDLE и микой не го променя извън прекъсването
{
// force the task to run since we know that the queue has
// something that needs to be sent
PIR1bits.SSP1IF = true;
така че това няма да се изпълни


}
} // block until request is complete




Добавих въпросния ред, но нищо не се променя.


Вто Авг 15, 2017 12:11 pm
Профил
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Съб Окт 30, 2004 11:19 pm
Мнения: 609
Мнение Re: I2C малко помощ
Не ми се четат всички страници.

Моите 5 стотинки. Преди време и аз като учех нещата И2Ц ми беше напълно неясно.
Улеснението е ако имаш осцилоскоп, правиш безкраен цикъл да предава един/два байта и картинката да залепне статично на екрана. ясно ще се види какво (не)върви и има ли акнолиджи.


Вто Авг 15, 2017 12:52 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 281 мнения ]  Отиди на страница Предишна  1 ... 5, 6, 7, 8, 9, 10, 11 ... 19  Следваща

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 0 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни