| AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
I2C между МК, отправка массива чисел
23.03.2013, 22:49
|
|
|
Прохожий
Регистрация: 23.03.2013
Сообщений: 2
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
I2C между МК, отправка массива чисел
Только начал изучать I2C, хочу организовать связь между atmega'ми.
Итак, нашел проект I2C между мк (Atmega16+Atmega8 ).

Отсылается переменная char, то есть символы. Мне нужно передать массив 16 битных чисел. Это что-то меняет?
Например, что-то вроде
|
Код:
|
uint16_t ReseiveData[16] = {0x1111, 0x1111, 0x1111, 0x1111,
0x0000, 0x0000, 0x0000, 0x0000,
0x00ff, 0x00ff, 0x11ff, 0x22ff,
0xffff, 0xffff, 0xffff, 0xffff,}; |
Мастер
|
Код:
|
#define F_CPU 4000000UL
#include ‹string.h›
#include ‹avr/io.h›
#include ‹util/delay.h›
#include ‹avr/pgmspace.h›
#include ‹stdio.h›
#include ‹avr/interrupt.h›
#include "i2c.h"
#include "UART_routines.h"
#define LOCAL_ADDR 0xA0
#define TARGET_ADDR 0x07
unsigned char buf[100];
int main(void)
{
uart0_init();
_delay_ms(1000);
sendStr0("*************TWI MASTER RUNNING*************");
// initialize i2c function library
i2cInit();
// set local device address and allow response to general call
i2cSetLocalDeviceAddr(LOCAL_ADDR, TRUE);
unsigned char mBuf[100];
sprintf(mBuf,"%s","hello!");mBuf[strlen(mBuf)]=0x00;
i2cMasterSend(TARGET_ADDR,strlen(mBuf)+1/*(0x00)*/,&mBuf[0]);
sprintf(buf,"master sended: %s (length %d)",mBuf,strlen(mBuf)+1/*(0x00)*/);
transmitString(buf);TX_NEWLINE;
while(1)
{
_delay_ms(100);
}
} |
Слейв
|
Код:
|
#define F_CPU 4000000UL
#include ‹string.h›
#include ‹avr/io.h›
#include ‹util/delay.h›
#include ‹avr/pgmspace.h›
#include ‹stdio.h›
#include ‹avr/interrupt.h›
#include "i2c.h"
#include "UART_routines.h"
#define LOCAL_ADDR 0x07
#define TARGET_ADDR 0xA0
unsigned char buf[40];
// slave operations
void i2cSlaveReceiveService(u08 receiveDataLength, u08* receiveData)
{
sprintf(buf,"slave received: %s (length %d)",receiveData,receiveDataLength);
transmitString(buf);TX_NEWLINE;
}
int main(void)
{
uart0_init();
//_delay_ms(10);
sendStr0("*************TWI SLAVE RUNNING*************");
// initialize i2c function library
i2cInit();
// set local device address and allow response to general call
i2cSetLocalDeviceAddr(LOCAL_ADDR, TRUE);
i2cSetSlaveReceiveHandler( i2cSlaveReceiveService );
while(1)
{
_delay_ms(100);
}
} |
Пытался подкрутить под себя, пока не работает. Может кто что подскажет?
Вот исходник проекта
http://www.box.net/shared/nuac0pytxh
Взял отсюда
http://nagits.wordpress.com/2010/10/09/avr_twi/
Последний раз редактировалось bestrating; 23.03.2013 в 22:52.
|
|
|
|
23.03.2013, 23:04
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 20.06.2006
Адрес: Украина, Запорожье
Сообщений: 8,011
Сказал спасибо: 0
Сказали Спасибо 4,955 раз(а) в 2,379 сообщении(ях)
|
Re: I2C между МК, отправка массива чисел
(тихо напевая): ваще-то I2C байтовая шина... и регистр данных там такой же... и проверять надо флаги... и пример есть в аппнотах атмел...
|
|
|
|
24.03.2013, 16:49
|
|
|
Прохожий
Регистрация: 23.03.2013
Сообщений: 2
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: I2C между МК, отправка массива чисел
Может это и не лучшее решение, передается информация в виде символов, на приемнике преобразуется в число. Дальше, например, можно программировать ЦАП.
При нажатии на кнопку загружается новое значение из массива:
Кому нужно, вот проект:
http://zalil.ru/34376791
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 06:30.
|
|