Hola e buscado por la red de como realizar un conversor A/D y es facil pero lo que se me dificulta es utilizar el registro de desplazamiento, lo que deseo hacer es poder mostrar el valor de un potenciometro en dos display  de 7 segmentos y convertir el valor del potenciometro a millas por hora o cualquier otro dato de forma que se puedan utilizar dos display\'s 
Por ello les pido si me pueden enseñar a utilizarlo aquí coloco el código ejemplo que e utilizado, si se puede utilizar el 74hc595 si no también tengo el HCF4094B o mas conocido como el 4094.
Lo ideal es implementarlo en un micro mas pequeño un attiny84 y no en un atmega328p pero es el mas utilizado mas que nada x el arduino, se que con ese micro no seria necesario utilizar el registro de desplazamiento.
Lo que e podido ver es que se utiliza el TWI o I2C en pic\'s pero solo e visto ejemplos con eeprom y no con display\'s u envio de datos por shift register.
El software que utilizo para programar es atmel studio
De ante mano gracias x su tiempo
	
	
	
		
				
			Por ello les pido si me pueden enseñar a utilizarlo aquí coloco el código ejemplo que e utilizado, si se puede utilizar el 74hc595 si no también tengo el HCF4094B o mas conocido como el 4094.
Lo ideal es implementarlo en un micro mas pequeño un attiny84 y no en un atmega328p pero es el mas utilizado mas que nada x el arduino, se que con ese micro no seria necesario utilizar el registro de desplazamiento.
Lo que e podido ver es que se utiliza el TWI o I2C en pic\'s pero solo e visto ejemplos con eeprom y no con display\'s u envio de datos por shift register.
El software que utilizo para programar es atmel studio
De ante mano gracias x su tiempo
		Código:
	
	/*
* Conversor A/D  
* Versión: 1.0.0  
* Creado: 31/05/2016    01:59:51 
* Autor: David Alejandro
*
* Microcontrolador: ATmega328P
* Comentarios:    
*/ 
#define F_CPU 14745600
#include <avr/io.h>
void conf_puertos(void);         //Prototipos de las Funciones
void conf_adc(void);
uint16_t ReadADC(uint8_t ch);
void conf_puertos(void)
{
	DDRB = (0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) | (0<<DDB0);
	DDRC = (0<<DDC5) | (0<<DDC4) | (0<<DDC3) | (0<<DDC2) | (0<<DDC1) | (0<<DDC0);
	DDRD = (0<<DDD7) | (0<<DDD6) | (0<<DDD5) | (0<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0);
	
	PORTB = (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);
	PORTC = (0<<PORTC5) | (0<<PORTC4) | (0<<PORTC3) | (0<<PORTC2) | (0<<PORTC1) | (0<<PORTC0);
	PORTD = (0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0);
}
void conf_adc(void)
{
	// Inicialización del Convertidor Analógico-Digital
	// Referencia del ADC AREF
	// Conversión del ADC a 10 bits
	// Frecuencia de Muestreo 1843200 Hz Hz
	// ADC Detenido
	// Entradas Digitales en  ADC0D On, ADC1D On, ADC2D On, ADC3D On, ADC4D On, ADC5D On.
	
	ADMUX = (0<<REFS1) | (0<<REFS0) | (0<<ADLAR) | (0<<MUX3) | (0<<MUX2) | (0<<MUX1) | (0<<MUX0);
	ADCSRA = (1<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);
	ADCSRB = (0<<ACME) | (0<<ADTS2) | (0<<ADTS1) | (0<<ADTS0);
	DIDR0 = (0<<ADC5D) | (0<<ADC4D) | (0<<ADC3D) | (0<<ADC2D) | (0<<ADC1D) | (0<<ADC0D);
}
uint16_t ReadADC(uint8_t ch)
{
	ch&=0b00000101;                      // Limita la entrada a 6 canales ADC (ADC0-ADC5)
	ADMUX = (ADMUX & 0xF0)|ch;           // Asigna el valor del canal ADC denotador por ch
	ADCSRA|=(1<<ADSC);                   // Inicia la conversión
	While((ADCSRA)&(1<<ADSC));           // Espera hasta que a conversión esté completa
	Return(ADC);                         // Rgresa el valor del ADC a 10 bits
}
int main(void)
{
	conf_puertos();
	conf_adc();
    while(1)
    {
        //TODO:: Please write your application code 
    }
} 
y para el TWI tengo el siguiente codigo pero no entiendo como funciona y como poder enviar los datos del potenciometro se utiliza un attiny85
/*
 * Counter.cpp
 *
 * Created: 12.04.2013 14:12:59
 *  Author: Jopi
 */ 
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h> 
#define LATCH_PIN PB4
#define SHIFT_PIN PB1
#define DATA_PIN PB0
#define BUTTON_PIN PB2 //PB2 is INT0
uint8_t digits[10] = {
  0b00111111,
	0b00001100,
	0b01101011,
	0b01101101,
	0b01011100,
	0b01110101,
	0b01110111,
	0b00101100,
	0b01111111,
	0b01111101
	
};
uint8_t rightDigit = 0;
uint8_t leftDigit = 0;
void latch() {
		//Set the Latch clock pin to low
		PORTB &= ~(1<<LATCH_PIN);	
		//Set latch pin back to high -> shift register will copy buffer to latch register
		PORTB |= 1<<LATCH_PIN;
}
void shiftOut(uint8_t data) {
	
	for(uint8_t i = 0; i < 8; i++) {
		bool state = !((data & (1 << i )) != 0);
		//bool state = bit_is_clear(PINB, 1);
		
		if(state) {
			//set high signal
			PORTB |= 1 << DATA_PIN;
			
		} else { //low or different than 1
		//set low signal
			PORTB &= ~(1<< DATA_PIN);
		}
	        
		//pulse shift clock pin -> shift register will shift the current bit in
		PORTB |= 1 << SHIFT_PIN;
		PORTB &= ~(1<< SHIFT_PIN);
	}
	
	return;
}
void incrementCounter(){
	if(rightDigit == 9) { //check if left digit has to be incremented
		if(leftDigit == 9) { //99; reset
			leftDigit = 0;
			rightDigit = -1; //will be set to 0 later by incrementing
		} else { //left digit < 9
			leftDigit += 1;
			rightDigit = -1; //will be set to 0 later by incrementing
		}
	}	
	
	rightDigit += 1;
}
void shiftCounter() {
	shiftOut(digits[rightDigit]);
	shiftOut(digits[leftDigit]);
	latch();
}
int main(void)
{
	//Set PB0 to Output
	DDRB = 0b11; //PB0-1 Output
	DDRB |= (1 << LATCH_PIN); //Set Latch Pin to Output
	
	//Set Button Pin to Input & HIGH
	DDRB &= ~(1 << BUTTON_PIN);
	PORTB |= 1 << BUTTON_PIN;
	
	//Set Interrupt for PB2 (INT0)
	//Falling Edge:
	MCUCR |= 1 << ISC01; //ISC01 to 1
	MCUCR &= ~(1 << ISC00); //ISC00 to 0
	
	//Activate Interrupt INT0
	GIMSK |= 1 << INT0;
	
	//Activate Interrupts
	sei();
	
	
	//int out[8] = {0, 0, 0, 0, 0, 0, 0, 1}; //Last bit equals Q0, which won\'t be used for this project
	
    while(1)
    {
		//for(uint8_t i = 0; i < 100; i++) { // 0 - 99
			//incrementCounter();
			//
			//shiftCounter();
//
			//_delay_ms(500);	
		//}	
		
			
    }
}
ISR(INT0_vect) {
	incrementCounter();
	shiftCounter();
} ...
			
				Última edición por un moderador: 
			
		
	
								
								
									
	
								
							
							 
   
				 
						 
 
		 
 
		 
 
		 
 
		 
 
		 
	 
 
		 
			 
 
		 
 
		 
 
		 
 
		 
 
		