Програма керування енергонезалежної памяті AT24C32

Міністерство освіти і науки України

Національний технічний університет

“Харківський політехнічний інститут”

Кафедра “Обчислювальна техніка та програмування”



Альбом документів курсового проекту

на тему:

Програма керування енергонезалежної пам’яті AT24C32

з дисципліни:

“ Периферійні пристрої ”





xxxx.07126.008 ДКП





Керівник проекту____________ (                   )

«___» ____________ 2009р.



Виконавець____________ (                  )

«___» ____________ 2009p.



















Харків 2009 р.


Анотація



У даному курсовому проекті виконана розробка програми керування пристроєм для читання/записування енергонезалежної пам’яті AT24C32 через LPT-порт ПК з навчальної дисципліни “Периферійні пристрої”. У пояснювальній записці приведені структурна схема системи та таблиця приєднання мікросхеми AT24C32 до порту LPT порту. Розроблені алгоритми та підпрограми читання, записування байту, забезпечена можливість демонстрації виконання цих команд пристрою.



Аннотация



В данном курсовом проекте выполнена разработка программы управления устройством для чтения/записи энергонезависимой памяти AT24C32 через LPT-порт ПК по курсу «Переферийные устройства». В пояснительной записке приведены структурная схема системы и таблица присоединения микросхемы AT24C32 к LPT порту. Разработаны алгоритмы и подпрограммы чтения, записи байта, обеспечена возможность демонстрации выполнения этих команд устройства.



The Annotation.



In this project was made program of controlling read/write procedures electrically erasable memory microchip AT24C32 above LPT port. In report there is structure scheme and table connections microchip AT24C32 to LPT port. Also was made algorithms of next programs: read, write, there is possibility of demonstrations this device commands.



Формат

Зона

ПОзиція

Позначення

Найменування

Кіл.

Примітка























Документація загальна



















А4





КІТ36.07126.008 ТЗ

Техничне завдання

2

















A4





КІТ36.07126.008 П3

Пояснювальна записка

19

















A4





КІТ36.07126.008 Е1

Схема електрична структурна

1

















A4





КІТ36.07126.008 Е3

Схема електрична принципова

1


































































































































































































































































































































































МІНІСТЕРСТВО НАУКИ І ОСВІТИ УКРАІНИ

НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ

“ХАРКІВСЬКИЙ ПОЛІТЕХНІЧНИЙ ІНСТИТУТ”

Кафедра «ОБЧИСЛЮВАЛЬНА ТЕХНІКА та ПРОГРАМУВАННЯ»





ЗАТВЕРДЖЕНО

Завідуючий кафедрою ОТП

__________ (Домнін Ф.А.)

«____» __________ 2009р.





Програма керування енергонезалежної

пам’яті AT24C32

	Технічне завдання

КІТ36.07126.008 ТЗ





Керівник проекту

_____ (Даніленко М. В.)

«___» ____________ 2009р.



Виконавець

_________ (Ладенко М.І.)

«___» ____________ 2009р.









Харків 2009 р.


ТЕХНІЧНЕ ЗАВДАННЯ



1. Найменування й область застосування

1.1 Програма керування енергонезалежної пам’яті AT24C32.

1.2 Область застосування – найчастіше для пересувного обладнання та обладнання з аварійним батарейнім живленням.

		2. Склад виробу, технічні характеристики і рекомендації.

2.1 Вивчити організацію часових характеристик мікросхеми AT24C32 з висновком щодо придатності LPT-порту.

2.2 Розробити алгоритми та тексти підпрограм виконання наступних команд: читання, запису даних.

2.3 Розробити програму демонстрації виконання команд та продемонструвати її викладачеві.

2.4 Розробити текстові документи проекту та оформити звіт.

3. Перелік документів:

3.1 Відомість проекту.

3.2 Технічне завдання.

3.3 Пояснювальна записка.

3.4 Схема електрична структурна – Е1.

3.5 Схема електрична принципова – Е3.


МІНІСТЕРСТВО НАУКИ І ОСВІТИ УКРАІНИ

НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ

“ХАРКІВСЬКИЙ ПОЛІТЕХНІЧНИЙ ІНСТИТУТ”

Кафедра «ОБЧИСЛЮВАЛЬНА ТЕХНІКА та ПРОГРАМУВАННЯ»





ЗАТВЕРДЖЕНО

Завідуючий кафедрою ОТП

__________ (Домнін Ф.А.)

«____» __________ 2009р.





Програма керування енергонезалежної

пам’яті AT24C32

Пояснювальна записка

КІТ36.07126.008 ПЗ





Керівник проекту

_____ (Даніленко М. В.)

«___» ____________ 2009р.



Виконавець

_________ (Ладенко М.І.)

«___» ____________ 2009р.









Харків 2009 р.


РЕФЕРАТ



Пояснювальна записка об’ємом 19 листів. У пояснювальній записці надано 2 таблиці, 4 схеми, використано 5 джерел літератури.

У даному курсовому проекті виконана розробка програми керування пристроєм для читання/записування енергонезалежної пам’яті AT24C32 через LPT-порт ПК з навчальної дисципліни “Периферійні пристрої”. У пояснювальній записці приведені структурна схема системи та таблиця приєднання мікросхеми AT24C32 до порту LPT порту. Розроблені алгоритми та підпрограми читання, записування даних забезпечена можливість демонстрації виконання цих команд пристрою.


Зміст



Вступ

1. Мета проекту

	2. Опис запропонованого технічного рішення

	3. Опис та часові діаграми команд мікросхеми AT24C32

	4. Опис та блок-схеми програми та підпрограм, що обслуговує пристрій

	5. Вибір середовища програмування та розробка програми

	Висновок

	Список джерел інформації

	Додаток А Текст програми

	Додаток Б Таблиця приєднання мікросхеми AT24C32 до порту LPT порту


Вступ



Шина I2C широко використається в побутовій електроніці, передачі даних і промисловій електроніці. Розроблена фірмою Phіlіps проста двохнаправлена 2-провідна шина для ефективного керування та взаємодії різних блоків телевізорів, вона стала використовуватись для зв'язку між собою однокристальних мікроконтролерів, РКИ-індикаторів, портів вводу-виводу, мікросхем пам'яті (особливо энергонезалежної), аналого-цифрових і цифро-аналогових перетворюювачах ланцюгах цифрового настроювання, DTMF кодеров і декодерів, годинників реального часу й т.д.

У цей час, асортименти мікросхем із шиною I2C тільки однієї фірми Phіlіps становить більше чим 150 КМОП і біполярних приборів, а в області енергонезалежної пам'яті середньої ємності (від сотень байт до десятків кілобайт) вона стала стандартом де-факто (серії 24XXX фірм Mіcrochіp, Atmel, і ін.)

Шина I2C являє собою концепцію, що вирішує багато проблем інтерфейсу, з якими зіштовхуються при проектуванні різних апаратів, і має наступні плюси:

- 	Тільки дві лінії - послідовна лінія даних (SDA) і послідовна лінія синхронізації (SCL)

-	Кожний елемент, з'єднаний із шиною є програмно-адресуемим своєю унікальною адресою. При цьому відносини між ними можуть бути побудовані на простому принципі master/slave або ж може бути побудована multі-master система.

-	Це дійсна шина, з можливістю роботи в multі-master середовищу, включаючи перевірку на перетинання й арбітраж.

-	Послідовна, 8-розрядна двунаправленная передача даних може проводитися зі швидкістю від 0 до 100 kbіt/s у стандартному режимі або до 400 kbіt/s у швидкісному режимі (не для всіх типів мікросхем). При реалізації власних пристроїв можливі застосування й більше високих швидкостей при збереженні ідеології шини I2C.

-	Фільтрація сигналів усередині мікросхем забезпечує нечутливість до викидів на лінії шини даних.

-	Число пристроїв, які можуть бути з'єднані однією шиною, обмежено тільки максимальною ємністю шини 400 pF.


1. Мета проекту



Ознайомитися з принципами роботи наступних команд мікросхеми AT24C32 : читання, запису даних. Розробити програму, яка забезпечить можливість демонстрації цих команд.



2. Опис запропонованого технічного рішення



Структурна схема системи наведена у Додатку А. Для роботи з мікросхемою AT24C32 ми використовуємо LPT порт ( за базовою адресою 378Н). Вихід мікросхеми SСL ми подаємо на регістр даних (DR за адресою 378H) до розряду DR0, вихід мікросхеми SDА ми подаємо на регістр даних до розряду CR0. Три (DR3, DR4, DR5) розряди регістру даних ми використовуємо для подачі живлення на мікросхему. Таблиця приєднання мікросхеми AT24C32 до порту LPT порту наведена у Додатку Б.

	

3. Опис та часові діаграми команд мікросхеми 24LC08В



Команда читання (RANDOM_READ) – це команда читання даних, що дозволяє читати дані випадковим способом з будь-якої ділянки пам’яті. Для організації цієї команди необхідно за допомогою надіслання певної комбінації кодів( так, як показано на рисунку 3.1 ) задати адресу та блок пам’яті звідки ми збираємося читати дані.





Рисунок 3.1 Часова діаграма команди читання


Команда читання (CURRENT_ADDRESS_READ) – це команда читання даних, що дозволяє читати дані з адреси останнього слова доступу збільшеного на 1. Для організації цієї команди необхідно за допомогою надіслання певної комбінації кодів( так, як показано на рисунку 3.1 ) задати адресу та блок пам’яті звідки ми збираємося читати дані.





Рисунок 3.2 Часова діаграма команди читання

	

Команда запису (BYTE_WRITE) – це команда запису байту. Вона виконується за допомогою надіслання такої комбінації кодів яка показана на рисунку 3.2. Для ії організації треба задати адрес та блок пам'яті, куди буде записуватись байт. Після того, як байт запишеться необхідно подати сигнал стоп, а потім подавати сигнал старт та керуючий байт до того, доки байт не запишется.





Рисунок 3.3 Часова діаграма команди запису




4. Опис та блок-схеми програми та підпрограм, що обслуговує пристрій



Список констант:

DATA

0х378 – адреса регістру даних

STATUS

0х379 – адреса регістру стану

CONTROL

0х37А – адреса регістру керування



Список функцій:

high_SDA()

Встановлює 1 на лінії SDA

low_SDA()

Встановлює 0 на лінії SDA

high_SCL()

Встановлює 1 на лінії SDL

low_SCL()

Встановлює 0 на лінії SDL

nack()

Повертає зачення сигналу ACK

Start()

Надсилає команду START

Stop()

Надсилає команду STOP

out_byte(byte o_byte)

Надсилає байт

in_byte()

Зчитує байт

write_byte(int device, int address, byte data)

Записує вказаний байт за вказаною адресою

read_random_data(int device, int address)

Зчитує байт за випадковою адресою(в межах 4кб)

read_cur_adr()

Зчитує байт за поточною адресою

write_to_file(int adr)

Зчитує байт до файлу

void test(void)

Виконує перевірку роботоздатності






Початок

Start();

Кінець

Надсилаємо Старт 

1

2

3

4

5

6

Out_byte(address&0xff);



7

Надсилає адресу пристрою та команду запису

Надсилаємо сигнал  стоп

Надсилаємо інформаційний байт

Надсилаємо молодший байт адреси

Out_byte(0xa0 | (device<<1));

Out_byte(address>>8);



Stop();

Out_byte(data);





Надсилаємо старший байт адреси

Рисунок 1 Блок-схема підпрограми виконання команди WRITE_BYTE




Початок

out_byte(0xA0 | (device<<1));

Кінець



1

2

3

4

5

6

Out_byte(address&0xff);



7

   Надсилаємо Старт 



Надсилаємо сигнал старт

Start();

out_byte(address>>8);

Start();

Надсилає адресу пристрою та       команду запису

8

9

in_byte();

10

Надсилаємо сигнал стоп

out_byte(0xA0 | (device<<1) | 0x01)

Stop();

Зчитуємо байт

Надсилає адресу пристрою та команду читання

Надсилаємо молодший байт адреси

Надсилаємо старший байт адреси

Рисунок 2 Блок-схема підпрограми виконання команди RANDOM_READ




Початок

Start();

Кінець

Надсилаємо Старт 

1

2

3

4

5

6

   Надсилає адресу пристрою та команду зчитування

Надсилаємо сигнал стоп

Зчитуємо інформаційний байт

out_byte(0xA0 | (device<<1) | 0x01);

in_byte();

Stop();

Рисунок 3 Блок-схема підпрограми виконання команди CUR_ADR_READ



5. Вибір середовища програмування та розробка програми



Для реалізації підпрограм та програми ми вибрали Borland C++, оскільки на мові C++ найпростіше напряму працювати з портами LPT порту. За алгоритмами, які наведені у попередньому пункту ми розробили діалогову програму, яка забезпечила можливість демонстрації команд читання та запису.


Висновок



В результаті виконання даного курсового проекту ми знайомилися з принципами роботи наступних команд мікросхеми AT24C32 : читання, запису даних. Розробили програму, яка забезпечила можливість демонстрації цих команд.


Список джерел інформації



			Шилдт Г. Теория и практика С++. – СПб.: БХВ-Петербург, 1999. – 416с.

			Шилдт Г. Самоучитель С++ . – СПб.: БХВ-Петербург, 2001. – 688с.

			Microchip AT24C32. – USA: Microchip Technology Incorporated, 2008.

			Шина I2C – Харьков Александр Торрес 1997

			Описания элементов с шиной I2C, например даташиты I2C-EEPROM серии 24XXX фирмы Microchip (www.microchip.com)


Додаток А



Текст програми

#include <stdio.h>

#include <conio.h>

#include <process.h>

#include <stdlib.h>

#include <dos.h>

#include <iostream.h>

#define DATA 0x0378

#define STATUS DATA+1

#define CONTROL DATA+2

typedef unsigned char byte;

void write_byte(int device, int address, byte data);

byte read_random_data(int device, int address);

byte read_cur_adr(void);

void enter_adr(void);

void write_to_file(int adr);

void write_page(int device, int address, byte data);

void out_byte(byte o_byte);

byte in_byte(void);

byte ack(void);

byte nack(void);

void test(void);

void start(void);

void stop(void);

void low_SDA(void);

void high_SDA(void);

void low_SCL(void);

void high_SCL(void);

void main(void)

{

clrscr();

// test();

char c;

byte i_byte;



puts("Press 1 to write byte\nPress 2 to read all data\nPress 3 to read data from curent location\nPress 4 to write data to file\nPress ESC to exit program");

while(c!=27)

{

c=getch();

switch(c)

{

case '1':

{

enter_adr();

break;

}



case '2':

{

for(int adr=0x0000;adr<0x000f;adr++)

{

//write_byte(0x5, adr, 0x00);

i_byte=read_random_data(0x5,adr);

printf("\n %x", i_byte);

}

break;

}

case '3':

{

i_byte=read_cur_adr(); // read data from the same location and display it

printf("\nDATA IS %x\n", i_byte);

break;

}

case '4':

{

int adr;

puts("Enter adr\n");

cin>>adr;

write_to_file(adr);

break;

}

}

}

}

void test(void)

{

puts("Displaying testing of work.To cancel press any key");

while(!kbhit())

{

high_SDA();

delay(1000);

low_SDA();

high_SCL();

delay(1000);

low_SCL();

}

}

void write_page(int device, int address, byte data)//build

{

byte ack_bit;

start();

out_byte(0xA0 | (device<<1));

nack();

out_byte(address>>8);

nack();

out_byte(address&0xff);

nack();

start();



out_byte(0xA0 | (device<<1) | 0x01);

nack();

i_byte=in_byte();

nack();

stop();

return(i_byte);

}

void enter_adr(void)

{

byte dev=0x5;

int adr,val,n_val;

byte i_byte;

char *c;

char buf[12];

printf("Please enter adress in HEX\n");

cin>>adr;

printf("Please enter value to write in HEX\n");

cin>>val;

write_byte(dev,adr,val);

n_val=read_random_data(dev,adr);

printf("Value is %x on adress %x\n",n_val,adr);

puts("Insert text of no more then 12 symbols");

cin>>c;

for( int i=0;i<12;i++)

buf[i]=*(c+i);

for(i=0;i<12;i++)

printf("%c",buf[i]);

adr=0x00;

for( i=0;i<12;i++)

{

write_byte(dev,adr,buf[i]);

adr++;

}

adr=0x00;

for( i=0;i<12;i++)

{

i_byte=read_random_data(dev,adr);

printf("\n%c",i_byte);

adr++;

}

}

void write_byte(int device, int address, byte data)

{

byte ack_bit;

start();

out_byte(0xA0 | (device<<1));



nack();

out_byte(address>>8);

nack();

out_byte(address&0xff);

nack();

out_byte(data);

nack();

stop();

}



byte read_cur_adr(void)

/* read from specified address. return fetched data */

{

byte i_byte,ack_bit;

int device=0x5;

start();			/* start with no stop */

out_byte(0xA0 | (device<<1) | 0x1);

ack_bit=nack();

if(ack_bit==1)

{

printf("error_reading\n");



}

i_byte=in_byte();		/* fetch the byte */

nack();

stop();

return(i_byte);

}

void out_byte(byte o_byte)

/* shift out byte, beginning with most significant bit */

{

int n;

for(n=7; n>=0; n--)

{ 		/* note SCL is low during transitions on SDA */

if (((o_byte >>n) & 0x01) == 0)

{

low_SDA();

}

else

{

high_SDA();

}

else

{

high_SDA();

}

high_SCL();

low_SCL();

}

}



byte in_byte(void)

/* fetch byte, most significant byte first */

{

byte i_byte=0;

int n;



high_SDA();

for (n=0; n<8; n++)

{

high_SCL();

i_byte=(i_byte << 1) | (((inportb(STATUS)>>7)^0x01)&0x01);

/* note inversion on last significant bit of status! port ??? */

low_SCL();

}

return(i_byte);

}



/*byte ack(void)

{

byte ack_bit;

low_SDA();

high_SCL();

if ((((inportb(STATUS)>>7)^0x01)&0x01)==0)

{

ack_bit=0;

}

else

{

ack_bit=1;

}

low_SCL();

return(ack_bit);

} */



byte nack(void)

{

byte ack_bit;

high_SDA();

high_SCL();

if ((((inportb(STATUS)>>7)^0x01)&0x01)==0)

{

ack_bit=0;

}

else

{

ack_bit=1;

}

low_SCL();

// printf("\nACK = %x\n",ack_bit);

return(ack_bit);

}



void start(void)

/* bring SDA high to low while SCL is high */

{

high_SDA();

high_SCL();

low_SDA(); /* bring SDA low while clock is high */

low_SCL();

}



void stop(void)

/* bring SDA low to high while SCL is high */

{

low_SDA();

high_SCL();

high_SDA(); /* bring SDA high while clock is high */

low_SCL();

}



void low_SDA(void)

{

outportb(CONTROL, 0x00^0x01);

delay(5);

}



void high_SDA(void) /* makes output high impedance */

{

outportb(CONTROL, 0x01^0x01);

delay(5);

}



void low_SCL(void)

{

outportb(DATA, 0xE);

delay(5);

}



void high_SCL(void)

{

outportb(DATA, 0xF);

delay(5);

}


Додаток Б



Таблиця приєднання мікросхеми AT24C32 до порту LPT порту

Регістри та розряди LPT порту

Входи та виходи мікросхеми AT24C32

DR3-5

живлення

СR0

вхід SDA

DR0

вхід SCL




Схема електрична структурна





LPT-порт

Блок перетво-

рення

Енергонезалежна пам'ять

AT24C32



Схема електрична принципова