на тему рефераты Информационно-образоательный портал
Рефераты, курсовые, дипломы, научные работы,
на тему рефераты
на тему рефераты
МЕНЮ|
на тему рефераты
поиск
Програма керування енергонезалежної пам’яті AT24C32
p align="left">Команда запису (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)

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

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

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

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

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

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

Висновок

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

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

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

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

3. Microchip AT24C32. - USA: Microchip Technology Incorporated, 2008.

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

5. Описания элементов с шиной 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

(device<<1));

nack();

out_byte(address>>8);

nack();

out_byte(address&0xff);

nack();

start();

out_byte(0xA0

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

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++)

(((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

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

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

Страницы: 1, 2



© 2003-2013
Рефераты бесплатно, курсовые, рефераты биология, большая бибилиотека рефератов, дипломы, научные работы, рефераты право, рефераты, рефераты скачать, рефераты литература, курсовые работы, реферат, доклады, рефераты медицина, рефераты на тему, сочинения, реферат бесплатно, рефераты авиация, рефераты психология, рефераты математика, рефераты кулинария, рефераты логистика, рефераты анатомия, рефераты маркетинг, рефераты релиния, рефераты социология, рефераты менеджемент.