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

 
 
> Чтение по TWI
Ruffian
сообщение Mar 27 2011, 10:03
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 19
Регистрация: 4-03-11
Пользователь №: 63 397



Добрый день.
Помогите разобраться с простейшим примером работы с TWI

Код
void RS_Send_Char(char c);
void RS_Send_Text (char *text);



char eepromData;


void main(){
  DDRA = 0xFF;              // configure PORTA as output
  UART1_Init(9600);
  Delay_ms(200);
  RS_Send_Text("test");
  
  
  // часть 1
  TWI_Init(100000);         // initialize TWI communication

  TWI_Start();              // issue TWI start signal
  TWI_Write(0xA2);          // send byte via TWI (device address + W)
  TWI_Write(2);             // send byte (address of EEPROM location)
  TWI_Write(0xAA);          // send data (data to be written)
  TWI_Stop();               // issue TWI stop signal

  Delay_100ms();

  // часть 2
  TWI_Start();              // issue TWI start signal
  TWI_Write(0xA2);          // send byte via TWI (device address + W)
  TWI_Write(2);             // send byte (data address)
  TWI_Start();              // issue TWI signal repeated start
  TWI_Write(0xA3);          // send byte (device address + R)
  PORTA = TWI_Read(0u);     // read data (NO acknowledge)
  TWI_Stop();               // issue TWI stop signal
  eepromData = PORTA;
  RS_Send_Char(eepromData);
  
  Delay_100ms();

  // часть 3
  TWI_Start();              // issue TWI start signal
  TWI_Write(0xA2);          // send byte via TWI (device address + W)
  TWI_Write(1);             // send byte (data address)
  TWI_Start();              // issue TWI signal repeated start
  TWI_Write(0xA3);          // send byte (device address + R)
  PORTA = TWI_Read(0u);     // read data (NO acknowledge)
  TWI_Stop();               // issue TWI stop signal
  eepromData = PORTA;
  RS_Send_Char(eepromData);
  
}

//вывод в терминал
void  RS_Send_Char(char c){
     while ( !(UCSRA & 0b00100000) );  //waiting for ready
     UDR = c;
}

void RS_Send_Text (char *text){
     while ( *text ){
           RS_Send_Char (*text);
           text ++;
     }
}


Схема простейшая: Atmega16 и 24c04. У 24с04 ножки А1 и А2 сидят на общем проводе.
В первой части записывается число АА в память, во второй части оно успешно считывается обратно из памяти, а в третьей я пытаюсь прочитать какую-нибудь другую ячейку, но результат чтения явно не тот, что должен быть.

1. Непонятно, почему именно TWI_Write(0xA2), что за адрес 0хА2, и почему не 159 или 1? Исходя из чего? Я не вижу связи числа 0хА2 с состоянием адресных ножек 24с04.
2. TWI_Write(2); Здесь 2 - это номер ячейки памяти в 24с04? Если так, то почему при чтении из другой ячейки TWI_Write(1); читается не то, что прописано в этой ячейке 24с04, а число А3?
При этом в протеусе 24с04 изначально инициализирована реальной прошивкой, в которой А3 нет ни в одной ячейке.
Какую ячейку не считывай (кроме ячейки 2), получаю число А3. Если вместо TWI_Write(0xA3); сделать например TWI_Write(0x66); - будет со всех ячеек считываться 66.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
DpInRock
сообщение Mar 27 2011, 11:26
Сообщение #2


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



Цитата
В прошивке там по этому адресу записано 0х43.

Что вот это означает?
У вас кто-то заранее туда что-то записал?


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
Ruffian
сообщение Mar 27 2011, 11:36
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 19
Регистрация: 4-03-11
Пользователь №: 63 397



Цитата(DpInRock @ Mar 27 2011, 15:26) *
Что вот это означает?
У вас кто-то заранее туда что-то записал?


Да, в протеусе для 24с04 можно указать начальные данные путём выбора какой-нибудь прошивки.
Есть такой пункт в свойствах 24с04: Initial contents jf memory. Я указал ему реальную прошивку от чипа scx-4200.bin
Go to the top of the page
 
+Quote Post
rezident
сообщение Mar 27 2011, 11:48
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Ruffian @ Mar 27 2011, 17:36) *
Да, в протеусе для 24с04 можно указать начальные данные путём выбора какой-нибудь прошивки.
Хе-хе. Опять Proteus и снова виртуальные глюки виртуального устройства biggrin.gif
Вы, Ruffian, хоть раз попробовали бы проверить работу своей программы на реальном устройстве. После этого ваш Proteus "фтопку" бы выкинули wink.gif
Go to the top of the page
 
+Quote Post
Ruffian
сообщение Mar 27 2011, 12:16
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 19
Регистрация: 4-03-11
Пользователь №: 63 397



Цитата(rezident @ Mar 27 2011, 15:48) *
Хе-хе. Опять Proteus и снова виртуальные глюки виртуального устройства biggrin.gif
Вы, Ruffian, хоть раз попробовали бы проверить работу своей программы на реальном устройстве. После этого ваш Proteus "фтопку" бы выкинули wink.gif


Ну это вторая попытка что-нибудь сделать в протеусе. Первую виртуальную конструкцию тоже написал, отлаживая в протеусе, затем отослал прошивку со схемой человеку, он её залил в реальную конструкцию и конструкция работает.
Поэтому как-то доверял протеусу, вроде серьёзная программа.
Если самому записывать в 24с04 и затем считывать записанное, то всё работает. Как минимум в пределах одного банка точно.
А если протеус фтопку, то как отлаживать? В пошаговом режиме с осциллографом? Много не наладишь так wacko.gif
Go to the top of the page
 
+Quote Post



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

 


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


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