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: