تبلیغات در پرشین تولز

PDA

View Full Version : میکرو کنترلرها


..hamid..
04-17-2005, 07:04 PM
این تاپیک باز کردم تا مباحث مربوط به میکروکنترلها رو اینجا انجام بدیم.

به عنوان اولین سوال کسی درباره priority of interruptsچيزي ميدونه؟8051 ها اين قابليت رو ندارند.

daftarekhaterat
04-17-2005, 07:19 PM
موضوع ميكرو ها واقعا جزو مباحث جذاب الكترونيكه. من خيلي در اين مورد چيزي نميدونم اما گمون ميكنم اين قابليت در 8051 باشه. يه رجيستر هم واسه اينكار بود. اگه اشتباه نكنم IP بود. البته دقيقا نميدونم كارش چيه.

..hamid..
04-17-2005, 07:29 PM
http://chaokhun.kmitl.ac.th/~kswichit/
اینجا رو هم داشته باشید.کلی پروژه 8051 هست

daftarekhaterat
04-17-2005, 07:36 PM
من پيشنهاد ميكنم اگه كسي پروژه قشنگ و ساده و پركاربردي پيدا كرد بياره وسط تا روش كار كنيم. شايد هم قسمت شد مدار رو بستيم و كار رو به سوددهي رسونديم!

solarisco
04-18-2005, 10:49 AM
راجع به priority of interrupts توی datasheet یکی از این میکروها (at89c51snd1) یک همچین توضیحی دیدم

A low-priority interrupt is always interrupted by a higher priority interrupt but not by
another interrupt of lower or equal priority. Higher priority interrupts are serviced before
lower priority interrupts. The response to simultaneous occurrence of equal priority interrupts
is determined by an internal hardware polling sequence

..hamid..
04-18-2005, 03:27 PM
اینو تا حالا صد بار خوندم. میشه موضوعش رو برام باز کنی.به طور عادی 8051 ها یه ترتیب اینتراپتی دارند.که تو at89c51snd1 هم وجود داره.ولی این میکرو 4 تا رجیستر IPH0,IPH1,IPL0,IPL1 داره که حق تقدم ها رو با اون تعیین می کنند.حالا میخوام ببینم فرق اینکه ما حق تقدم رو تعیین کنیم با اونی که از قبل وجود داشته(مثل 8051ها) چه فرقی دارند؟

solarisco
04-18-2005, 04:44 PM
فکر کنم منظورت
response to simultaneous occurrence of equal priority interrupts is determined by an internal hardware polling sequence

هست که میگه اگه دو وقفه با حق تقدم یکسان همزمان اتفاق بیفته در این حالت بترتیب اولویت سخت افزاری ( hardware polling sequence ) به وقفه با اولویت بالاتر جواب داده خواهد شد

در کل من نگرفتم که این درجه بندیا ینی چی ؟
1- ینی اگه مثلا تقدم counter timer پایینتر از وقفه خارجی باشه وقتی شمارش کانتر تموم شد و وقفه ایجاد شد میکروکنترلر
یه اون جواب نمیده و منتظر وقفه خارجی میمونه ؟

2- یا اینکه در حالت قبل وقتی وقفه تایمر کانتر ایجاد شد به اون جواب میده و اگه در حین اجرای روال پاسخگویی به وقفه تایمر کانتر وقفه خارجی ایجاد شد چون تقدم وقفه خارجی بالاتر هست از پاسخگویی به وقفه تایمر بیرون میاد و به وقفه خارجی جواب میده ؟
یا اینکه هیچکدوم از اینایی که کفتم نیست ؟
لطفا یه مقدار توضیح بدین
ارادت

mohammad123
04-19-2005, 03:03 PM
در 8051دو سطح وقفه وجود داره .رجيستري به اسم IPهست كه مي شه با يك يا صفر كردن بيتهاي
اين رجيستر ,تقدم وقفه مورد نظرمون رو تعيين كنيم .مقدار صفر براي تقدم پايين و مقدار 1 براي تقدم بالا
استفاده ميشه .
اگه ما اين رجيستر رو مقدار دهي نكنيم و يا اينكه دو وقفه اي كه داراي سطح تقدم يكسان(0 يا 1) هستند
با هم اتفاق بيفتن , ميكرو تقدم هاي پيش فرض رو در مورد اونها اعمال مي كنه .
اولويت پيش فرض وقفه ها در 8051 ازين قرارند:
خارجي 0 - تايمر 0 - خارجي 1 -تايمر 1 - پورت سريال

..hamid..
04-19-2005, 05:04 PM
تا اینجا که دوستمون محمد گفتند درست. منم این نتیجه گیری رو کردم.
اگر مثلا تقدم تایمر 1 رو از تایمر 0 بالاتر قرار دهیم و دو حالت رو در نظر بگیریم:
1-میکرو در حال انجام روتینی به وسیله تایمر 1 باشد:> اگر تایمر 0 اینتراپت بدهد میکرو هیچ پاسخی نمی دهد
2-میکرو در حال انجام روتینی به وسیله تایمر0باشد:> اگر تایمر 1 اینتراپت بدهد عملیات تایمر 0 قطع و به اینتراپت 1 رسیدگی می شود.
دیگه نمی دونم چقدر درست گفتم

..hamid..
04-19-2005, 05:06 PM
راستی روتینی به زبان c برای کنترل IDE پیدا کردم. کسی هست برنامه نویسی میکرو به زبان c رو بلد باشه؟

mohammad123
04-19-2005, 05:30 PM
راستی روتینی به زبان c برای کنترل IDE پیدا کردم. کسی هست برنامه نویسی میکرو به زبان c رو بلد باشه؟

كتاب C8051 در همين مورد هست .

solarisco
04-21-2005, 09:11 AM
سپاس از شما
حمید جون فکر میکنی اگه c یاد داشته باشیم مشکل حله؟ به نظر من باید باید سیستم این ide/atapi رو بدونیم تا بشه یه کاری کرد تازشم اون برنامه که میگی چون مال این میکرو شما نیست چجوری میخوایی روی اون بریزی؟

..hamid..
04-21-2005, 12:41 PM
ببینید این همون برنامه است. خیلی هم زیاده . به نظرم مربوط به یه میکروی خاصی نیست
//************************************************** *****************************
// ata.c
//
// This file contains all the functions and definitions used to control any
// ata compliant hard drive. It also contains the function used to read, and
// manipulate the FAT32 file system
//************************************************** *****************************
// CB_ERR ERROR REGISTER BITS
#define ATA_ER_BBK 0x80 // ATA bad block
#define ATA_ER_UNC 0x40 // ATA uncorrected error
#define ATA_ER_MC 0x20 // ATA media change
#define ATA_ER_IDNF 0x10 // ATA id not found
#define ATA_ER_MCR 0x08 // ATA media change request
#define ATA_ER_ABRT 0x04 // ATA command aborted
#define ATA_ER_NTK0 0x02 // ATA track 0 not found
#define ATA_ER_NDAM 0x01 // ATA address mark not found
// CB_DH bits 7-4 OF THE DEVICE/HEAD REGISTER
#define ATA_DH_DEV0 0xE0 // select device 0 LBA MODE
#define ATA_DH_DEV1 0xF0 // select device 1 LBA MODE
// CB_STAT REGISTER BITS
#define ATA_STAT_BSY 0x80 // ATA busy
#define ATA_STAT_RDY 0x40 // ATA ready
#define ATA_STAT_DF 0x20 // ATA device fault
#define ATA_STAT_SKC 0x10 // ATA seek complete
#define ATA_STAT_DRQ 0x08 // ATA data request
#define ATA_STAT_CORR 0x04 // ATA corrected
#define ATA_STAT_IDX 0x02 // ATA index
#define ATA_STAT_ERR 0x01 // ATA error
// CB_DC REGISTER BITS
#define ATA_DC_HD15 0x08 // bit should always be set to one
#define ATA_DC_SRST 0x04 // soft reset
#define ATA_DC_NIEN 0x02 // disable interrupts
//ATA commands (from ATA-3),
#define CMD_CFA_ERASE_SECTORS 0xC0
#define CMD_CFA_REQUEST_EXT_ERR_CODE 0x03
#define CMD_CFA_TRANSLATE_SECTOR 0x87
#define CMD_CFA_WRITE_MULTIPLE_WO_ERASE 0xCD
#define CMD_CFA_WRITE_SECTORS_WO_ERASE 0x38
#define CMD_CHECK_POWER_MODE1 0xE5
#define CMD_CHECK_POWER_MODE2 0x98
#define CMD_DEVICE_RESET 0x08
#define CMD_EXECUTE_DEVICE_DIAGNOSTIC 0x90
#define CMD_FLUSH_CACHE 0xE7
#define CMD_FORMAT_TRACK 0x50
#define CMD_IDENTIFY_DEVICE 0xEC
#define CMD_IDENTIFY_DEVICE_PACKET 0xA1
#define CMD_IDENTIFY_PACKET_DEVICE 0xA1
#define CMD_IDLE1 0xE3
#define CMD_IDLE2 0x97
#define CMD_IDLE_IMMEDIATE1 0xE1
#define CMD_IDLE_IMMEDIATE2 0x95
#define CMD_INITIALIZE_DRIVE_PARAMETERS 0x91
#define CMD_INITIALIZE_DEVICE_PARAMETERS 0x91
#define CMD_NOP 0x00
#define CMD_PACKET 0xA0
21
#define CMD_READ_BUFFER 0xE4
#define CMD_READ_DMA 0xC8
#define CMD_READ_DMA_QUEUED 0xC7
#define CMD_READ_MULTIPLE 0xC4
#define CMD_READ_SECTORS 0x20
#define CMD_READ_VERIFY_SECTORS 0x40
#define CMD_RECALIBRATE 0x10
#define CMD_SEEK 0x70
#define CMD_SET_FEATURES 0xEF
#define CMD_SET_MULTIPLE_MODE 0xC6
#define CMD_SLEEP1 0xE6
#define CMD_SLEEP2 0x99
#define CMD_STANDBY1 0xE2
#define CMD_STANDBY2 0x96
#define CMD_STANDBY_IMMEDIATE1 0xE0
#define CMD_STANDBY_IMMEDIATE2 0x94
#define CMD_WRITE_BUFFER 0xE8
#define CMD_WRITE_DMA 0xCA
#define CMD_WRITE_DMA_QUEUED 0xCC
#define CMD_WRITE_MULTIPLE 0xC5
#define CMD_WRITE_SECTORS 0x30
#define CMD_WRITE_VERIFY 0x3C
//ATA I/O PORT FUNCTIONS AND ADDRESS DEFINITIONS
//*CONTROL BLOCK REGISTERS
// RESET
// |DIOW
// ||DIOR
// |||DA0
// ||||DA1
// |||||DA2
// ||||||CS0
// |||||||CS1
// ||||||||
#define ATA_IO_HIZ 0b11111111
#define ATA_IO_ASTAT 0b11101110
#define ATA_IO_DEVICECNTL 0b11101110
//*COMMAND BLOCK REGISTER ADDRESSES
#define ATA_IO_DATA 0b11100001
#define ATA_IO_ERROR 0b11110001
#define ATA_IO_FEATURES 0b11110001
#define ATA_IO_SECTORCNT 0b11101001
#define ATA_IO_SECTORNUM 0b11111001
#define ATA_IO_CYL_L 0b11100101
#define ATA_IO_CYL_H 0b11110101
#define ATA_IO_DEVICE_HEAD 0b11101101
#define ATA_IO_STATUS 0b11111101
#define ATA_IO_CMD 0b11111101
//PIC PIN definitions
//PLACE all ATA connection PINS here*******************************
#define PORT_ATA_DATA_L_DDR TRISB
#define PORT_ATA_DATA_H_DDR TRISD
#define PORT_ATA_DATA_L_OUT PORTB
#define PORT_ATA_DATA_H_OUT PORTD
#define PORT_ATA_DATA_L_IN PORTB
#define PORT_ATA_DATA_H_IN PORTD
#define ATA_CS1_OUT PIN_A4
#define ATA_CS0_OUT PIN_A3
#define ATA_DA2_OUT PIN_A2
#define ATA_DA1_OUT PIN_A1
#define ATA_DA0_OUT PIN_A0
#define ATA_DIOR_OUT PIN_E0
#define ATA_DIOW_OUT PIN_E1
22
#define ATA_RESET_OUT PIN_E2
#define ATA_CS1 0x01
#define ATA_CS0 0x02
#define ATA_DA2 0x04
#define ATA_DA1 0x08
#define ATA_DA0 0x10
#define ATA_DIOR 0x20
#define ATA_DIOW 0x40
#define ATA_RESET 0x80
#define avr_databus_in PORT_ATA_DATA_L_DDR = 0xFF; \
PORT_ATA_DATA_H_DDR = 0xFF;
#define avr_databus_out PORT_ATA_DATA_L_DDR = 0x00; \
PORT_ATA_DATA_H_DDR = 0x00;
#define ata_write_pulse io_control_port &= ~ATA_DIOW; \
PORT_ATA_IO_CNTL (io_control_port); \
delay_us(1); \
io_control_port |= ATA_DIOW; \
PORT_ATA_IO_CNTL (io_control_port);
//shortcuts
#define busy ata_bsy()
#define drq ata_drq()
#define error ata_err()
#define ready ata_rdy()
#define hard_reset ata_hard_reset()
#define select_device_0 ata_select_device(0x00)
#define select_device_1 ata_select_device(0x01)
#define recalibrate ata_send_cmd(CMD_RECALIBRATE)
#define identify_device ata_send_cmd(CMD_IDENTIFY_DEVICE)
#define BytsPerSec_OS 0x0B //16 Bits Always 512 Bytes
#define SecPerClus_OS 0x0D //8 Bits 1,2,4,8,16,32,64,128
#define RsvdSecCnt_OS 0x0E //16 Bits Usually 0x20
#define NumFATs_OS 0x10 //8 Bits Always 2
#define FATSz32_OS 0x24 //32 Bits Depends on disk size
#define RootClus_OS 0x2C //32 Bits Usually 0x00000002
#define BPB_BytsPerSec 512
#define Extension_OS 0x09 //Location in Root Dir where file extension is kept
#define Size_OS 0x1C //Location in Root Dir where File size is kept
#define HighClus_OS 0x14
#define LowClus_OS 0x1A
char ata_read_sector (long lbasectorLOW, long lbasectorHIGH, long offset);
char ata_write_sector ( float lbasector, long offset);
void ata_select_device(char device);
long ata_write_word (long wordout);
void init_ata (void);
void ata_identify (void);
long ata_read_word (void);
void ata_write_byte (char atabyte);
void ata_set_io_addr (char ataaddr);
void ata_send_cmd (char atacmd);
char ata_get_status_byte(void);
void ata_hard_reset(void);
long ata_rdy(void);
long ata_bsy(void);
long ata_drq(void);
long ata_err(void);
long recvchar( void );
23
void cls (void);
void PORT_ATA_IO_CNTL (int makePort);
void get_mbr (void);
void GetFAT32_Entry( long Cluster_NumLOW, long Cluster_NumHIGH);
void FirstSectorofCluster (long Cluster_NumLOW, long Cluster_NumHIGH);
void get_mbrAddress (void);
void init (void);
void download_data (void);
char readRootDir (void);
static char io_control_port;
int ATA_BUFFER [64] ;
char BPB_SecPerClus;
long BPB_RsvdSecCnt;
long BPB_FATSz32LOW;
long BPB_FATSz32HIGH;
long BPB_RootClusLOW;
long BPB_RootClusHIGH;
long FirstDataSectorLOW;
long FirstDataSectorHIGH;
long FatSectorOffset;
long FirstSectorofClusterLOW;
long FirstSectorofClusterHIGH;
long Fat32EntryLOW;
long Fat32EntryHIGH;
long FATOffset;
long partitionBegin;
//************************************************** ****************
//* INITIALIZE DRIVE
//* This routine assumes Drive 0 is the only drive attached.
//*
//************************************************** ****************
void init_ata(void)
{
#ifdef debug
do{
ata_get_status_byte();
}
#endif
while(!ready & busy);
hard_reset;
delay_ms(10);
#ifdef debug
do{
ata_get_status_byte();
}
#endif
while(!ready & busy);
select_device_0;
#ifdef debug
do{
ata_get_status_byte();
}
#endif
while(!ready & busy);
recalibrate;
#ifdef debug
do{
ata_get_status_byte();
24
}
#endif
while(busy);
#ifdef debug
ata_set_io_addr(ATA_IO_SECTORCNT);
ata_write_byte(0x3F);
while(busy);
ata_set_io_addr(ATA_IO_DEVICE_HEAD);
ata_write_byte(0xAF);
while(busy);
ata_send_cmd(CMD_INITIALIZE_DEVICE_PARAMETERS);
while(busy);
#endif
// if(error)
// puts("ERROR!");
// puts("\r\nDrive is READY! \r\n");
}
//************************************************** ****************
//* SELECT ATA DEVICE
//* This routine defaults to Drive 0 as the target drive.
//*
//************************************************** ****************
void ata_select_device(char device)
{
io_control_port = ATA_IO_DEVICE_HEAD;
POR T_ATA_IO_CNTL (io_control_port);
switch (device)
{
case 0x00:
ata_write_byte(ATA_DH_DEV0);
break;
case 0x01:
ata_write_byte(ATA_DH_DEV1);
break;
default:
ata_write_byte(ATA_DH_DEV0);
break;
}
}
//************************************************** ****************
//* SET ATA I/O ADDRESS
//* This routine sets the ATA I/O address.
//*
//************************************************** ****************
void ata_set_io_addr( char ataaddr)
{
io_control_port = ataaddr;
PORT_ATA_IO_CNTL (io_control_port);
}
//************************************************** ****************
//* READ WORD FROM ATA DEVICE
//* This routine does not use SRAM as a buffer.
//*
//************************************************** ****************
long ata_read_word(void)
25
{
long ata_word_read,ata_byte_read;
avr_databus_in;
io_control_port = ATA_IO_DATA;
PORT_ATA_IO_CNTL (io_control_port);
io_control_port &= ~ATA_DIOR;
PORT_ATA_IO_CNTL (io_control_port);
// delay_us(1);
ata_byte_read = PORT_ATA_DATA_H_IN;
ata_word_read = ata_byte_read << 8;
ata_byte_read = PORT_ATA_DATA_L_IN;
ata_word_read |= ata_byte_read;
io_control_port|= ATA_DIOR;
PORT_ATA_IO_CNTL (io_control_port);
io_control_port = ATA_IO_HIZ;
PORT_ATA_IO_CNTL (io_control_port);
return ata_word_read;
}
//************************************************** ****************
//* WRITE WORD TO ATA DEVICE
//* This routine does not use SRAM as a buffer.
//*
//************************************************** ****************
long ata_write_word(long wordout)
{
long returncode;
avr_databus_out;
PORT_ATA_DATA_H_OUT = wordout >> 8;
PORT_ATA_DATA_L_OUT = wordout;
io_control_port = ATA_IO_DATA;
PORT_ATA_IO_CNTL (io_control_port);
ata_write_pulse;
io_control_port = ATA_IO_HIZ;
PORT_ATA_IO_CNTL (io_control_port);
avr_databus_in;
return returncode;
}
//************************************************** ****************
//* WRITE A BYTE TO THE ATA I/O
//* This routine writes a byte on the lower 8 bits of the data bus.
//*
//************************************************** ****************
void ata_write_byte(char atabyte)
{
avr_databus_out;
PORT_ATA_DATA_L_OUT = atabyte;
ata_write_pulse;
io_control_port = ATA_IO_HIZ;
PORT_ATA_IO_CNTL (io_control_port);
avr_databus_in;
}
//************************************************** ****************
//* SEND ATA COMMAND
//* Sends an ATA command out of lower 8 bits of data bus.
//*
//************************************************** ****************
void ata_send_cmd(char atacmd)
{
26
io_control_port = ATA_IO_CMD;
PORT_ATA_IO_CNTL (io_control_port);
avr_databus_out;
PORT_ATA_DATA_L_OUT = atacmd;
ata_write_pulse;
io_control_port = ATA_IO_HIZ;
PORT_ATA_IO_CNTL (io_control_port);
avr_databus_in;
}
//************************************************** ****************
//* READ STATUS BYTE
//* Read ATA status byte.
//*
//************************************************** ****************
char ata_get_status_byte(void)
{
char ata_byte_read;
avr_databus_in;
io_control_port = ATA_IO_STATUS;
PORT_ATA_IO_CNTL (io_control_port);
io_control_port &= ~ATA_DIOR;
PORT_ATA_IO_CNTL (io_control_port);
// delay_us(1);
ata_byte_read = PORT_ATA_DATA_L_IN;
io_control_port |= ATA_DIOR;
PORT_ATA_IO_CNTL (io_control_port);
io_control_port = ATA_IO_HIZ;
PORT_ATA_IO_CNTL (io_control_port);
avr_databus_in;
return ata_byte_read;
}
//************************************************** ****************
//* READ REGISTER
//*
//*
//************************************************** ****************
char ata_get_register(char cbreg)
{
char ata_byte_read;
avr_databus_in;
io_control_port = cbreg;
PORT_ATA_IO_CNTL (io_control_port);
io_control_port &= ~ATA_DIOR;
PORT_ATA_IO_CNTL (io_control_port);
// delay_us(1);
ata_byte_read = PORT_ATA_DATA_L_IN;
io_control_port |= ATA_DIOR;
PORT_ATA_IO_CNTL (io_control_port);
io_control_port = ATA_IO_HIZ;
PORT_ATA_IO_CNTL (io_control_port);
avr_databus_in;
return ata_byte_read;
}
//************************************************** ****************
//* PERFORM HARDWARE RESET
//* This routine toggles ATA RESET line low for 10ms.
//*
27
//************************************************** ****************
void ata_hard_reset(void)
{
avr_databus_in;
io_control_port = ATA_IO_HIZ;
PORT_ATA_IO_CNTL (io_control_port);
io_control_port &= ~ATA_RESET;
PORT_ATA_IO_CNTL (io_control_port);
delay_ms(10);
io_control_port |= ATA_RESET;
PORT_ATA_IO_CNTL (io_control_port);
}
//************************************************** ****************
//* CHECK ATA READY BIT
//* Checks READY status bit.
//* Returns 1 if device is ready.
//************************************************** ****************
long ata_rdy(void)
{
char ata_byte_read;
avr_databus_in;
// delay_us(1);
io_control_port = ATA_IO_STATUS;
PORT_ATA_IO_CNTL (io_control_port);
io_control_port &= ~ATA_DIOR;
PORT_ATA_IO_CNTL (io_control_port);
// delay_us(1);
ata_byte_read = PORT_ATA_DATA_L_IN;
io_control_port |= ATA_DIOR;
PORT_ATA_IO_CNTL (io_control_port);
io_control_port = ATA_IO_HIZ;
PORT_ATA_IO_CNTL (io_control_port);
if(ata_byte_read & ATA_STAT_RDY)
return 1;
else
return 0;
}
//************************************************** ****************
//* CHECK ATA BUSY BIT
//* Checks READY status bit.
//* Returns 1 if device is busy.
//************************************************** ****************
long ata_bsy(void)
{
char ata_byte_read;
avr_databus_in;
// delay_us(1);
io_control_port = ATA_IO_STATUS;
PORT_ATA_IO_CNTL (io_control_port);
io_control_port &= ~ATA_DIOR;
PORT_ATA_IO_CNTL (io_control_port);
// delay_us(1);
ata_byte_read = PORT_ATA_DATA_L_IN;
io_control_port |= ATA_DIOR;
PORT_ATA_IO_CNTL (io_control_port);
io_control_port = ATA_IO_HIZ;
PORT_ATA_IO_CNTL (io_control_port);
if(ata_byte_read & ATA_STAT_BSY)
return 1;
else
return 0;
}
28
//************************************************** ****************
//* CHECK ATA DRQ BIT
//* Checks READY status bit.
//* Returns 1 if device is requesting service.
//************************************************** ****************
long ata_drq(void)
{
char ata_byte_read;
avr_databus_in;
// delay_us(1);
io_control_port = ATA_IO_STATUS;
PORT_ATA_IO_CNTL (io_control_port);
io_control_port &= ~ATA_DIOR;
PORT_ATA_IO_CNTL (io_control_port);
// delay_us(1);
ata_byte_read = PORT_ATA_DATA_L_IN;
io_control_port |= ATA_DIOR;
PORT_ATA_IO_CNTL (io_control_port);
io_control_port = ATA_IO_HIZ;
PORT_ATA_IO_CNTL (io_control_port);
if(ata_byte_read & ATA_STAT_DRQ)
return 1;
else
return 0;
}
//************************************************** ****************
//* CHECK ATA ERROR BIT
//* Checks READY status bit.
//* Returns 1 if device is reporting an error condition.
//************************************************** ****************
long ata_err(void)
{
char ata_byte_read;
avr_databus_in;
// delay_us(1);
io_control_port = ATA_IO_STATUS;
PORT_ATA_IO_CNTL (io_control_port);
io_control_port &= ~ATA_DIOR;
PORT_ATA_IO_CNTL (io_control_port);
// delay_us(1);
ata_byte_read = PORT_ATA_DATA_L_IN;
io_control_port |= ATA_DIOR;
PORT_ATA_IO_CNTL (io_control_port);
io_control_port = ATA_IO_HIZ;
PORT_ATA_IO_CNTL (io_control_port);
if(ata_byte_read & ATA_STAT_ERR)
return 1;
else
return 0;
}
//Function to set the ATA control Port (based on CC code)
void PORT_ATA_IO_CNTL (int makePort)
{
if (bit_test (makePort, 7))
output_high (ATA_RESET_OUT);
else
output_low (ATA_RESET_OUT);
if (bit_test (makePort, 6))
output_high (ATA_DIOW_OUT) ;
else
29
output_low (ATA_DIOW_OUT);
if (bit_test (makePort, 5))
output_high (ATA_DIOR_OUT);
else
output_low (ATA_DIOR_OUT);
if (bit_test (makePort, 4))
output_high (ATA_DA0_OUT);
else
output_low (ATA_DA0_OUT);
if (bit_test (makePort, 3))
output_high (ATA_DA1_OUT);
else
output_low (ATA_DA1_OUT);
if (bit_test (makePort, 2))
output_high (ATA_DA2_OUT);
else
output_low (ATA_DA2_OUT);
if (bit_test (makePort, 1))
output_high (ATA_CS0_OUT);
else
output_low (ATA_CS0_OUT);
if (bit_test (makePort, 0))
output_high (ATA_CS1_OUT);
else
output_low (ATA_CS1_OUT);
}
//************************************************** ******************************
// This function reads the first sector of the hard drive (MASTER BOOT RECORD).
// Values are taken from various offsets within the sector to find out where the
// first partition begins. Needed values are put into global variables for future
// referemce.
//************************************************** ******************************
void get_mbr (void)
{
long temp1, temp2, temp3, helpme;
ata_read_sector (partitionBegin, 0, 0); //find the start of the partition and save
//Value to the global variable "partitionBegin"
BPB_SecPerClus = ATA_BUFFER [SecPerClus_OS];
BPB_RsvdSecCnt = ATA_BUFFER[RsvdSecCnt_OS + 1];
BPB_RsvdSecCnt = BPB_RsvdSecCnt << 8;
BPB_RsvdSecCnt |= ATA_BUFFER[RsvdSecCnt_OS];
BPB_FATSz32LOW = ATA_BUFFER [FATSz32_OS + 1];
BPB_FATSz32LOW = BPB_FATSz32LOW << 8;
BPB_FATSz32LOW |= ATA_BUFFER [FATSz32_OS];
BPB_FATSz32HIGH = ATA_BUFFER [FATSz32_OS + 3];
BPB_FATSz32HIGH = BPB_FATSz32HIGH << 8;
BPB_FATSz32HIGH |= ATA_BUFFER [FATSz32_OS + 2];
BPB_RootClusLOW = ATA_BUFFER [RootClus_OS + 1];
BPB_RootClusLOW = BPB_RootClusLOW << 8;
BPB_RootClusLOW |= ATA_BUFFER [RootClus_OS];
30
BPB_RootClusHIGH = ATA_BUFFER [RootClus_OS + 3];
BPB_RootClusHIGH = BPB_RootClusHIGH << 8;
BPB_RootClusHIGH |= ATA_BUFFER [RootClus_OS + 2];
//Attain all valuable numbers that give fat/rootdir/cluster numbers
//The first data sector is attained by the formula: BPB_ResvdSecCnt + (#of_fats * FatSz)
//this formula needs to be doctored because the PCM compiler wont handle 32 bit ints
temp1 = BPB_FATSz32HIGH; //Fill temp variables
temp1 *= 2; //Multiply by # of fats
temp2 = BPB_FATSz32LOW;
if (bit_test (temp2, 15)) //If lower word is going to overflow,
temp1 += 1; //add one to upper word
temp2 *= 2;
FirstDataSectorHIGH = temp1;
FirstDataSectorLow = temp2 ; //Multiply lower word by 2
temp3 = BPB_RsvdSecCnt; //Now add RsvdSecCnt
FirstDataSectorLOW += BPB_RsvdSecCnt;
if (bit_test (STATUS, 0))
FirstDataSectorHIGH += 1;
FirstDataSectorLOW += partitionBegin;
if (bit_test (STATUS, 0))
FirstDataSectorHIGH += 1;
}
/************************************************** **************/
/* FirstSectorofCluster */
/* */
/* Description: */
/* Converts a cluster located in the data section of the extent */
/* into a Sector Number(LBA) */
/************************************************** **************/
void FirstSectorofCluster (long Cluster_NumLOW, Cluster_NumHIGH)
{
long temp1, temp2, temp3, resultLOW = 0, overflow = 0, resultHIGH = 0;
int xxxx, divideme;
// printf("getting FirstSectorofCluster\r\n");
temp1 = Cluster_NumLOW;
temp2 = Cluster_NumHIGH;
if (temp1 == 0)
{
temp2 -= 1;
temp1 = 0xFFFE;
}
else if (temp1 == 1)
{
temp2 -= 1;
temp1 = 0xFFFF;
}
else
temp1 -= 2;
31
if (BPB_SecPerClus != 1)
{
if (bit_test (BPB_SecPerClus, 1))
divideme = 1;
else if (bit_test (BPB_SecPerClus, 2))
divideme = 2;
else if (bit_test (BPB_SecPerClus, 3))
divideme = 3;
else if (bit_test (BPB_SecPerClus, 4))
divideme = 4;
else if (bit_test (BPB_SecPerClus, 5))
divideme = 5;
else if (bit_test (BPB_SecPerClus, 6))
divideme = 6;
else if (bit_test (BPB_SecPerClus, 7))
divideme = 7;
for (xxxx = 0; xxxx < divideme; xxxx++)
{
temp2 = temp2 << 1;
temp2 &= 0xFFFE;
temp1 = temp1 << 1;
temp1 &= 0xFFFE;
if (bit_test (STATUS, 0))
bit_set(temp2, 0);
}
}
resultLOW = temp1;
resultHIGH = temp2;
resultLOW += FirstDataSectorLow;
if (bit_test (STATUS, 0))
resultHIGH += 1;
resultHIGH += FirstDataSectorHIGH;
FirstSectorofClusterLOW = resultLOW;
FirstSectorofClusterHIGH = resultHIGH;
}
/* Description: */
/* Returns the FAT32 Entry for the given Cluster Number. */
/* The FAT32 Entry is the next cluster number of the cluster */
/* chain. **May return a termination */
/* */
/* if Fat32_Entry >= 0x0FFFFFF8 EOC (End of Chain) */
/* if Fat32_Entry == 0x0FFFFFF7 Bad Cluster */
/************************************************** **************/
void GetFAT32_Entry( long Cluster_NumLOW, long Cluster_NumHIGH)
{
long FatSectorNumLOW, FatSectorNumHIGH, fatOffsetLOW, fatOffsetHIGH;
long temp1, temp2, shiz;
int xxx;
fatOffsetLOW = Cluster_NumLOW; //Multiply x 4
32
fatOffsetHIGH = Cluster_NumHIGH;
// printf("getting Fat32_Entry\r\n");
fatOffsetHIGH = fatOffsetHIGH << 1;
fatOffsetLOW = fatOffsetLOW << 1;
if (bit_test (STATUS, 0))
fatOffsetHIGH += 1;
fatOffsetHIGH = fatOffsetHIGH << 1;
fatOffsetLOW = fatOffsetLOW << 1;
if (bit_test (STATUS, 0))
fatOffsetHIGH += 1;
//Fat offsets HIGH and LOW are now multiplied by 4
//Divide by 512
temp2 = fatOffsetHIGH;
temp1 = fatOffsetLOW;
for (xxx = 0; xxx < 9; xxx++)
{
temp1 = temp1 >> 1;
temp1 &= 0x7FFF;
temp2 = temp2 >> 1;
if (bit_test (STATUS, 0))
bit_set(temp1, 15);
temp2 &= 0x7FFF;
}
FatSectorNumLOW = temp1;
FatSectorNumHIGH = temp2;
FATOffset = (fatOffsetLOW & 0x01FF);
FatSectorNumLOW += BPB_RsvdSecCnt;
if (bit_test (STATUS, 0))
FatSectorNumHIGH += 1;
FatSectorNumLOW += partitionBegin;
if (bit_test (STATUS, 0))
FatSectorNumHIGH += 1;
ata_read_sector (FatSectorNumLOW, FatSectorNumHIGH, FATOffset);
Fat32EntryLOW = ATA_BUFFER [1];
Fat32EntryLOW = Fat32EntryLOW << 8;
Fat32EntryLOW |= ATA_BUFFER [0];
Fat32EntryHIGH = ATA_BUFFER[3] ;
Fat32EntryHIGH = Fat32EntryHIGH << 8;
Fat32EntryHIGH |= ATA_BUFFER[2];
Fat32EntryHIGH &= 0x0FFF;
}
//************************************************** ****************
//* READ A SECTOR
//* device = 0x00 or 0x01
//* This routine reads an LBA-addressed sector into a SRAM page.
//************************************************** ****************
char ata_read_sector(long lbasectorLOW, long lbasectorHIGH, long offset)
{
33
unsigned int x, junk1, junk2 ;
unsigned long i;
char temp1, temp2, count = 0;
offset = ((offset / 2) & 0x1FF);
// printf("\n\n\r Offset = %lu\n\n\r", offset);
ata_set_io_addr(ATA_IO_DEVICE_HEAD);
while(busy);
ata_set_io_addr(ATA_IO_CYL_H);
ata_write_byte(lbasectorHIGH);
// printf("\r\ncylh %x\r\n",ata_get_register(ATA_IO_CYL_H));
while(busy);
ata_set_io_addr(ATA_IO_CYL_L);
ata_write_byte(lbasectorLOW >> 8);
// printf("cyll %x\r\n",ata_get_register(ATA_IO_CYL_L));
while(busy);
ata_set_io_addr(ATA_IO_SECTORNUM);
ata_write_byte(lbasectorLOW);
// printf("sector %x\r\n\n",ata_get_register(ATA_IO_SECTORNUM));
while(busy);
ata_set_io_addr(ATA_IO_SECTORCNT);
ata_write_byte(0x01);
while(busy);
ata_send_cmd(CMD_READ_SECTORS);
while(busy);
while(!drq);
x = 0;
for(i=0; i < 256; ++i)
{
avr_databus_in;
while(busy);
io_control_port = ATA_IO_DATA;
PORT_ATA_IO_CNTL (io_control_port);
io_control_port &= ~ATA_DIOR;
PORT_ATA_IO_CNTL (io_control_port);
temp1 = PORT_ATA_DATA_H_IN;
temp2 = PORT_ATA_DATA_L_IN;
if ((offset <= i) && (x < 64 ))
{
ATA_BUFFER [x] = temp2;
ATA_BUFFER [x+1] = temp1;
x += 2;
}
// delay_us(2);
io_control_port|= ATA_DIOR;
PORT_ATA_IO_CNTL (io_control_port);
io_control_port = ATA_IO_HIZ;
PORT_ATA_IO_CNTL (io_control_port);
while(busy);
}
return (error);
}
//************************************************** ***************************

solarisco
04-21-2005, 03:04 PM
یحتمل این برنامه برای میکروهای شرکت pic هست اگه دقت کنی دستوری مثل TRISB وجود داره که برای pic هاست
خب نتیجه سرچش گوگل برای 8051 و همینطور قابل استفاده بودن atapi (به در cd-rom هم بخوره)
http://www.pjrc.com/tech/mp3/sideprojects/atapi/mp3-atapi.zip

برای pic همراه با طرح فیبر و نقشه مدار (زبان asm)
http://mesh.dl.sourceforge.net/sourceforge/mp3public/mp3public-initial.zip
برای pic میکرو (16f877 ) و زبان asm (اسمبل )
http://citkit.dl.sourceforge.net/sourceforge/mp3public/mp3public-firmware-v1.2.3.zip
و ..
حمید جون شما گفتی با usb پروگرام کردید لطفا برنامشو معرفی کنید +لینک
ارادت

..hamid..
04-23-2005, 04:46 PM
solarisco جان نكنه شما هم mp3player مي سازي
من با flip كار كردم
http://www.atmel.com/dyn/resources/prod_documents/flip-2_4_2.zip
دست شما هم درد نكنه

pinnacle
06-09-2005, 11:47 AM
با سلام خدمت اساتيد محترم
اگه كسي با AT89C51SND1 كار كرده در راه خدا مشكل منو حل كنه.
من FLIP 4.4.2 رو نصب كردم و يه مدار آزمايشي هم ساختم تا بتونم ميكرو رو پروگرام كنم ولي وقتي ميخوام تو برنامه FLIP پورت USB رو OPEN كنم پيغام ميده كه درايور USB بايد نصب بشه!!!
راه حلي براي اين مشكل دارين؟

..hamid..
06-09-2005, 09:55 PM
باید بهت بگو شانس آوردی اینجا رو دیدی
من با USB پروگرم کردم. سایت اتمل یه فایل جدید inf تو قسمت flip گذاشته . اونو دانلود کن. بعد وقتی usb رو وصل کردی و کامپیتر new divice داد این فایل رو بهش معرفی می کنی. با این کار درایورت رو نصب می کنی. بعد flip مدارتو می شناسه.
در ضمن ایمیل من اینه: hamid.mk@gmail.com
اگه می خواهی شماتیک مدارت رو بفرست تا بررسیش کنم. من خودم تا مرحله ای پیش رفتم که audio اش راه افتاده. و تو خروجی صدا دارم. مونده اتصال mmc. خوشحال میشم در مورد کارت هم بیشتر توضیح بدی و هم اینکه یه همفکری داشته باشیم.

pinnacle
06-10-2005, 11:23 AM
باید بهت بگو شانس آوردی اینجا رو دیدی
من با USB پروگرم کردم. سایت اتمل یه فایل جدید inf تو قسمت flip گذاشته . اونو دانلود کن. بعد وقتی usb رو وصل کردی و کامپیتر new divice داد این فایل رو بهش معرفی می کنی. با این کار درایورت رو نصب می کنی. بعد flip مدارتو می شناسه.
در ضمن ایمیل من اینه: hamid.mk@gmail.com
اگه می خواهی شماتیک مدارت رو بفرست تا بررسیش کنم. من خودم تا مرحله ای پیش رفتم که audio اش راه افتاده. و تو خروجی صدا دارم. مونده اتصال mmc. خوشحال میشم در مورد کارت هم بیشتر توضیح بدی و هم اینکه یه همفکری داشته باشیم.

من وقتي اينجارو ديدم خيلي خوشحال شدم البته با گوگل اينجا رو پيدا كردم مگر نه فكر نميكردم چنين بحثهايي اينجا مطرح شه.
از اينكه با شما آشنا شدم خيلي خوشحالم.و خوشحال تر ميشم با هم همفكري داشته باشيم.من حدودا يك هفته هست كه پيگير طراحي MP3 Player هستم و علتش هم اول علاقه ام به اين كار بوده.كار به نظر من كار بسيار تو پريه و خيلي مطلب داره.
فايل inf رو تو سايت نديدم.اگه ميشه آدرس دقيقش رو اينجا بگذار. شماهم از FLIP 4.4.2 استفاده ميكننين؟

..hamid..
06-10-2005, 02:49 PM
سایتو دیدم . اون پچ رو برداشته و همین ورژن جدیدی که شمت دانلود کردید رو گذاشته. من از 2.4.2 استفاده می کنم.
راستی به فرض همه کارا رو کردی. خروجی صدا رو می خواهی چی کار کنی؟ از چه DAC می خواهی استفاده کنی؟

یه سوال دیگه اینکه میکرو رو کی و از کجا گرفتی ؟ الان دیگه تو بازار نیست. خود اتمل هم میگه snd2 رو بگیرید!!

pinnacle
06-10-2005, 07:47 PM
در مورد خروجي صدا اگر IC كه منطبق با I2S پيدا نكردم اونوقت مجبورم IC رو سفارش بدم و از بازار خارجي تهيه كنم.
ميكرو رو از نمايندگي ATMEL تو پاساژ امجد (مجيد كو)گرفتم.

..hamid..
06-11-2005, 12:26 AM
UDA1330ats شماره dac هست . بایدم سفارش بدی. تو ایران نیست
منم از مجید کو گرفتم. الان ظاهرا تموم کرده

pinnacle
06-11-2005, 12:59 PM
حتما كه نبايد UDA1330ats باشه.ميشه از ICهايي كه منطبق با I2s هستن استفاده كرد.البته با داشتن شماره IC فكر نميكنم بشه تو بازار به جايي رسيد.بايد گشت توي دستگاههاي مختلف مثل پخش ماشين يا هر سيستمي كه با صداي ديجيتال يا انتقال اون سرو كار داره يه IC پيدا كرد.اگه نشد راهي جز سفارش خارجي نيست.
شما UDA1330ats رو داري؟چون گفته بودين كه تو خروجي صدا دارم ميپرسم.

..hamid..
06-11-2005, 03:13 PM
آره

الان بازار snd2 هست؟. با اون دیگه به dac خارجی نیازی نداریم

pinnacle
06-11-2005, 05:01 PM
نه هنوز نيومده.:(
فكر كنم شما پيگير DAC باشي زودتر نتيجه بگيري.

ali313
10-20-2005, 09:11 PM
به نظر شما بهترین راه حل برای اینکه من یه دیتا بیس ساده با eeprom بسازم که هم کم حجم باشه هم بازدهی بالا چیه ؟

..hamid..
10-22-2005, 06:54 AM
بستگی داره می خواهی چی کار کنی؟ اگه دیتات زیاد نباشه از 64 کیلو خود میکرو هم میتونی استفاده کنی (snd1)
البته میکرو های مختلفم حافظه های مختلفی دارند.

Mehdi
10-22-2005, 04:55 PM
يه پروژه من بگم
همين قسمت الكترونيك يه تاپيك هست به اسم
برنامه نويسي و سخت افزار:::قفل
تو اين تاپيك بيايد يه قفل سخت افزاري بنويسيم :d

edisonkocholo
10-23-2005, 06:54 AM
سلام
میخواستم ببینم کسی تا حالا با LCD گرافیکی کار کرده یا چیزی میدونه من میخوام اونو با 8051 راه بندازم.:( خوشحال میشم کمکم کنید.

edisonkocholo
10-24-2005, 07:35 AM
يه پروژه من بگم
همين قسمت الكترونيك يه تاپيك هست به اسم
برنامه نويسي و سخت افزار:::قفل
تو اين تاپيك بيايد يه قفل سخت افزاري بنويسيم :d

سلام
این کارو با یدون 89c51 میتونی به سادگی انجام بدی.
برای اینکه حجمشم کم بشه میتونی از 89c2051 استفاده کنی
چون 8051 send & recive سریال داره .
وکار کردن با ان خیلی آسون.:lol:

behzad53a
10-24-2005, 06:01 PM
سلام
میخواستم ببینم کسی تا حالا با LCD گرافیکی کار کرده یا چیزی میدونه من میخوام اونو با 8051 راه بندازم.:( خوشحال میشم کمکم کنید.

من با LCD گرافيكي كار كردم. خوب مشكلتو بگو ببينم ميتونم كمك كنم يا نه.

:cool:

edisonkocholo
10-25-2005, 01:04 AM
من با LCD گرافيكي كار كردم. خوب مشكلتو بگو ببينم ميتونم كمك كنم يا نه.

:cool:
سلام
چه خوب :D
اول از همه میخوام ببینم این السیدی ها را با 8051 میشه راه انداخت؟
اگه جواب + است .طریقه فرمان دادن به lcd چجورییه و چطور باید دیتا را براش بفرستیم؟
ممنون:blush:

behzad53a
10-26-2005, 04:23 PM
سلام
چه خوب :D
اول از همه میخوام ببینم این السیدی ها را با 8051 میشه راه انداخت؟
اگه جواب + است .طریقه فرمان دادن به lcd چجورییه و چطور باید دیتا را براش بفرستیم؟
ممنون:blush:

بله با 8051 ميشه.
اول بايد بگي چه نوع LCD استفاده ميكني؟ كنترلر داره يا نداره؟
اگه كنترلر داره ،‌كنترلرش چيه؟ Part Number
اگه نداره، خود LCD چي داره؟ منظورم datasheet و Part Number و ...

خوب . منتظرم.:cool:

edisonkocholo
10-26-2005, 08:19 PM
بله با 8051 ميشه.
اول بايد بگي چه نوع LCD استفاده ميكني؟ كنترلر داره يا نداره؟
اگه كنترلر داره ،‌كنترلرش چيه؟ Part Number
اگه نداره، خود LCD چي داره؟ منظورم datasheet و Part Number و ...

خوب . منتظرم.:cool:

دیتاشیتش به این نام " GDM12864A "
منظورت از کنترلر همون ic درایورش ویعنی ks0108b & ks0107b است؟
میشه بیشتر توضیح بدی؟:rolleyes: :blush:
mer30

behzad53a
10-29-2005, 03:40 PM
دیتاشیتش به این نام " GDM12864A "
منظورت از کنترلر همون ic درایورش ویعنی ks0108b & ks0107b است؟
میشه بیشتر توضیح بدی؟:rolleyes: :blush:
mer30

سلام
اين ساخت چينه و اصلا توصيه نميكنم. بهتره يه LCD انتخاب كني كه كنترلر Toshiba داشته باشه. معمولا از كنترلر T6963 استفاده ميكنن. من با توشيبا كار كردم. و خيلي راحته. ديتا شيت اين LCD رو من دارم. چندان كامل نيست.
و بايد ديتاشيت خود ks.... رو هم داشته باشي تا بتوني استفاده كني. خوب بگو چكار كردي و كجاي كار گير داره تا بتونم راهنمايي كنم.

موفق باشي.

edisonkocholo
11-02-2005, 01:28 AM
سلام
اين ساخت چينه و اصلا توصيه نميكنم. بهتره يه LCD انتخاب كني كه كنترلر Toshiba داشته باشه. معمولا از كنترلر T6963 استفاده ميكنن. من با توشيبا كار كردم. و خيلي راحته. ديتا شيت اين LCD رو من دارم. چندان كامل نيست.
و بايد ديتاشيت خود ks.... رو هم داشته باشي تا بتوني استفاده كني. خوب بگو چكار كردي و كجاي كار گير داره تا بتونم راهنمايي كنم.

موفق باشي.
salam
من کمی سرچ کردم .با توجه به چیزایی که گفتی یه چیزایی دستم امد.
الان میخوام برام یه شماتیک یا سخت افزار پایه های این .(... lcd (ks0 را بدی .
اگه میشه یه توضیح کلی برای هر 20 پایه .
bazam mer30
:rolleyes:

edisonkocholo
12-04-2005, 05:06 AM
سلام دوستان بالاخره lcd گرافیکی راه افتاد.:D
mer30 از راهنمایی ها

edisonkocholo
12-04-2005, 05:15 AM
سلام مجدد
به نظر من بحث میکرو کنترلر ها بیشتر از اینا باید داغ و جزاب باشه.
اینجا خیلی بی حاله!!!!
یه موضوع برا بحث!
راه اندازی کارت های mmc با کنترکر مثلا 8051
خوب اگه اطلاعات دارین رو کنین:cool:
اگه موضوع جزاب تری هم دارین مطرح کنین.:)

solarisco
12-05-2005, 09:32 AM
سلام مجدد
به نظر من بحث میکرو کنترلر ها بیشتر از اینا باید داغ و جزاب باشه.
اینجا خیلی بی حاله!!!!
یه موضوع برا بحث!
راه اندازی کارت های mmc با کنترکر مثلا 8051
خوب اگه اطلاعات دارین رو کنین:cool:
اگه موضوع جزاب تری هم دارین مطرح کنین.:)
اولین مشکل ای سی انکودر mp3 هست که تو این خرابشده گیر نمیاد

..hamid..
12-10-2005, 07:16 PM
89c51snd1 که تو بازار هست. مشکل راه اندازی این میکرو با mmc یا cdrom هستش.

edisonkocholo
12-15-2005, 03:00 AM
بله درست 89c51snd1 این قابلیت راداره.
من فکر میکنم اگه پایه های mmc را بلد باشیم بتونیم اونو راه بندازیم.
نظرتون چیه؟

solarisco
12-18-2005, 12:23 AM
89c51snd1 که تو بازار هست. مشکل راه اندازی این میکرو با mmc یا cdrom هستش.

ببخشید منظورم مبدل دیجیتال به انالوگ بود برای تولید خروجی صوتیش که پیدا نمیشه

solarisco
12-18-2005, 12:29 AM
البته اگه 89c51snd2 هم باشه خوبه چون یه DAC درونش هست ولی این مدلو پیدا نکردم البته جدیدا نرفتم دنبالش

edisonkocholo
12-19-2005, 02:32 AM
salam
10adc,89c51snd1 بیتی داره!

solarisco
12-19-2005, 11:21 PM
salam
10adc,89c51snd1 بیتی داره!

درسته ADC داره که برای ضبط صدا به کار میره ولی DAC نداره ( مبدل دیجیتال به انالوگ یعنی تولید صدای خروجی)

..hamid..
01-15-2006, 07:08 PM
همون طور که سولاریسکو گفت snd2 دیگه همه چی داره.

کسی رو این میکرو کار کرده و جواب گرفته؟

solarisco
01-18-2006, 05:11 AM
همون طور که سولاریسکو گفت snd2 دیگه همه چی داره.

کسی رو این میکرو کار کرده و جواب گرفته؟


اقا مگه شما تونستید تهیش کنید تو ایران هست مگه ؟

chia
01-19-2006, 12:09 PM
اقا ببخشید همینطور پریدیم تو ازpic اطلاعاتی دارین مثلا lcd گرافیکی؟:cool:

leadertime
01-23-2006, 01:40 AM
موضوع ميكرو ها واقعا جزو مباحث جذاب الكترونيكه. من خيلي در اين مورد چيزي نميدونم اما گمون ميكنم اين قابليت در 8051 باشه. يه رجيستر هم واسه اينكار بود. اگه اشتباه نكنم IP بود. البته دقيقا نميدونم كارش چيه.
IP یا Instrument pointer یکی از دو رجیستری است که برای آدرس دهی کدی که آماده انجامه به کار میره.

mamd82
03-29-2006, 08:49 PM
با سلام وتبريك سال نو
الگوريتمي كه بتوان طبق آن ميكروي 89c51snd1 را به پورت USB متصل كرده به همراه يك برنامه تست را از كجا ميتوان تهيه كرد.
با تشكر از همه دوستان :p

solarisco
03-30-2006, 07:29 AM
تو همون سایت atmel برنامه های مربوط بهش رو میتونی پیدا کنی هم برای میکرو و هم برای ویندوزش

mamd82
03-30-2006, 08:39 AM
تو همون سایت atmel برنامه های مربوط بهش رو میتونی پیدا کنی هم برای میکرو و هم برای ویندوزش

باسلام و تشكر
يه سري چيزا پيدا كردم . مثل يه برنامه كيبرد اما براي ميكروي ديگه اي بود ولي حالت عمومي داشت .
مشكل من اينه كه يك الگوريتم براي اين موضوع ندارم .
اگه چيز خاصي سراغ داري لطفا راهنمايي كن چون نزديك 80 مگ فايل و برنامه و... جمع كردم ولي هنوز نتونستم موفق بشم .

:p

..hamid..
03-31-2006, 04:55 PM
پروگرام کردن میکرو snd1 با usb راحته. فقط باید اتصالات رو درست انجام بدی و دراور Flip هم نصب باشه. بعد که میکرو میره تو حالت ISP کامپیوتر می شناسدش. ولی وقتی به انتقال دیتا میرسه مشکلات شروع میشه. اول از همه کامپیوتر دیگه میکرو رو نمیشناسه. از اینجا به بعدش خودش یه پروژه هست. برای راحتی کار اگه تو تهران هستی می تونی بری پاساژ امجد فروشگاه جوان. اونا یه کیتی دارند که پورت usb رو به پورت P تبدیل می کنه. یعنی انگار شما با 8تا پایه میکرو سر و کار دارید. خیلی از مشکلات حل میشه. چون دیگه نیازی به دونستن پروتکلهای usb نیستش.

mamd82
03-31-2006, 05:48 PM
پروگرام کردن میکرو snd1 با usb راحته. فقط باید اتصالات رو درست انجام بدی و دراور Flip هم نصب باشه. بعد که میکرو میره تو حالت ISP کامپیوتر می شناسدش. ولی وقتی به انتقال دیتا میرسه مشکلات شروع میشه. اول از همه کامپیوتر دیگه میکرو رو نمیشناسه. از اینجا به بعدش خودش یه پروژه هست. برای راحتی کار اگه تو تهران هستی می تونی بری پاساژ امجد فروشگاه جوان. اونا یه کیتی دارند که پورت usb رو به پورت P تبدیل می کنه. یعنی انگار شما با 8تا پایه میکرو سر و کار دارید. خیلی از مشکلات حل میشه. چون دیگه نیازی به دونستن پروتکلهای usb نیستش.

با سلام
حميد جان من تهران ساكن نيستم و مشكل بعدب اينه كه ميخوام اين موضوع رو از پايه كار كنم كه اگه با ميكروي ديگه هم نياز به كار باشه ويا در شرايط ديگه باز توي گل گير نكنم .
:p

..hamid..
04-02-2006, 08:05 PM
من اون موقع که روی این پروژه کار می کردم اینترنت رو زیرو رو کردم. فقط یه شماتیک مدار این میکرو رو پیدا کردم با یه عکس.
ولی تا دلت بخوار با pic ها و fpga تونستند mp3player بسازند. مداراشم همه هست.

mamd82
04-02-2006, 09:51 PM
من اون موقع که روی این پروژه کار می کردم اینترنت رو زیرو رو کردم. فقط یه شماتیک مدار این میکرو رو پیدا کردم با یه عکس.
ولی تا دلت بخوار با pic ها و fpga تونستند mp3player بسازند. مداراشم همه هست.

حميد جان سلام
من بيشتر قصد دارم USB راه بندازم اونم بصورت پايه بعد ازون برم سراغ MP3Player بنابر اين همكنون مشكل من در رابطه با USB ميباشد .

اگه PIC هم كه MP3Player داره و توي ايران هست معرفي كني ممنون ميشوم .
با تشكر

salirh2000
05-25-2006, 06:31 PM
سلام خدمت دوستان عزيز:rolleyes:
براي اولين بار كه با يه همچين جايي آشنا شدم خيلي جالب و مفيد
اگه ميشه به من محبت كنيد بگيد كجا ميتونم سري AT89C51SND گير بيارم و نياز فوري به يك adc سرعت بالا و tms320 دارم كه حداقل بتونم بصورت تلفني يا اينترنتي خريد كنم چون من تو يه دهات زندگي مي كنم و امكانات نيست ولك ....:blush:
salirh2000@yahoo.com
چاكر همه برو بچه ها:D

samane22
11-08-2006, 12:36 AM
سلام
اين ساخت چينه و اصلا توصيه نميكنم. بهتره يه LCD انتخاب كني كه كنترلر Toshiba داشته باشه. معمولا از كنترلر T6963 استفاده ميكنن. من با توشيبا كار كردم. و خيلي راحته. ديتا شيت اين LCD رو من دارم. چندان كامل نيست.
و بايد ديتاشيت خود ks.... رو هم داشته باشي تا بتوني استفاده كني. خوب بگو چكار كردي و كجاي كار گير داره تا بتونم راهنمايي كنم.

موفق باشي.

سلام
مي خواستم ازتون خواهش كنم اگر مقاله يا اطلاعاتي در مورد اين lcd ( همين كه ميگين ساخت چينه ) دارين به من بگيد. راستش من براي موضوع پروژم دارم روي ساخت يك اسيلوسكوپ ديجيتال كار ميكنم با ميكروي avr ، و اين lcd را هم تهيه كردم و مجبورم حتمأ از اين lcd استفاده كنم ، مگه كار اينه با هم تفاوت زيادي دارد؟!
خواهش ميكنم اگه مطلب يا مقاله اي داريد كه بتونم كار با اين lcd را ياد بگيرم بهم معرفي كنيد ، بد جوري گير افتادم:( مثلأ براي شروع مي خوام يك سري اعداد را به حافظه ي ميكرو بدهم كه اين اعداد نمونه هاي يك شكل موج سينوسي باشد بعد هم اين شكل موج را روي lcd نمايش دهم ، البته همون lcd GSM12864a . خواهش ميكنم اگه ميتونيد براي يادگيري كار با اين lcd بهم كمك كنيد .

moc_tv
12-17-2006, 12:07 PM
سلام به همه
ميخواستم بدونم براي برنامه نويسي 89c51snd از چه نرم افزاري بايد استفاده كنم ممنون مي شم اگه كسي راهنمايي كنه