Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Из Atmega8 в Atmega16
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Basilkmv06
Очень внимательно прочитал ветку "Проблема с TWI", но вопросы остались.
Суть вопроса такова. До сихпор пользовался мегой8 и ее аппаратным TWI в слайве, но быстрый переход на мегу16 не удался. После долгих ковыряний всяких доков написал маленький софт на
LPT (что-то вроде мастера TWI). Пришел к выводу, что при таких равных условиях
1. Оба кристала подключены по одинаковой схеме;
2. Оба работают на внутреннем генераторе 8МГц;
3. Оба кристала выполняют одинаковый код
мега16 отказывается работать уже на частоте CLK ~150кГц, когда как м8 только на ~270кГц.
Обе проца 16мегагерцовые, единственное м8-PDIP, а м16- TQFP. В чем может быть пичина?
defunct
Цитата(Basilkmv06 @ Jun 6 2006, 20:16) *
мега16 отказывается работать уже на частоте CLK ~150кГц, когда как м8 только на ~270кГц.
Обе проца 16мегагерцовые, единственное м8-PDIP, а м16- TQFP. В чем может быть пичина?

Возможно в емкости линии. Что если попробовать уменьшить сопротивление между Vcc и линиями данных?
GetSmart
Ух ты. Не знал, что LPT можно использовать как TWI. А как оно будет читать данные (DTA) ? Что можно сделать только в одну сторону меня не удивляет, а вот как в обе стороны? Через диод што ли?
_____________
Может проблема в неправильных формах старт/стоп битов, формируемых LPT? В смысле временных их характеристиках.
Basilkmv06
Цитата(GetSmart @ Jun 7 2006, 03:29) *
Ух ты. Не знал, что LPT можно использовать как TWI. А как оно будет читать данные (DTA) ? Что можно сделать только в одну сторону меня не удивляет, а вот как в обе стороны? Через диод што ли?


Все просто. Два OUT бита LPT для передачи CLK и SDA, а один IN бит LPT для чтения SDA, SDA IN и SDA OUT развязаны LMкой.

Цитата(GetSmart @ Jun 7 2006, 03:29) *
Может проблема в неправильных формах старт/стоп битов, формируемых LPT? В смысле временных их характеристиках.


Уже года четыре пользуюсь програмкой для заливки всяких AT24CXXX, ни каких проблем не было.
Старты/стопы даже с метровым кабелем по временным характеристика довольно приличные.
А вот на счет емкости лини не знаю. А может входная емксть меги16 быть больше меги8?
Faradey
может я не в тему а на какой частое узаете TWI?
я помнится на 400 с чемто заводил и все работало...
Basilkmv06
Цитата(Faradey @ Jun 7 2006, 21:39) *
может я не в тему а на какой частое узаете TWI?
я помнится на 400 с чемто заводил и все работало...


TWI используется на частоте 250. В этом то и проблема, мега16 не хочет работать на такой частоте.
Сегодня еще покопался и проверил регистр состояния он после первой посылки 0x00, т. е. ошибка на шине. Сую вместо м16 м8 с идентичными кодами все работает. Повесил на шины уже по 1кОм, все равно таже ерунда.
Не может же TWIный модуль меги16 отличаться от меги8?
GetSmart
А может микруха глючная? Если есть вторая, то проверить бы.
GetSmart
Я бы не полагался на PC-i2c и для проверки связал бы два процессора например мегу16 и старую мегу8. Выставил бы на них те же 250 и убедился, что всё работает. А потом бы жаловался на писюху.
Starick
Цитата(Basilkmv06 @ Jun 6 2006, 20:16) *
Очень внимательно прочитал ветку "Проблема с TWI", но вопросы остались.
Суть вопроса такова. До сихпор пользовался мегой8 и ее аппаратным TWI в слайве, но быстрый переход на мегу16 не удался. После долгих ковыряний всяких доков написал маленький софт на
LPT (что-то вроде мастера TWI). Пришел к выводу, что при таких равных условиях
1. Оба кристала подключены по одинаковой схеме;
2. Оба работают на внутреннем генераторе 8МГц;
3. Оба кристала выполняют одинаковый код
мега16 отказывается работать уже на частоте CLK ~150кГц, когда как м8 только на ~270кГц.
Обе проца 16мегагерцовые, единственное м8-PDIP, а м16- TQFP. В чем может быть пичина?


Может я не понял чего - то, но что значит на внутреннем генераторе 8 МГц??? Внутренний генератор у меги8 и 16 вообще - то 1МГц. Не путаете ли Вы чего - то?? smile.gif
bodja74
Внутрений генератор у мег на 1,2,4 и 8Мгц.
bodja74
Еще ,выкладывайте инициализацию TWI слейва,посмотрим.
Кроме того ,если обработка прерывания у слейва долгая,он будет "затягивать" ACK,
Если у вашей проги на компе такой проверки нет ,будет глючить.
Но мне больше здается такторая частота заложена разная,проверте внимательно.
Basilkmv06
Цитата(Starick @ Jun 9 2006, 18:43) *
Цитата(Basilkmv06 @ Jun 6 2006, 20:16) *

Очень внимательно прочитал ветку "Проблема с TWI", но вопросы остались.
Суть вопроса такова. До сихпор пользовался мегой8 и ее аппаратным TWI в слайве, но быстрый переход на мегу16 не удался. После долгих ковыряний всяких доков написал маленький софт на
LPT (что-то вроде мастера TWI). Пришел к выводу, что при таких равных условиях
1. Оба кристала подключены по одинаковой схеме;
2. Оба работают на внутреннем генераторе 8МГц;
3. Оба кристала выполняют одинаковый код
мега16 отказывается работать уже на частоте CLK ~150кГц, когда как м8 только на ~270кГц.
Обе проца 16мегагерцовые, единственное м8-PDIP, а м16- TQFP. В чем может быть пичина?


Может я не понял чего - то, но что значит на внутреннем генераторе 8 МГц??? Внутренний генератор у меги8 и 16 вообще - то 1МГц. Не путаете ли Вы чего - то?? smile.gif

Читайте док, учите аглицкий.

Note: 1. The device is shipped with this option selected.
When this Oscillator is selected, start-up times are determined by the SUT Fuses as
shown in Table 10. XTAL1 and XTAL2 should be left unconnected (NC).
Table 9. Internal Calibrated RC Oscillator Operating Modes
CKSEL3..0 Nominal Frequency (MHz)
0001 (1) 1.0
0010 2.0
0011 4.0
0100 8.0
Basilkmv06
Цитата(bodja74 @ Jun 9 2006, 19:15) *
Еще ,выкладывайте инициализацию TWI слейва,посмотрим.
Кроме того ,если обработка прерывания у слейва долгая,он будет "затягивать" ACK,
Если у вашей проги на компе такой проверки нет ,будет глючить.
Но мне больше здается такторая частота заложена разная,проверте внимательно.

Полный текст (почти)
/*****************************************************
This program was produced by the
CodeWizardAVR V1.24.2c Standard
Automatic Program Generator
© Copyright 1998-2004 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.ro
e-mail:office@hpinfotech.ro

Project :
Version :
Date : 05.02.2006
Author : Basil
Company :
Comments:


Chip type : ATmega8
Program type : Application
Clock frequency : 8,000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 256
*****************************************************/

#include <mega8.h>


unsigned char i,j;

unsigned char rom_code[9];
unsigned char devices;




unsigned char adr,cmd;
unsigned char cmd_57=0xE8;
unsigned char cmd_50[8]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};//{0x01,0x6e,0x7e,0x00,0x0a,0x00,0x0,0x85};
unsigned char ds_4[4,8];
eeprom unsigned char cmd_00[0x8a];



unsigned char cmd_52=0x00;


union ULI {
unsigned char b[8];
unsigned long int word[2];
unsigned int pword[4];
};
union ULI cmd_30;





unsigned char w=0;




void iter(void)
{
cmd_30=...
}




// 2 Wire bus interrupt service routine
interrupt [TWI] void twi_isr(void)
{
switch (TWSR){

case 0xA0: //Áûë îáíàðóæåí START

TWCR=0x45;
TWCR|=0x80;


break;


case 0x60: //Áûë ïðèíÿò SLA+W ñ ñîáñòåííûì àäðåñîì è ïîñëàíî ïîäòâåðæäåíèå
// w=0;
// adr=0;
// cmd=0;
TWCR=0x45;
TWCR|=0x80;
break;

case 0x80: //Óñòðîéñòâî óæå àäðåñîâàíî, áûë ïðèíÿò áàò äàííûõ è ïîñëàíî ïîäòâåðæäåíèå

if (w==0)
{
adr=TWDR;
w=1;
TWCR=0x45;
TWCR|=0x80;
break;

}
else
{

if (w==1)
{
cmd=TWDR;
w=2;
TWCR=0x45;
TWCR|=0x80;
break;
};
};

if (w==2)
{
switch (cmd){
case 0x20:
cmd_30.b[adr]=TWDR;
cmd=0;
adr=0;
w=0;
TWCR=0x45;
TWCR|=0x80;
break;

case 0x00:
cmd_00[adr]=TWDR;
cmd=0;
adr=0;
w=0;
TWCR=0x45;
TWCR|=0x80;
break;

case 0x50:
///if ((adr==0x3A) & (TWDR==0xCE)) scan_ds();
// scan_ds();
cmd=0;
adr=0;
w=0;
TWCR=0x45;
TWCR|=0x80;
break;

};

};

// TWCR=0x45;
// TWCR|=0x80;
break;

case 0xA8: ////Áûë ïðèíÿò SLA+R ñ ñîáñòåííûì àäðåñîì è ïîñëàíî ïîäòâåðæäåíèå
switch (cmd){
case 0x57:
TWDR=cmd_57;
TWCR=0x45;//0x05;
TWCR|=0x80;
adr=0;
cmd=0;
w=0;
break;

case 0x20:
TWDR=cmd_30.b[adr];
TWCR=0x45;//0x05;
TWCR|=0x80;
adr=0;
cmd=0;
w=0;
break;

case 0x00:
TWDR=cmd_00[adr];
TWCR=0x45;//0x05;
TWCR|=0x80;
adr=0;
cmd=0;
w=0;
break;

case 0x30:
if (adr==0x00)
{
iter();
TWDR=cmd_30.b[0];
}
else
{
TWDR=cmd_30.b[1];
};

TWCR=0x45;//0x05;
TWCR|=0x80;
adr=0;
cmd=0;
w=0;
break;

case 0x50:
TWDR=cmd_50[adr];
TWCR=0x45;//0x05;
TWCR|=0x80;
adr=0;
cmd=0;
w=0;
break;

case 0x52:
TWDR=cmd_52;
TWCR=0x45;//0x05;
TWCR|=0x80;
adr=0;
cmd=0;
w=0;
break;

default:
};
break;

case 0xC0: ////Áûë ïåðåäàí áàéò äàííûõ è ïîëó÷åíî íå ïîäòâåðæäåíèå
TWCR=0x45;
TWCR|=0x80;
w=0;
break;

default:
w=0; // ëþáîå äðóãîå ñîáûòèå
TWCR|=0x40; //ðàçðåøèòü áèò ïîäòâåðæäåíèÿ
TWCR&=~0x20; //ÇÀÏÐÅÒÈÒÜ START
TWCR|=0x10; //Ïåðåçàãðóçêà TWI ôîðìèðîâàòü STOP
TWCR|=0x80;

break;

};


}

// Declare your global variables here

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;

// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
// Analog Comparator Output: Off
ACSR=0x80;
SFIOR=0x00;

// 2 Wire Bus initialization
// Generate Acknowledge Pulse: On
// 2 Wire Bus Slave Address: 58h
// General Call Recognition: Off
// Bit Rate: 250,000 kHz
TWBR=0x08;
TWAR=0xB0;
TWCR=0x45;


#asm("sei")
TWCR|=0x40; //ðàçðåøèòü áèò ïîäòâåðæäåíèÿ
TWCR&=~0x20; //ÇÀÏÐÅÒÈÒÜ START
TWCR|=0x10; //Ïåðåçàãðóçêà TWI ôîðìèðîâàòü STOP
TWCR|=0x80;





while (1)

{
};



}

В 8меге рботает на 250, тот же текст в меге16 не работает на 250!
bodja74
А с чего Вы взяли что TWBR=0x08 это Bit Rate: 250,000 kHz ?
TWBR=0x08 это 166.666 Кгц ,что мы и имеем smile.gif

Вообщето по идее слейву должно быть все равно значение TWBR,но вполне возможно мегу 16 решили доработать и использовать TWBR для формирования длительности ACK.

PS Тяжко мне в Си разобраться sad.gif
Basilkmv06
Цитата(bodja74 @ Jun 9 2006, 20:19) *
А с чего Вы взяли что TWBR=0x08 это Bit Rate: 250,000 kHz ?
TWBR=0x08 это 166.666 Кгц ,что мы и имеем smile.gif

Вообщето по идее слейву должно быть все равно значение TWBR,но вполне возможно мегу 16 решили доработать и использовать TWBR для формирования длительности ACK.

PS Тяжко мне в Си разобраться sad.gif

Последняя документация на мегу16 (doc2466.pdf) гласит:
This unit controls the period of SCL when operating in a Master mode. The SCL period
is controlled by settings in the TWI Bit Rate Register (TWBR) and the Prescaler bits in
the TWI Status Register (TWSR). Slave operation does not depend on Bit Rate or Pres-caler
settings
, but the CPU clock frequency in the slave must be at least 16 times higher
than the SCL frequency. Note that slaves may prolong the SCL low period, thereby
reducing the average TWI bus clock period.

Т.е. TWBR для формирования длительности ACK не используется.
Что на счет кода? Может есть какие-то косяки?
bodja74
Цитата(Basilkmv06 @ Jun 9 2006, 20:13) *
Что на счет кода? Может есть какие-то косяки?


Ну я в Си не очень,нужно чтобы спецы поглядели. smile.gif

Все что нашел не думаю что существенно.

Вот это
TWCR=0x45;
TWCR|=0x80;

Можно сразу С5 заводить.


И немного не ясно назначение последних строчек.

TWCR|=0x40; //&eth;&agrave;&ccedil;&eth;&aring;&oslash;&egrave;&ograve;&uuml; &aacute;&egrave;&ograve; &iuml;&icirc;&auml;&ograve;&acirc;&aring;&eth;&aelig;&auml;&aring;&iacute;&egrave;&yuml;
TWCR&=~0x20; //&Ccedil;&Agrave;&Iuml;&ETH;&Aring;&Ograve;&Egrave;&Ograve;&Uuml; START
TWCR|=0x10; //&Iuml;&aring;&eth;&aring;&ccedil;&agrave;&atilde;&eth;&oacute;&ccedil;&ecirc;&agrave; TWI &ocirc;&icirc;&eth;&igrave;&egrave;&eth;&icirc;&acirc;&agrave;&ograve;&uuml; STOP
TWCR|=0x80;

И тех же самых строк в обработчике прерывания (если я правильно я понял).

А так вроде все Ок.
Basilkmv06
Цитата(bodja74 @ Jun 10 2006, 01:09) *
Цитата(Basilkmv06 @ Jun 9 2006, 20:13) *

Что на счет кода? Может есть какие-то косяки?


Ну я в Си не очень,нужно чтобы спецы поглядели. smile.gif

Все что нашел не думаю что существенно.

Вот это
TWCR=0x45;
TWCR|=0x80;

Можно сразу С5 заводить.


Это просто для наглядности.
Цитата(bodja74 @ Jun 10 2006, 01:09) *
И немного не ясно назначение последних строчек.

TWCR|=0x40; //ðàçðåøèòü áèò ïîäòâåðæäåíèÿ
TWCR&=~0x20; //ÇÀÏÐÅÒÈÒÜ START
TWCR|=0x10; //Ïåðåçàãðóçêà TWI ôîðìèðîâàòü STOP
TWCR|=0x80;


Это для организации арбитража в случае конфликта на шине пишем в регистр управления сформировать STOP. и модуль перезагружается, а то что 4строки это тоже для наглядности.
GetSmart
Я не особо глубоко вникал в прогу, но на первый взгляд обработчик прерывания огромный.

Совет: сократите обработчик прерывания (уберите якобы наглядность) и проверьте ещё раз скорость.
bodja74
Арбитраж(выяснение отношений кто из мастеров первый полезет на шину) это прерогатива исключительно мастеров а не слейва.Слейв вообще не должен брать управление шиной на себя ни при каких условиях.В случае ошибки на шине ,тоже мастер должен принимать решение что делать с шиной.

Я так понял это дествие в прерывании на случай если не одно из условий не совпало?
default:
w=0; // &euml;&thorn;&aacute;&icirc;&aring; &auml;&eth;&oacute;&atilde;&icirc;&aring; &ntilde;&icirc;&aacute;&ucirc;&ograve;&egrave;&aring;
TWCR|=0x40; //&eth;&agrave;&ccedil;&eth;&aring;&oslash;&egrave;&ograve;&uuml; &aacute;&egrave;&ograve; &iuml;&icirc;&auml;&ograve;&acirc;&aring;&eth;&aelig;&auml;&aring;&iacute;&egrave;&yuml;
TWCR&=~0x20; //&Ccedil;&Agrave;&Iuml;&ETH;&Aring;&Ograve;&Egrave;&Ograve;&Uuml; START
TWCR|=0x10; //&Iuml;&aring;&eth;&aring;&ccedil;&agrave;&atilde;&eth;&oacute;&ccedil;&ecirc;&agrave; TWI &ocirc;&icirc;&eth;&igrave;&egrave;&eth;&icirc;&acirc;&agrave;&ograve;&uuml; STOP
TWCR|=0x80;

break;

Сделайте просто TWCR=0x85 и слейв сам уйдет в ступор,дожидаясь следущего старта со своим адрессом.
Woodoo
осцилограф есть? может кинишь осцилограмки SDA/SCL меги16 на 160 и 250 kHz?
Basilkmv06
TWI ЗАРАБОТАЛ!!
Долгие размышления по поводу косяков привели к следующим выводам:
1.С ростом скорости передачи на линиях SDA SCL фронтов сигналов (очевидно заметна емкость длинного кабеля от LPT).
2.Эти ошибки отображаются в регистре статуса как TWSR=0x00.
3.Согласно документации АТМЕЛА
Status $00 indicates that a bus error has occurred during a Two-wire Serial Bus transfer.
A bus error occurs when a START or STOP condition occurs at an illegal position in
the format frame. Examples of such illegal positions are during the serial transfer of an
address byte, a data byte, or an acknowledge bit. When a bus error occurs, TWINT is
set. To recover from a bus error, the TWSTO flag must set and TWINT must be cleared
by writing a logic one to it. This causes the TWI to enter the not addressed slave mode
and to clear the TWSTO flag (no other bits in TWCR are affected). The SDA and SCL
lines are released, and no STOP condition is transmitted.

ошибка обрабатывалась так
//TWCR|=0x40; //Разрешить бит подтверждения
//TWCR&=~0x20; //Запретить START
//TWCR|=0x10; //перезагрузить TWI сформировав STOP
//TWCR|=0x80;
Данный текст отлично работает в меге8. Но в меге16 TWI не перезагружается
и при этом удерживает 0 на ноге SCL, сей факт для меня остался загадкой!

4.В меге16 обработку TWSR=0x00 сделал так
TWCR=0x41;//отключить модуль TWI
TWCR=0xC5;//подклучить модуль TWI
Все заработало!!!!!

Если у кого есть соображения по поводу данной непонятки, то поясните. Зарание благодарен.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.