سلام خدمت دوستانم ،
چند وقتی هست درگیر راه اندازی ولت متر دیجیتال با میکرو at91sam7x256 هستم تا ولتاژ رو روی lcd کاراکتری 16*2 ببینم، بالاخره با استفاده از مطالب مفید این انجمن کد جواب گرفت ، تصمیم گرفتم بزارم اینجا تا شاید گره از کار کسی باز بشه.
موفق باشید.
/code]
چند وقتی هست درگیر راه اندازی ولت متر دیجیتال با میکرو at91sam7x256 هستم تا ولتاژ رو روی lcd کاراکتری 16*2 ببینم، بالاخره با استفاده از مطالب مفید این انجمن کد جواب گرفت ، تصمیم گرفتم بزارم اینجا تا شاید گره از کار کسی باز بشه.
موفق باشید.
کد:
[
#include <At91SAM7X256.h>[left]
#include <stdio.h>
#define LCD_PORT_A
#define LCD_RS 2
#define LCD_RW 3
#define LCD_E 4
#define LCD_DB4 23
#define LCD_DB5 24
#define LCD_DB6 25
#define LCD_DB7 26
#include "lcd.h"
void delay(void)
{
unsigned int i;
for(i=0;i<1000000;i++)
{}
}
int main(){
unsigned int x;
float final =0;
float voltage =0;
char buffer[]={0,0,0,0,0};
lcd_init();
*AT91C_PIOB_PER=(1<<7); //bit e 7om port e B ra be onvane IO tarif mi****m.
*AT91C_PIOB_OER=(1<<7); // bit e 7om PORT e B ra be onvane khoruji tarif mi****m.
*AT91C_ADC_CR = AT91C_ADC_SWRST ; // ADC Control Register bit0>start bit1>swrst, baghiye bit ha X(Don't care) mibashand.
*AT91C_ADC_CHER = AT91C_ADC_CH3 ; //ADC channel enable register.
/* ba neveshtan dar khane haye 0 ta 7 har yek az 8 channel faal mishavand */
*AT91C_ADC_MR = AT91C_ADC_SHTIM|AT91C_ADC_STARTUP|AT91C_ADC_PRESCAL
|AT91C_ADC_SLEEP_NORMAL_MODE
|AT91C_ADC_LOWRES_10_BIT|AT91C_ADC_TRGEN_DIS;
/*
AT91C_ADC_MR adc mode register
SHTIM : faseleye zamini beyen 2 nemone bardari
startup : zamane shoroe avaliye (zamani ke adc niaz darad ta amade shavard az formula mohase be mishavad)
prescal : clock voroudi ra ba in adad taghsim mikonad.
sleep : agar yek bashad sleep ast agar sefr bashad dar halate adi ast.
tregen : agar 0 bashad rahandaze khereji ghyere faal ast
*/
*AT91C_PIOB_SODR=(1<<7); // in teki code ra neveshtim ta motmaen shavim hengame program
// kardan aya barname be in khat miresad ya na.
delay();
*AT91C_PIOB_CODR=(1<<7);
delay();
*AT91C_PIOB_SODR=(1<<7);
delay();
*AT91C_PIOB_CODR=(1<<7);
delay();
lcd_gotoxy(1,1);
lcd_clear();
while(1){
*AT91C_ADC_CR = AT91C_ADC_START;
while((*AT91C_ADC_SR&AT91C_ADC_EOC3)==0); // entezar ta amade shodan dataye ADC
x=*AT91C_ADC_CDR3 & AT91C_ADC_DATA; // ADC_CDRx : Channel data register
/* meghdare motenazare ba ADC dar motaghayere X rikhte mishavad. */
//inja mikhahin agar voltage vorudi be ADC bishtar az VREF/2 bud LED roshan shavad va dar gheire
// in sorat LED khamush shavad.
final = ((float)x/1024);
voltage = 5* final;
sprintf(buffer,"%f",voltage);
lcd_gotoxy(1,1);
lcd_putsf("voltage = ");
lcd_putsf(buffer);
if( x>=512)
{
*AT91C_PIOB_SODR=(1<<7);
}
else
{
*AT91C_PIOB_CODR=(1<<7);
}
}
}
[/left][code=c]

