реклама на сайте
подробности

 
 
> i2c меджу двумя ATmega8
rushack
сообщение Feb 15 2009, 19:12
Сообщение #1





Группа: Участник
Сообщений: 13
Регистрация: 14-02-09
Из: Нижний Новгород
Пользователь №: 44 857



Привет всем. Пишу курсовую, в ней есть схемка, где две ATmega8 соединены по i2c (27,28 ноги). На Master есть 2 кнопки, идут с плюса через сопротивление на порты PD2 (Кнопка SB1), PD3 (Кнопка SB2) и один светодиод (VD4), также с плюса через сопротивление на PD4. У "раба" почти тоже самое, только вместо кнопок светодиоды(VD1 и VD2). Сетодиод на PD4 на обоих процах для сигнализирования ошибки. Требуется при нажатии на клавишу SB1 найти "раба" по коду (AF) и отослать ему комбинацию DD AF 1C, тот в свою очередь примет и зажжёт светодиод VD1. Кнопка SB2 по комбинации DD AF 1D зажжёт VD2. Если кто-то может и нетрудно, напишите код для Master и Slave (WinAVR). Искал разные примеры, много чего перепробовал и сторонние библиотеки, и стандартный (util/twi.h), непомогло, никак немогу понять когда реагировать на приёмы, и как чего отсылать. Если нужна схемка, то выложу почти в любых форматах (кроме Автокадского smile.gif за неимением онного)

От модератора. Если Вы предлагаете работу, то я перенесу это сообщение в соответствующий раздел. Если же просите помощи, то давайте к обсуждению более полную информацию (схему, исходники и где чего у Вас не получается).
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
rushack
сообщение Feb 16 2009, 19:34
Сообщение #2





Группа: Участник
Сообщений: 13
Регистрация: 14-02-09
Из: Нижний Новгород
Пользователь №: 44 857



Исходник раба (частично/только i2c)
Непомню откуда качал пример, часть была сделана так.
Тут я просто пытаюсь поймать символ "a"/0x61 , и инвертировать состояние порта PB0

CODE
#include <avr/io.h>
#include <util/twi.h>
#include <avr/interrupt.h>

#define TWI_RX_BUFFER_SIZE 8


// receive buffer (incoming data)
static uint8_t i2crxbuffer[TWI_RX_BUFFER_SIZE];
static uint8_t i2crxindex;
uint8_t i2c_rxbuffer[TWI_RX_BUFFER_SIZE];

static void (*i2cSlaveReceive)(uint8_t receiveDataLength, uint8_t* recieveData);
void twi_init(uint8_t adress);

// I2C (TWI) interrupt service routine
SIGNAL(SIG_2WIRE_SERIAL)
{

switch (TWSR & 0xF8)
{
case TW_SR_SLA_ACK: // 0x60: own SLA+W has been received, ACK has been returned
case TW_SR_ARB_LOST_SLA_ACK: // 0x68: own SLA+W has been received, ACK has been returned
case TW_SR_GCALL_ACK: // 0x70: GCA+W has been received, ACK has been returned
case TW_SR_ARB_LOST_GCALL_ACK: // 0x78: GCA+W has been received, ACK has been returned
i2crxindex = 0;
TWCR |= (1 << TWINT) | (1 << TWEA);
break;

case TW_SR_DATA_ACK: // 0x80: data byte has been received, ACK has been returned
case TW_SR_GCALL_DATA_ACK: // 0x90: data byte has been received, ACK has been returned
i2crxbuffer[i2crxindex++] = TWDR;
if(i2crxindex < TWI_RX_BUFFER_SIZE)
TWCR |= (1 << TWINT) | (1 << TWEA); // receive data byte and return ACK
else
TWCR |= (1 << TWINT); // receive data byte and return NACK
break;

case TW_SR_DATA_NACK: // 0x88: data byte has been received, NACK has been returned
case TW_SR_GCALL_DATA_NACK: // 0x98: data byte has been received, NACK has been returned
TWCR |= (1 << TWINT);
break;

case TW_SR_STOP: // 0xA0: STOP or REPSTART has been received while addressed as slave
TWCR |= (1 << TWINT) | (1 << TWEA); // switch to SR mode with SLA ACK
if (i2cSlaveReceive) i2cSlaveReceive(i2crxindex, i2crxbuffer); // i2c receive is complete, call i2cSlaveReceive
break;

case TW_BUS_ERROR: // 0x00: Bus error due to illegal start or stop condition
TWCR |= (1 << TWINT) | (1 << TWSTO) | (1 << TWEA); // reset internal hardware and release bus
break;
}

}


void twi_slave_setrxhandler(void (*i2cSlaveRx_func)(uint8_t receiveDataLength, uint8_t* recieveData))
{
i2cSlaveReceive = i2cSlaveRx_func;
}

void twi_init(uint8_t adress)
{
i2cSlaveReceive = 0;

TWAR = adress;

TWCR = (1 << TWIE) | (1 << TWEA) | (1 << TWEN);

sei();
}

void i2c_rxservice(uint8_t length, uint8_t* data)
{
uint8_t counter;
for (counter = 0; counter <= length; counter++)
i2c_rxbuffer[counter] = *data++;

switch (i2c_rxbuffer[0])
{
case 'a':
PORTB ^=0x01;
break;
default:
break;
}
}

int main( void )
{
DDRB =0x01;
twi_init(0xAA);
while(1)
{
twi_slave_setrxhandler(i2c_rxservice);
}

}


В протериусе через дебагер и2ц посылаю S- стартует, адрес - отвечает ACK, 0x61 - отвечает АСК, P - связь как и должно быть разрывается, но во время посылки 0x61 ничего не происходит.

Слышал что в протериусе отладчик кода есть сейчас попробую, может через него ошибки найду?
Причина редактирования: Уменьшение видимого размера цитаты исходника.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- rushack   i2c меджу двумя ATmega8   Feb 15 2009, 19:12
- - smalcom   ЦитатаЕсли кто-то может и нетрудно, напишите код д...   Feb 16 2009, 02:48
|- - rushack   Цитата(smalcom @ Feb 16 2009, 05:48) бакс...   Feb 16 2009, 05:24
|- - ReAl   Цитата(rushack @ Feb 16 2009, 07:24) Кака...   Feb 16 2009, 07:29
||- - rushack   Цитата(ReAl @ Feb 16 2009, 10:29) Помочь ...   Feb 16 2009, 11:30
||- - haker_fox   Цитата(rushack @ Feb 16 2009, 19:30) Не н...   Feb 16 2009, 14:12
|- - SysRq   Цитата(rushack @ Feb 16 2009, 08:24) ...в...   Feb 16 2009, 17:30
|- - rushack   Цитата(SysRq @ Feb 16 2009, 20:30) Схемка...   Feb 16 2009, 18:31
|- - haker_fox   Цитата(rushack @ Feb 17 2009, 02:31) Я пр...   Feb 17 2009, 12:28
|- - rushack   Цитата(haker_fox @ Feb 17 2009, 15:28) И ...   Feb 17 2009, 12:45
- - kamil yaminov   Написать может и нетрудно, а учиться кто будет? Не...   Feb 16 2009, 05:47
- - lepert   Цитата(rushack @ Feb 15 2009, 22:12) Иска...   Feb 16 2009, 09:19
- - mdmitry   Про обработку кнопок (дребезг) можно поискать на ф...   Feb 16 2009, 18:08
|- - ReAl   Цитата(rushack @ Feb 16 2009, 21:34) Код ...   Feb 17 2009, 16:15
- - rushack   Всем спасибо, сам разобрался. Тему можно закрывать...   Feb 18 2009, 14:12


Closed TopicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st June 2025 - 12:41
Рейтинг@Mail.ru


Страница сгенерированна за 0.01366 секунд с 7
ELECTRONIX ©2004-2016