/* * This programmer uses AT91' ADC Module * * 2010 by Ricardo V. Rojas Quispe */ #include #include #include #include #include #include #include #include #include "./Librerias/at91adc.h" AT91S_ADC *adc_map(unsigned int adcbase){ int fd; void *base; AT91S_ADC *adc; off_t addr = adcbase; if ((fd = open("/dev/mem", O_RDWR | O_SYNC)) == -1) { fprintf(stderr, "Cannot open /dev/mem.\n"); exit(EXIT_FAILURE); } base = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, addr & ~MAP_MASK); if (base == (void *) -1) { fprintf(stderr, "Cannot open /dev/mem.\n"); exit(EXIT_FAILURE); } adc = base + (addr & MAP_MASK); return adc; } /**********************Anadido por DCV*ini********/ AT91S_ADC *adc_map1(unsigned int adcbase){ int fd; void *base; AT91S_ADC *adc; off_t addr = adcbase; if ((fd = open("/dev/mem", O_RDWR | O_SYNC)) == -1) { //fprintf(stderr, "Cannot open /dev/mem.\n"); exit(EXIT_FAILURE); } base = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, addr & ~MAP_MASK); if (base == (void *) -1) { //fprintf(stderr, "Cannot open /dev/mem.\n"); exit(EXIT_FAILURE); } adc = base + (addr & MAP_MASK); return adc; } /*********************Anadido por DCV*fin**********/ void ADC_INIT(AT91S_ADC * adc){ //Incia conversion ADC adc->ADC_CR = ADC_START; } void ADC_RESET(AT91S_ADC * adc){ //Reset de ADC adc->ADC_CR = ADC_SWRST; } void CONFIG_ADC(AT91S_ADC * adc,unsigned int REG_CONFIG){ //configura ADC adc->ADC_MR = REG_CONFIG; adc->ADC_IDR = ADC_DISABLE_INTERRUP; } void ENABLE_CHANNEL(AT91S_ADC * adc,unsigned int CHANNEL){ //Habilita canal selecconado y deshabilita el resto adc->ADC_CHER = CHANNEL & 0x0F; adc->ADC_CHDR = ~CHANNEL & 0x0F; } unsigned int STATUS_CHANNEL(AT91S_ADC * adc){ //Retorna el estado del canal habilitado return (adc->ADC_CHSR); } unsigned int GET_ADC(AT91S_ADC * adc){ //unsigned int valor=1; //Retorna el valor de ADC (resolucion de 10BIT) while(1){ if ((adc-> ADC_SR & MASK_DRDY) == MASK_DRDY) break; } return (adc->ADC_LCDR & ADC_LDATA); } unsigned int GET_STATUS(AT91S_ADC * adc){ //Retorna el estado del ADC (registro) return (adc->ADC_SR); } unsigned int GET_ADC0(AT91S_ADC * adc){ //Retorna el valor de la conversion del canal 0 while(1){ if ((adc->ADC_SR & MASK_EOC0) == MASK_EOC0) break; } return (adc->ADC_CDR0 & ADC_LDATA); } unsigned int GET_ADC1(AT91S_ADC * adc){ //Retorna el valor de la conversion del canal 1 while(1){ if ((adc->ADC_SR & MASK_EOC1) == MASK_EOC1) break; } return (adc->ADC_CDR1 & ADC_LDATA); } unsigned int GET_ADC3(AT91S_ADC * adc){ unsigned int valor=1; //Retorna el valor de ADC (resolucion de 10BIT) while(valor){ if ((adc-> ADC_SR) & 0x10000) valor = 0; else valor = 1; } return (adc->ADC_CDR1 & ADC_DATA); } unsigned int ver_reg_mode(AT91S_ADC * adc){ //retorna el valor del ADC_MR return (adc->ADC_MR); }