PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : کمک در راه اندازی AT24C64 با xmega32a4



arm-mohsen-avr
24-01-2012, 14:52
با سلام
دوستان عزیز من می خواستم آی سی EEPROM رو با xmega32a4 راه اندازی کنم ولی کلا مو ندم توش اگه میشه راهنمایی کنید.:(:(:(:(
باتشکر

sadmonew
24-01-2012, 15:05
سلام
مهندس از كدوم كامپايلر ميخواي استفاده كني؟ BASCOM يا Coevision؟ ...

arm-mohsen-avr
24-01-2012, 15:08
با تشکر
از کامپایلر avrstudio استفاده می کنم فرقی نداره کدوم کامپایلر فقط زبان C

sadmonew
24-01-2012, 21:15
با سلام
مهندس خودتون برنامه اي براي راه اندازي اين آي.سي نوشتين؟
اگه نوشتين لطفا اينجا بذاريد.

pooriya
24-01-2012, 21:59
سلام

می تونین از اینجا یه نمونه کد بگیرین،البته اگه قبلا ندیدینش.

Object reference not set to an instance of an object. (You can see links before reply)

arm-mohsen-avr
29-01-2012, 12:57
با سلام به دوستان
درباره این کدی که اقای پوریا در پست قبلی دادن کسی است من رو راهنمایی کنه.:(:(:(:(
باتشکر

arm-mohsen-avr
29-01-2012, 12:57
این هم از کد هاش :

#include "avr_compiler.h"
#include "twi_master_driver.h"
#include "KEY_7SEG.h"
#define SLAVE_ADDRESS 0x50
#define CPU_SPEED 2000000
#define BAUDRATE 100000
#define TWI_BAUDSETTING TWI_BAUD(CPU_SPEED, BAUDRATE)

TWI_Master_t twiMaster; /*!< TWI master module. */
unsigned char EEPROM_Address_Data[8]={0,0,0,0,0,0,0,0};

void main(void)
{
unsigned char key_code=nokey_code;
unsigned char old_key_code=nokey_code;
unsigned char DIGITS[6]={0,0,0,0,0,0};
unsigned char i=0,j;
/* Initialize TWI master. */
TWI_MasterInit(&twiMaster,&TWIC,TWI_MASTER_INTLVL_LO_gc,TWI_BAUDSETTING);
init_7seg();
init_key();
__enable_interrupt();

TWI_MasterWriteRead(&twiMaster,SLAVE_ADDRESS,&EEPROM_Address_Data[0],2,0);
while (twiMaster.status != TWIM_STATUS_READY);
TWI_MasterWriteRead(&twiMaster,SLAVE_ADDRESS,&DIGITS[0],0,6);
while (twiMaster.status != TWIM_STATUS_READY);
for(j=0;j<6;j++)DIGITS[j]=twiMaster.readData[j];
show_7seg(DIGITS,0x00,0x00);

while(1)
{
key_code=get_key();
if (key_code!= old_key_code)
{
old_key_code=key_code;
if (key_code!=nokey_code)
{
if (key_code==10)
{
TWI_MasterWriteRead(&twiMaster,SLAVE_ADDRESS,&EEPROM_Address_Data[0],2,0);
while (twiMaster.status != TWIM_STATUS_READY);
TWI_MasterWriteRead(&twiMaster,SLAVE_ADDRESS,&DIGITS[0],0,6);
while (twiMaster.status != TWIM_STATUS_READY);
for(j=0;j<6;j++)DIGITS[j]=twiMaster.readData[j];
show_7seg(DIGITS,0x00,0x00);
}
else if (key_code==11)
{
for(j=0;j<6;j++)EEPROM_Address_Data[j+2]=DIGITS[j];
TWI_MasterWriteRead(&twiMaster,SLAVE_ADDRESS,&EEPROM_Address_Data[0],8,0);
while (twiMaster.status != TWIM_STATUS_READY);
}

else
{
DIGITS[i]=key_code;
i++;
if (i==6) i=0;
show_7seg(DIGITS,0x00,0x00);
}
}
}
}
}

/*! TWIC Master Interrupt vector. */
ISR(TWIC_TWIM_vect)
{
TWI_MasterInterruptHandler(&twiMaster);
}


تو این تابع 2 بایت ارسال می شود به ادرسی که عنصر ارایه صفر است ....آیا درست است ؟

TWI_MasterWriteRead(&twiMaster,SLAVE_ADDRESS,&EEPROM_Address_Data[0],2,0);

arm-mohsen-avr
29-01-2012, 15:01
دوستان برنامه رو به این صورت تغییر دادم ولی برنامه از این به بعد اجرا نمیشه یعنی بعد از این دو خط که نمایش دیتا تو LCD است هیچ دیتایی نمایش داده نمی شود....

TWI_MasterWriteRead(&twiMaster,SLAVE_ADDRESS,&write_Data,3,3);
while (twiMaster.status != TWIM_STATUS_READY);این هم برنامه :

/*
* TWI_24C64.c
*
* Created: 01/24/2012 02:06:08 ق.ظ
* Author: DELLN4030
*/
#include <avr/io.h>
#include "lcd.h"
#include <avr/delay.h>
#include <stdio.h>
#include "avr_compiler.h"
#include "twi_master_driver.h"
#define SLAVE_ADDRESS 0x50
#define CPU_SPEED 2000000
#define BAUDRATE 100000
#define TWI_BAUDSETTING TWI_BAUD(CPU_SPEED, BAUDRATE)
TWI_Master_t twiMaster; /*!< TWI master module. */
uint8_t write_Data[8] = {0 ,0 , 0xaa};
char read_Data[8];
char eepromread(int add);
void eepromwrite(unsigned char data,int add);

int main(void)
{
lcd_init(LCD_DISP_ON);
unsigned char i=0,j;
char lcd_buff[20];
/* Initialize TWI master. */
TWI_MasterInit(&twiMaster,&TWIE,TWI_MASTER_INTLVL_LO_gc,TWI_BAUDSETTING);
PMIC.CTRL |= PMIC_LOLVLEN_bm;
sei();

TWI_MasterWriteRead(&twiMaster,SLAVE_ADDRESS,&write_Data,3,3);
while (twiMaster.status != TWIM_STATUS_READY);

lcd_gotoxy(0,0);
lcd_puts("EEPROM XMEGA");


while(1)
{
eepromwrite(55,1);
read_Data[0]=eepromread(1);
lcd_gotoxy(1,1);
sprintf(lcd_buff,"data=%x ",read_Data[0]);
lcd_puts(lcd_buff);
_delay_ms(3000);
}
}


/*! TWIC Master Interrupt vector. */
ISR(TWIC_TWIM_vect)
{
TWI_MasterInterruptHandler(&twiMaster);
}


//read's a byte from memory
char eepromread(int add)
{
uint8_t local_data[2];
local_data[0] = add>>8;
local_data[1] = add;

TWI_MasterWriteRead(&twiMaster, SLAVE_ADDRESS, local_data, 2, 0);
while (twiMaster.status != TWIM_STATUS_READY);

TWI_MasterWriteRead(&twiMaster, SLAVE_ADDRESS, 0, 0, 1);
while (twiMaster.status != TWIM_STATUS_READY);

return twiMaster.readData[0];

}

//write's a byte to memory
void eepromwrite(unsigned char data,int add)
{
uint8_t local_data[3];

local_data[0] = add>>8;
local_data[1] = add;
local_data[2] = data;

TWI_MasterWriteRead(&twiMaster, SLAVE_ADDRESS, local_data, 3, 0);
while (twiMaster.status != TWIM_STATUS_READY);

}

sadmonew
29-01-2012, 16:16
سلام مهندس
قبل از اینکه اون خط رو تغییر بدید تو ال.سی.دی چی نشون میداد؟
راستی برنامه درست اجرا میشه؟

arm-mohsen-avr
29-01-2012, 16:31
با تشکر
نه منظورم این بود که این تابع

TWI_MasterWriteRead(&twiMaster,SLAVE_ADDRESS,&write_Data,3,3);
اجرا نمیشه و در این خط می مونه . می خواستم ببینم مشکل از کجاست ؟
برنامه قبل از این تابع اجرا میشه

sadmonew
29-01-2012, 16:40
مهندس میتونید بیشتر توضیح بدید که چرا اینطوری تغییر دادید؟
منظورم اینه که میخواستید با این تغییر چه کاری رو براتون انجام بده؟

sadmonew
29-01-2012, 17:05
با تشکر
نه منظورم این بود که این تابع

TWI_MasterWriteRead(&twiMaster,SLAVE_ADDRESS,&write_Data,3,3);
اجرا نمیشه و در این خط می مونه . می خواستم ببینم مشکل از کجاست ؟
برنامه قبل از این تابع اجرا میشه
سلام
مهندس تو تعریف این تابع عنوان شده که این تابع برای خوندن یا نوشتن هستش. شما نمیتونید با این تابع در آن واحد هم داده رو بخونی و بنویسی.
اگر دقت کرده باشید یه دستور بعد از این خط آورده شده یعنی این:


while (twiMaster.status != TWIM_STATUS_READY);

این دستور بعد از هر با اجرا شده تابع TWI_MasterWriteRead چک میکنه که تابع برای اجرا دستور بعدی آماده هستش یا نه؟

arm-mohsen-avr
29-01-2012, 22:59
برنامه رو به این صورت تغییر دادم ولی کار نمی کنه از دوستانی که با at24cxx کار کردن میشه راهنمایی کنند. در این برنامه خروجی data=0 هستش ..که همش صفر است


/*
* TWI_24C64.c
*
* Created: 01/24/2012 02:06:08 ق.ظ
* Author: N4030
*/
#include <avr/io.h>
#include "lcd.h"
#include <avr/delay.h>
#include <stdio.h>
#include "avr_compiler.h"
#include "twi_master_driver.h"
#define SLAVE_ADDRESS 0x50
#define CPU_SPEED 2000000
#define BAUDRATE 100000
#define TWI_BAUDSETTING TWI_BAUD(CPU_SPEED, BAUDRATE)
TWI_Master_t twiMaster; /*!< TWI master module. */
//uint8_t write_Data[8] = {0 ,0 , 0xaa};

unsigned char eepromread(int add);
void eepromwrite(unsigned char data,int add);

int main(void)
{
lcd_init(LCD_DISP_ON);
unsigned char i=0,j;
char lcd_buff[20];
unsigned char read_Data[8],read_status;
TWI_MasterInit(&twiMaster,&TWIC,TWI_MASTER_INTLVL_LO_gc,TWI_BAUDSETTING);
PMIC.CTRL |= PMIC_LOLVLEN_bm;
sei();

lcd_gotoxy(0,0);
lcd_puts("EEPROM XMEGA");


while(1)
{

eepromwrite(10,2);
read_Data[0]=eepromread(200);
lcd_gotoxy(1,1);
sprintf(lcd_buff,"data=%d ", read_Data[0]);
lcd_puts(lcd_buff);
_delay_ms(2000);
lcd_clrscr();

}
}


/*! TWIC Master Interrupt vector. */
ISR(TWIC_TWIM_vect)
{
TWI_MasterInterruptHandler(&twiMaster);
}


//read's a byte from memory
unsigned char eepromread(int add)
{
uint8_t local_data[2];
char lcd_buff[20];
local_data[0] = add>>8;
local_data[1] = add;

TWI_MasterWriteRead(&twiMaster, SLAVE_ADDRESS, local_data, 2, 0);
while (twiMaster.status != TWIM_STATUS_READY);

TWI_MasterWriteRead(&twiMaster, SLAVE_ADDRESS, 0, 0, 1);
while (twiMaster.status != TWIM_STATUS_READY);

return twiMaster.readData[0];

}

//write's a byte to memory
void eepromwrite(unsigned char data,int add)
{
uint8_t local_data[3];
local_data[0] = add>>8;
local_data[1] = add;
local_data[2] = data;

TWI_MasterWriteRead(&twiMaster, SLAVE_ADDRESS, local_data, 3, 0);
while (twiMaster.status != TWIM_STATUS_READY);

}

sadmonew
29-01-2012, 23:12
سلام
فكر ميكنم شايد مشكل از اين دو تا دستور باشه حتي بر فرض هم اگه كل برنامه درست اجرا بشه يه نكته وجو داره شما تو اين دستور:


eepromwrite(10,2);

گفتين كه مقدار داده 10 رو در آدرس 2 ذخيره كن.
و تو اين دستور:


read_Data[0]=eepromread(200);

گفتين كه مقدار داده ذخيره شده از آدرس 200 رو بخون.
تو آدرس 200 مگه چيزي ذخيره شده.؟!؟