با سلام
دوستان عزیز من می خواستم آی سی EEPROM رو با xmega32a4 راه اندازی کنم ولی کلا مو ندم توش اگه میشه راهنمایی کنید.:(:(:(:(
باتشکر
نمایش نسخه قابل چاپ
با سلام
دوستان عزیز من می خواستم آی سی EEPROM رو با xmega32a4 راه اندازی کنم ولی کلا مو ندم توش اگه میشه راهنمایی کنید.:(:(:(:(
باتشکر
سلام
مهندس از كدوم كامپايلر ميخواي استفاده كني؟ BASCOM يا Coevision؟ ...
با تشکر
از کامپایلر avrstudio استفاده می کنم فرقی نداره کدوم کامپایلر فقط زبان C
با سلام
مهندس خودتون برنامه اي براي راه اندازي اين آي.سي نوشتين؟
اگه نوشتين لطفا اينجا بذاريد.
سلام
می تونین از اینجا یه نمونه کد بگیرین،البته اگه قبلا ندیدینش.
[Dear Guest/Member you can't see link before replyclick here to register]
با سلام به دوستان
درباره این کدی که اقای پوریا در پست قبلی دادن کسی است من رو راهنمایی کنه.:(:(:(:(
باتشکر
این هم از کد هاش :
[PHP]#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,&EEPR OM_Address_Data[0],2,0);
while (twiMaster.status != TWIM_STATUS_READY);
TWI_MasterWriteRead(&twiMaster,SLAVE_ADDRESS,&DIGI TS[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,&EEPR OM_Address_Data[0],2,0);
while (twiMaster.status != TWIM_STATUS_READY);
TWI_MasterWriteRead(&twiMaster,SLAVE_ADDRESS,&DIGI TS[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,&EEPR OM_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);
}
[/PHP]تو این تابع 2 بایت ارسال می شود به ادرسی که عنصر ارایه صفر است ....آیا درست است ؟
[PHP] TWI_MasterWriteRead(&twiMaster,SLAVE_ADDRESS,&EEPR OM_Address_Data[0],2,0);[/PHP]
دوستان برنامه رو به این صورت تغییر دادم ولی برنامه از این به بعد اجرا نمیشه یعنی بعد از این دو خط که نمایش دیتا تو LCD است هیچ دیتایی نمایش داده نمی شود....
[PHP]TWI_MasterWriteRead(&twiMaster,SLAVE_ADDRESS,&writ e_Data,3,3);
while (twiMaster.status != TWIM_STATUS_READY);[/PHP]این هم برنامه :
[PHP]/*
* 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,&writ e_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);
} [/PHP]
سلام مهندس
قبل از اینکه اون خط رو تغییر بدید تو ال.سی.دی چی نشون میداد؟
راستی برنامه درست اجرا میشه؟
با تشکر
نه منظورم این بود که این تابع
[PHP]TWI_MasterWriteRead(&twiMaster,SLAVE_ADDRESS,&writ e_Data,3,3);[/PHP]
اجرا نمیشه و در این خط می مونه . می خواستم ببینم مشکل از کجاست ؟
برنامه قبل از این تابع اجرا میشه
مهندس میتونید بیشتر توضیح بدید که چرا اینطوری تغییر دادید؟
منظورم اینه که میخواستید با این تغییر چه کاری رو براتون انجام بده؟
سلامنقل قول:
نوشته اصلی توسط arm-mohsen-avr [Dear Guest/Member you can't see link before replyclick here to register]
مهندس تو تعریف این تابع عنوان شده که این تابع برای خوندن یا نوشتن هستش. شما نمیتونید با این تابع در آن واحد هم داده رو بخونی و بنویسی.
اگر دقت کرده باشید یه دستور بعد از این خط آورده شده یعنی این:
کد:while (twiMaster.status != TWIM_STATUS_READY);
این دستور بعد از هر با اجرا شده تابع TWI_MasterWriteRead چک میکنه که تابع برای اجرا دستور بعدی آماده هستش یا نه؟
برنامه رو به این صورت تغییر دادم ولی کار نمی کنه از دوستانی که با at24cxx کار کردن میشه راهنمایی کنند. در این برنامه خروجی data=0 هستش ..که همش صفر است
[PHP]/*
* 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);
} [/PHP]
سلام
فكر ميكنم شايد مشكل از اين دو تا دستور باشه حتي بر فرض هم اگه كل برنامه درست اجرا بشه يه نكته وجو داره شما تو اين دستور:
کد:eepromwrite(10,2);
گفتين كه مقدار داده 10 رو در آدرس 2 ذخيره كن.
و تو اين دستور:
کد:read_Data[0]=eepromread(200);
گفتين كه مقدار داده ذخيره شده از آدرس 200 رو بخون.
تو آدرس 200 مگه چيزي ذخيره شده.؟!؟