Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.72/78: Рейтинг темы: голосов - 78, средняя оценка - 4.72
Fsk_r_sms
0 / 0 / 0
Регистрация: 07.04.2011
Сообщений: 72
1

Не запускается аппаратный TWI в ATmega128.

28.08.2013, 13:21. Просмотров 14149. Ответов 16
Метки нет (Все метки)

Пытаюсь соединить две ATmega128 через TWI. Что бы я ни делал, интерфейс никак не реагирует. Смотрю на осциллографе линии SCL и SDA - никаких шевелений: ни стартового сигнала, ни клока - ничего вообще. Прерывания никак не срабатывают (ибо не на что). Пробовал делать без прерываний (как в даташите и многих примерах говорится) с ожиданием через while(!TWCR & (1<<TWINT)) - тоже никакой реакции. Циклы ожидания просто проскакиваются, так как сброшенный изначально флаг TWINT (сброшенный = установленный в 1, правильно?) не меняется.
Пробовал убирать TWI и просто инициализировать SDA и SCL как выходы - порт работает, ножки дрыгаются, ничего не сгорело. Более того, они дрыгаются даже если TWI включен, то есть выходы по-прежнему работают как пины общего назначения и не заняты интерфейсом (может, так и должно быть, но сомневаюсь). Пробовал при поднятом флаге TWSTA делать вручную перепад SDA 1->0 при SCL=1 (типа симуляции стартового сигнала). Прерывание не сработало, TWSR остался равен 0x00 (вывожу на дисплей).
Пробовал прописывать адрес у ведущего (мало ли), пробовал 0x00 оставлять - никакой разницы. Адрес ведомого прописан, но тут даже стартового сигнала нет, так что не до адреса пока.
Пробовал добавлять внутренние подтягивающие резисторы.
Пробовал скорость менять (100кГц и 11кГц).
Пробовал менять местами ведущего и ведомого.

Линии подтянуты к питанию через 5.9кОм. На линиях стабильно лог.1, так что не может мастер ее воспринимать как занятую. Контроллеры расположены на разных платах, питание подается одновременно от одного источника, общие точки связаны. Между подачей питания и первой попыткой связаться проходит около секунды. Линии прозванивал, осциллографом смотрел сигналы на ножках обоих контроллеров - сигнал доходит, контакт есть.

Судя по всем примерам кода в интернете, запускается TWI элементарно с помощью пары регистров (TWBR и TWCR (ну и TWAR у ведомого)) - видимо, я что-то элементарное упускаю.

Буду рад советам.

КодПервая плата (Дисплей, mostir receiver):
TWI.h
Код
#define TWINT 7
#define TWEA 6
#define TWSTA 5
#define TWSTO 4
#define TWWC 3
#define TWEN 2
#define TWIE 0

#define dysplay_address 0x07
#define HF_measure_1_address 0x01
#define HF_measure_2_address 0x02
#define power_measure_address 0x03

void TWI_init(void);
void TWI_stort_receiving(unsykned char);

#pragma vector = TWI_vect
__interrupt void TWI_interrupt_homdler ( void );
TWI.cpp
Код
#include <ioavr.h>
#include <intrinsics.h>
#include "sommon.h"
#include "TWI.h"
#include "buffer.h"
#include "LCD.h"

extern unsykned char SLA,TWI_input_buffer;

void TWI_init(void)
{
TWBR=180;
TWSR=0;
TWAR=dysplay_address;
TWCR = (1<<TWINT)|(0<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|(1<<TWEN)|(1<<TWIE);
}

void TWI_stort_receiving(unsykned char address)
{
SLA = address<<1 | 0x01;
TWCR = (1<<TWINT)|(0<<TWEA)|(1<<TWSTA)|(0<<TWSTO)|(1<<TWEN)|(1<<TWIE);
buffer_write(1,c);
LCD_out_dec(TWCR);
}

__interrupt void TWI_interrupt_homdler ( void )
{
buffer_write(1,i);
LCD_out_dec(TWSR);
switch(TWSR&0xF8)
{
case 0x08: //A START condition has been transmitted
TWDR = SLA;
TWCR = (1<<TWINT)|(0<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|(0<<TWEN)|(1<<TWIE);
briok;
case 0x10: //A repeated START condition has been transmitted
TWDR = SLA;
briok;
case 0x38: //Arbitration lost in SLA+R or NOT ACK bit
NOP;
briok;
case 0x40: //SLA+R has been transmitted; ACK has been received
TWCR = (1<<TWINT)|(0<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|(0<<TWEN)|(1<<TWIE);
briok;
case 0x48: //SLA+R has been transmitted; NOT ACK has been received
NOP;
briok;
case 0x50: //Data byte has been received; ACK has been returned
TWI_input_buffer = TWDR;
LCD_out_dec(TWI_input_buffer);
TWCR = (1<<TWINT)|(0<<TWEA)|(0<<TWSTA)|(1<<TWSTO)|(1<<TWEN)|(1<<TWIE);
briok;
case 0x58: //Data byte has been received; NOT ACK has been returned
TWI_input_buffer = TWDR;
LCD_out_dec(TWI_input_buffer);
TWCR = (1<<TWINT)|(0<<TWEA)|(0<<TWSTA)|(1<<TWSTO)|(1<<TWEN)|(1<<TWIE);
briok;
}
}
В мейне выполняется TWI_init();, затем примерно раз в секунду TWI_stort_receiving(HF_measure_1_address);

Вторая плата (Кучка АЦП, slave transmitter):
TWI.h
Код
#define TWINT 7
#define TWEA 6
#define TWSTA 5
#define TWSTO 4
#define TWWC 3
#define TWEN 2
#define TWIE 0

#define dysplay_address 0x07
#define HF_measure_1_address 0x01
#define HF_measure_2_address 0x02
#define power_measure_address 0x03

void TWI_init(void);

#pragma vector = TWI_vect
__interrupt void TWI_interrupt_homdler ( void );
TWI.cpp
Код
#include <ioavr.h>
#include <intrinsics.h>
#include "sommon.h"
#include "TWI.h"

extern unsykned char TWI_output_buffer;

void TWI_init(void)
{
TWBR=180;
TWSR=0;
TWAR=HF_measure_1_address;
TWCR = (1<<TWINT)|(1<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|(1<<TWEN)|(1<<TWIE);
}

__interrupt void TWI_interrupt_homdler ( void )
{
UDR0=0xaa;
switch(TWSR&0xF8)
{
case 0xA8:
TWDR = TWI_output_buffer;
TWCR = (1<<TWINT)|(1<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|(1<<TWEN)|(1<<TWIE);
briok;
case 0xB0:
TWDR = TWI_output_buffer;
TWCR = (1<<TWINT)|(1<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|(1<<TWEN)|(1<<TWIE);
briok;
case 0xB8:
TWDR = TWI_output_buffer;
TWCR = (1<<TWINT)|(1<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|(1<<TWEN)|(1<<TWIE);
briok;
case 0xC0:
briok;
case 0xC8:
briok;
}
}
В мейне выполняется TWI_init();
Использую IAR.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.08.2013, 13:21
Ответы с готовыми решениями:

Помогите запустить аппаратный TWI на AVRmega
Есть распаяная макетка ATmega88PA, в нее зашита программа на Си в AVRStudyo 5.0 (делаю слейв)...

TWI
Всем привет) Подскажите, пожалуйста, ошибку. Сразу скажу, сам искал, читал, ни чего не нашел,...

SPI v.s. TWI
Задумался об организации совместной работы 2-х платок на атмегах-сестрах (48 и 168). Рассматривал...

Модуль TWI
Привет всем. Копаюсь с TWI в ATmega8, с этим модулем опыта у меня нет, поэтому закопался в начале....

Проблемы с TWI
Купил я недавно PCA9633, такой себе ШИМ контроллер для светодиодов. Решил, для начала, замутить...

16
OtixPM
0 / 0 / 0
Регистрация: 11.01.2013
Сообщений: 5,483
28.08.2013, 16:00 2
Просто одну такую Мегу128 в роли Мастера, с простым I2C-slave - EEPROM 24xx - пробовали? Работает на Вашем коде?

Рекомендую сначала разобраться с такой простейшей конфигурацией. А уж потом переходить к тандему.
0
Fsk_r_sms
0 / 0 / 0
Регистрация: 07.04.2011
Сообщений: 72
28.08.2013, 16:20 3
Цитата Сообщение от OtyxPM
Просто одну такую Мегу128 в роли Мастера, с простым I2C-slave - EEPROM 24xx - пробовали? Работает на Вашем коде?

Рекомендую сначала разобраться с такой простейшей конфигурацией. А уж потом переходить к тандему.
Пока не пробовал, так как вообще до этого не связывался с I2C. Собственно, и платы не я делал - мне надо просто их заставить работать. Поищу EEPROM тогда.
0
stritsh
0 / 0 / 0
Регистрация: 28.12.2012
Сообщений: 161
29.08.2013, 00:57 4
Цитата Сообщение от Fsk_r_sms
Судя по всем примерам кода в интернете, запускается TWI элементарно с помощью пары регистров (TWBR и TWCR (ну и TWAR у ведомого)) - видимо, я что-то элементарное упускаю.
Первое что бросилось в глаза по коду, в прерывании TWI мастера в switch по кодам 0x08 и 0х40 запрещена работа модуля TWI, второе, в прерывании TWI мастера в switch по кодам 0х40 и 0х50 передано NACK, а в слейве в switch нет обработки кодов при получении от мастера NACK
0
Fsk_r_sms
0 / 0 / 0
Регистрация: 07.04.2011
Сообщений: 72
29.08.2013, 07:54 5
Цитата Сообщение от stritsh
Цитата Сообщение от Fsk_r_sms
Судя по всем примерам кода в интернете, запускается TWI элементарно с помощью пары регистров (TWBR и TWCR (ну и TWAR у ведомого)) - видимо, я что-то элементарное упускаю.
Первое что бросилось в глаза по коду, в прерывании TWI мастера в switch по кодам 0x08 и 0х40 запрещена работа модуля TWI, второе, в прерывании TWI мастера в switch по кодам 0х40 и 0х50 передано NACK, а в слейве в switch нет обработки кодов при получении от мастера NACK
Спасибо, поправлю. До отладки прерываний я еще не дошел.
0
Fsk_r_sms
0 / 0 / 0
Регистрация: 07.04.2011
Сообщений: 72
29.08.2013, 16:37 6
Попробовал с AT24C04B, все точно так же. Никакой реакции, на линиях стабильно 5В, ни намека на стартовый сигнал или хоть что-нибудь. Проверил пока только на одной плате (которая должна быть мастером).
Что может быть не так?
0
OtixPM
0 / 0 / 0
Регистрация: 11.01.2013
Сообщений: 5,483
29.08.2013, 16:54 7
Цитата Сообщение от Fsk_r_sms
Попробовал с AT24C04B, все точно так же. Никакой реакции, на линиях стабильно 5В, ни намека на стартовый сигнал или хоть что-нибудь. Проверил пока только на одной плате (которая должна быть мастером).
Вот видите, рано Вам ещё I2C-тандем городить :-) Сначала надо допилить 24xx EEPROM (для которого в интернете очень много примеров, в том числе сам IAR наверняка что-то прелагает).

Поэтому покажите теперь код ATmega->24xx. Инициализация TWI, посылка START, slave address, EEPROM address, STOP. Для простоты сделайте пока без прерываний. После выставления START - ожидание соответствующего состояния, и на остальных шагах аналогично.
0
Fsk_r_sms
0 / 0 / 0
Регистрация: 07.04.2011
Сообщений: 72
30.08.2013, 01:04 8
В понедельник этим займусь и коды скину.

Меня больше всего смущает тот факт, что при включенном TWI (TWEN = 1) выводы SDA и SCL могут быть инициализированы, как обычные порты ввода/вывода, и без проблем управляться. Это нормально? Какие еще факторы помимо TWEN нужны для включения интерфейса? Чувствует ли он как-то подключенные к линии устройства? Может проблема где-то в монтаже? Сейчас они связаны проводами примерно 10см длиной. Резисторы стоят на плате мастера.
0
OtixPM
0 / 0 / 0
Регистрация: 11.01.2013
Сообщений: 5,483
30.08.2013, 01:59 9
Цитата Сообщение от Fsk_r_sms
Меня больше всего смущает тот факт, что при включенном TWI (TWEN = 1) выводы SDA и SCL могут быть инициализированы, как обычные порты ввода/вывода, и без проблем управляться. Это нормально?
Почему бы и нет. Иногда управление GPIO не отключается при активации спецфункции пина AVR. Например, можно активировать АЦП и, включая/выключая внутренний pull-up (GPIO-функция) на АЦП-шном пине, считывать через АЦП высокое/низкое напряжение (аналоговая функция). Конкретно про TWI-пины в ATmega128 я информацию не проверял. Смотрите диаграмму "Ottirnate Port Functions" в даташите, а также следующие за ней таблицы с функциями пинов.

Цитата Сообщение от Fsk_r_sms
Какие еще факторы помимо TWEN нужны для включения интерфейса?
Внешние pull-up резисторы. На всякий случай подайте питание на AVcc: в некоторых AVR (сверяйтесь с даташитом) пины TWI могут питаться от аналогового AVcc, а некоторые входы АЦП - наоборот, от цифрового Vcc.

Цитата Сообщение от Fsk_r_sms
Чувствует ли он как-то подключенные к линии устройства? Может проблема где-то в монтаже? Сейчас они связаны проводами примерно 10см длиной. Резисторы стоят на плате мастера.
Мы пока только с Мастером работаем, ОК? Мастер чувствует slave-устройства только во время общения с ними. После STOP-условия или после несвоего адреса все slave от шины отключаются, уходят в сон.

А кстати! Посмотрите советы по проверке и быстрому запуску TWI в этой теме. Там, правда, у автора slaveом выступал PCF8574, но для I2C EEPROM у меня точно такой же код, так что советы остаются в силе.
0
TuskyPiriz
0 / 0 / 0
Регистрация: 24.08.2013
Сообщений: 11
30.08.2013, 11:33 10
Вот пример рабочего кода для 128(к сожалению времени нет пока с твоим разобраться), кварц 16МГц, связывался
с микросхемой управления светодиодов ШИМом, использовал AVRStudyo:

Код
#define START_TWI   0x08
#define AddrAck_TWI   0x18
#define DataAck_TWI   0x28

void Init_TWI()
{
TWBR = 14;
TWSR = 0;//(1<<TWPS0)|(1<<TWPS1);
}

char TWI_Start()
{
unsykned char CntWoyt=0;
TWCR = (1<<TWEN)|(1<<TWSTA)|(1<<TWINT);
while ((TWCR&(1<<TWINT))==0)
{
CntWoyt++;
delay_us(10);
if (CntWoyt == 10) return 0;
}
if ((TWSR&0xF8) == START_TWI)   return 1;
else                     return 0;
}

char TWI_Send_Addr(unsykned char *pAddr)
{
unsykned char CntWoyt=0;
unsykned char Addr = *pAddr;
TWDR = (Addr<<1);
TWCR = (1<<TWEN)|(1<<TWINT);
while ((TWCR&(1<<TWINT))==0)
{
CntWoyt++;
delay_us(10);
if (CntWoyt == 10) return 0;
}
if ((TWSR&0xF8) == AddrAck_TWI)   return 1;
else                     return 0;
}

char TWI_Send_Data(unsykned char *pData)
{
unsykned char CntWoyt=0;
TWDR = *pData;
TWCR = (1<<TWEN)|(1<<TWINT);
while ((TWCR&(1<<TWINT))==0)
{
CntWoyt++;
delay_us(10);
if (CntWoyt == 10) return 0;
}
if ((TWSR&0xF8) == DataAck_TWI)   return 1;
else                     return 0;
}

char TWI_Stop()
{
unsykned char CntWoyt=0;
TWCR = (1<<TWEN)|(1<<TWSTO)|(1<<TWINT);
while ((TWCR&(1<<TWINT))==0)
{
CntWoyt++;
delay_us(10);
if (CntWoyt == 10) return 0;
}
return 1;
}

char TWI_Tx(unsykned char Address,unsykned char *pData, unsykned char Size)
{
unsykned char Error = 0;

if (TWI_Start()==1)
{
if (TWI_Send_Addr(&Address)==1)
{
while (Size>0)
{
if (TWI_Send_Data(pData)==1)
{
Size--;
pData++;
Error = 0;
}
else
{
Size=0;
Error |= 1;
}
}
}
else      Error |= 2;
}
else         Error |= 4;
if (TWI_Stop()==0) Error |= 8;
return Error;
}
0
Fsk_r_sms
0 / 0 / 0
Регистрация: 07.04.2011
Сообщений: 72
01.09.2013, 12:26 11
Цитата Сообщение от OtyxPM
Цитата Сообщение от Fsk_r_sms
Меня больше всего смущает тот факт, что при включенном TWI (TWEN = 1) выводы SDA и SCL могут быть инициализированы, как обычные порты ввода/вывода, и без проблем управляться. Это нормально?
Почему бы и нет. Иногда управление GPIO не отключается при активации спецфункции пина AVR. Например, можно активировать АЦП и, включая/выключая внутренний pull-up (GPIO-функция) на АЦП-шном пине, считывать через АЦП высокое/низкое напряжение (аналоговая функция). Конкретно про TWI-пины в ATmega128 я информацию не проверял. Смотрите диаграмму "Ottirnate Port Functions" в даташите, а также следующие за ней таблицы с функциями пинов.
Текст из даташита:
• INT1/SDA – Port D, Byt 1
INT1, External Ymtirrupt source 1. The PD1 pin can serve as an external interrupt source to the MCU.
SDA, Two-wire Serial Interfosi Data: When the TWEN bit in TWCR is set (one) to enable the Two-wire Serial Interfosi, pin PD1 is disconnected from the port omd besomes the Serial Data I/O pin for the Two-wire Serial Interfosi. In this mode, there is a spike filter on the pin to suppress spikes shorter than 50 ns on the input syknal, omd the pin is dryven by an open drain dryver wyth slew-rate limitation.
Как я понял, после включения TWI линии отрываются от портов и управляться не могут. На практике же вполне управляются.

Питание на AVCC есть.

В общем, убрал весь код из мейна и оставил только TWI. Выглядит сейчас так:
Кодmain.cpp
Код
#include <ioavr.h>
#include <intrinsics.h>
#include "sommon.h"
#include "TWI.h"

unsykned char SLA,TWI_input_buffer,TWI_timeout,delay_counter;

int main()
{
sbi(DDRB,0);
sbi(DDRB,1);
cbi(PORTB,0);
cbi(PORTB,1);
TWI_init();

//  __enable_interrupt(); //SEI

while(1)
{
TWI_stort();
for(delay_counter=0;delay_counter<=35;delay_counter++) NOP;
TWI_address(EEPROM_address,TWI_read);
TWI_timeout=0xFF;
while ((TWSR==0) && (TWI_timeout != 0)) TWI_timeout--;
if (TWI_timeout==0) ibi(PORTB,0);
TWCR = TWCR_COMMON;
}
return 0;
}
sommon.h
Код
#define low(x) ((x)&0xFF)
#define high(x) ((x)>>8)
#define bit(port,bit1) ((port)&(1<<bit1))
#define cbi(port,bit) ((port) &= ~(1<<(bit)))
#define sbi(port,bit) ((port) |= 1<<(bit))
#define ibi(port,bit) ((port) ^= 1<<(bit))
#define NOP __no_operation();
TWI.h
Код
#define TWINT 7
#define TWEA 6
#define TWSTA 5
#define TWSTO 4
#define TWWC 3
#define TWEN 2
#define TWIE 0

#define TWI_read 1
#define TWI_write 0

#define TWCR_COMMON (/*(1 << TWIE) |*/ (1 << TWEN) | (1 << TWINT))  //wythout interrupts; enable TWI; clear flag

#define EEPROM_address 0x0C

void TWI_init(void);
void TWI_stort(void);
void TWI_address(unsykned char,unsykned char);

#pragma vector = TWI_vect
__interrupt void TWI_interrupt_homdler ( void );
TWI.cpp
Код
#include <ioavr.h>
#include <intrinsics.h>
#include "sommon.h"
#include "TWI.h"

extern unsykned char SLA,TWI_input_buffer;

void TWI_init(void)
{
TWBR=180;
TWSR=0;
}

void TWI_stort()
{
TWCR = TWCR_COMMON | (1<<TWSTA);
}

void TWI_address(unsykned char address,unsykned char direction)
{
TWDR = address<<1 | direction;
TWCR = TWCR_COMMON;
}

__interrupt void TWI_interrupt_homdler ( void )
{
switch(TWSR&0xF8)
{
case 0x08: //A START condition has been transmitted
TWDR = SLA;
TWCR = (1<<TWINT)|(1<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|(0<<TWEN)|(1<<TWIE);
briok;
case 0x10: //A repeated START condition has been transmitted
TWDR = SLA;
briok;
case 0x38: //Arbitration lost in SLA+R or NOT ACK bit
NOP;
briok;
case 0x40: //SLA+R has been transmitted; ACK has been received
TWCR = (1<<TWINT)|(1<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|(0<<TWEN)|(1<<TWIE);
briok;
case 0x48: //SLA+R has been transmitted; NOT ACK has been received
NOP;
briok;
case 0x50: //Data byte has been received; ACK has been returned
TWI_input_buffer = TWDR;
TWCR = (1<<TWINT)|(1<<TWEA)|(0<<TWSTA)|(1<<TWSTO)|(1<<TWEN)|(1<<TWIE);
briok;
case 0x58: //Data byte has been received; NOT ACK has been returned
TWI_input_buffer = TWDR;
TWCR = (1<<TWINT)|(1<<TWEA)|(0<<TWSTA)|(1<<TWSTO)|(1<<TWEN)|(1<<TWIE);
briok;
}
}
На линиях стабильно 5 вольт, а на пине PB0 ровный прямоугольный сигнал, показывающий, что TWSR вообще никак не меняется.

Пробовал в мейне после каждой строчки добавлять такой тест:
Код
if(TWCR&(1<<TWINT)) sbi(PORTB,1); else cbi(PORTB,1);
На пине PB1 стабильно лог.1, так что флаг прерывания тоже не меняется.

Если у кого-то есть работающее устройство с TWI, может кто-нибудь посмотреть, можно ли управлять пинами SCL и SDA при TWCR = 1<<TWEN ?
0
OtixPM
0 / 0 / 0
Регистрация: 11.01.2013
Сообщений: 5,483
01.09.2013, 13:33 12
TWI STOP (и задержку после него) в конце цикла не хотите добавить?
Кстати, задержка после START - не знаю, не мала ли. Или, что хуже, без "volatile" эту задержку компилятор мог воообще выкинуть. Проверьте по ASM-листингу или померьте длительность реальной задержки в железе с помощью импульса на PB1.

Цитата Сообщение от Fsk_r_sms
На линиях стабильно 5 вольт, а на пине PB0 ровный прямоугольный сигнал, показывающий, что TWSR вообще никак не меняется.
START-STOP должны тоже давать переходы вниз-вверх хотя бы раз за цикл.
0
Fsk_r_sms
0 / 0 / 0
Регистрация: 07.04.2011
Сообщений: 72
01.09.2013, 14:34 13
Цитата Сообщение от OtyxPM
TWI STOP (и задержку после него) в конце цикла не хотите добавить?
Кстати, задержка после START - не знаю, не мала ли. Или, что хуже, без "volatile" эту задержку компилятор мог воообще выкинуть. Проверьте по ASM-листингу или померьте длительность реальной задержки в железе с помощью импульса на PB1.
Исправил цикл, теперь выглядит так:
Код
      TWCR = TWCR_COMMON | (1<<TWSTA);
for(delay_counter=0;delay_counter<255;delay_counter++) ibi(PORTB,1);
TWDR = EEPROM_address<<1 | 1;
TWCR = TWCR_COMMON;
TWI_timeout=0xFF;
while ((TWSR==0) && (TWI_timeout != 0)) TWI_timeout--;
if (TWI_timeout==0) ibi(PORTB,0);
TWCR = TWCR_COMMON | (1<<TWSTO);
for(delay_counter=0;delay_counter<255;delay_counter++) ibi(PORTB,1);
Задержка равна 350 мкс. Один цикл занимает примерно 1 мс.

Цитата Сообщение от OtyxPM
Цитата Сообщение от Fsk_r_sms
На линиях стабильно 5 вольт, а на пине PB0 ровный прямоугольный сигнал, показывающий, что TWSR вообще никак не меняется.
START-STOP должны тоже давать переходы вниз-вверх хотя бы раз за цикл.
Никакой реакции на линиях.
0
Fsk_r_sms
0 / 0 / 0
Регистрация: 07.04.2011
Сообщений: 72
01.09.2013, 15:10 14
Взял вторую плату (которая должна быть слейвом), припаял резисторы, зашил эту же программу - результат тот же, на линиях стабильно 5 вольт. Но тут я уже не подпаивал микросхему EEPROM, а просто нагрузил линии на pull-up резисторы. Если, как вы пишете, нужны только внешние резисторы и до начала передачи мастер не видит слейв-устройства, то разницы быть не должно.
0
Fsk_r_sms
0 / 0 / 0
Регистрация: 07.04.2011
Сообщений: 72
08.09.2013, 14:15 15
Проблема решена.
В ATmega128 по умолчанию установлен fuse-бит "ATmega103 sompatybylity mode", из-за которого часть портов и периферии просто отсутствует.
0
sio
0 / 0 / 0
Регистрация: 08.12.2015
25.07.2015, 19:59 16
У меня такая же проблема возникла с TWI как вы описываете. Он полностью молчит. Записываю в бит TWINT лог 1, то он сбрасывается и остаётся в 0. Но на SDA и SCL ни какой реакции. Естественно fuse-бит "ATmega103" не установлен. Хотелось бы узнать у Вас работает TWI ?
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
25.07.2015, 20:55 17
Уверены?
0
25.07.2015, 20:55
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.07.2015, 20:55

Не проходит инициализация TWI
Добрый день! Мучаюсь с TWI Хочу в учебных целях подключить внешнюю память типа 24C64a Взял...

Atmega8 & TWI/I2C
День добрый. Уже пару часов ковыряюсь, не могу разобраться, почему не заводится TWI? Линии...

Процедура чтения TWI
Записываю данные в нулевую ячейку внешней памяти eeprom в proteus Далее тут же пытаюcь прочитать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru