Leer estado del puerto avr con C Pequeño detalle Atmega

Jeje wueno pues si fijate que si el proteus le falla muchas cositas.

Aver lo del SPI entiendo la teoria y eso pero mi duda que por cierto no he podido resolver es esta

Esclavo = MAX6675
Maestro = Atmega8, el master genera el clock

La hoja de datos da estos ejemplos

void SPI_MasterInit(void)
{
DDR_SPI = (1<<DD_MOSI)|(1<<DD_SCK);
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
}
void SPI_MasterTransmit(char cData)
{
SPDR = cData;
while(!(SPSR & (1<<SPIF)));
}

Es decir inicia el modulo como maestro y luego esta la funcion que transmite hasta aqui todo bien.

Pero entonces como le hago para leer en modo Maestro, A caso solo basta con hacer esto:

cData = SPDR
while(!(SPSR & (1<<SPIF)));

Porque ya lo hice y no funciona.

Respecto a lo que mencionas que el MAX6675 envia 16bits eso ya vi como se puede solucionar y eso es controlando la terminal SS, ya que el atmega automaticamente deshabilita el esclavo cuando ha leido los 8bits pero si controlamos la terminal SS con otro puerto pues podemos mantenerla activa mientras solicitamos una segunda lectura.

Aver si me explique bien sale ha y muchas gracias por el apoyo que me brindan
 
Ha es que, perdon por no contestarte pero, cuando tu envias un dato, al mismo tiempo recibes el dato del esclavo entonces quedaria algo asi...

Código:
char SPI_MasterTransmit(char cData)
{
 SPDR = cData;
 while(!(SPSR & (1<<SPIF)));
 cData = SPDR;
 return cData
}

Esa funcion hace dos cosas, te envia datos y al mismo tiempo te regresa el dato que recibio mientras transmitio... de manera que puedes implementar la funcion asi.

Código:
char datoentrada;
char datosalida;

datosalida = SPI_MasterTransmit(datoentrada);

y así, estas recibiendo lo del esclavo, al mismo tiempo que envias lo del maestro.
 
OK hasta ahi entiendo el datalle es el siguiente:

Que pasa si el esclavo solo es de los que envian datos pero no recibe nada por ejemplo el MAX6675 solamente envia los datos de la temperatura pero no recibe nada entonces el codigo que me pasa funcionara bien??

O tendria que enviar como dato salida un 0x00 y esperar recibir el dato de entrada que envia el MAX6675; bueno mientras voy a probar, a y una nota PROTEUS invierte las señales del puerto RX y TX de los Atmegas y cuando lo simulas precisas invertir esa señal pero en la realidad los atmegas no lo hacen en resumen.

En proteus haces AtmegaTx -> 74LS04 -> Max232 -> PuertoSerie
En la realidad AtmegaTx -> Max232 -> PUertoSerie

Mugre proteus, por cierto alguien sabe si existen librerias para simular los ATMEGA en MULTISIM, en especifico el atmega32
 
No te fies de todo lo que te simula el proteus!! Es mejor que lo montes y lo mires. Tuve probremas simulando puertos USB, LCDs y USART. En el proteus no me funcionaban y cuando los montaba funcionaban a las mil maravillas. Un saludo
 
O tendria que enviar como dato salida un 0x00 y esperar recibir el dato de entrada que envia el MAX6675

Ya tienes tu respuesta.

a y una nota PROTEUS invierte las señales del puerto RX y TX de los Atmegas y cuando lo simulas precisas invertir esa señal pero en la realidad los atmegas no lo hacen en resumen.

No te fies de todo lo que te simula el proteus!! Es mejor que lo montes y lo mires.

Ya se me esta haciendo un poco cansón que sigas trabajando el proteuss. Casi desde un inicio te dije que mejor te vallas directamente a la prueba física. No creas que lo digo por jugar.

Mejor enseñate a usar los depuradores de los compiladores.

Seguimos al pendiente...
 
Ok ok pero no te enojes jeje, bueno hay que admitir que se bonito como se simula en preteus, y que cuando tienes que esperar una semana a que te llege el circuito es bueno ir practicando un poquito, y bueno los depuradores que trae el avr studio junto con winavr pues son algo fastidiosos en fin voy a probar la transmison spi, sale tema cerrado
 
AVR studio trae un pequeño detalle en su depurador. Los timmers no los ejecuta bien, asi que tampoco te fies de ese asunto.

Es facil, cuando ejecutas el depurador, y habilitas los timers, estos no retienen la configuracion y hacen cosas raras. Es el unico detalle que le he observado al AVR studio.

Excelente, antes de cerrar el tema, cuenta que ocurre con el termopar.
 
Jeje si cierto aver les cuento esta larga historia.

Yo estudio es el ipn en mexico y estoy en octavo semestre total que el profe de instrumentacion nos pidio que hicieramos una interfaz para capturar la temperatura que mide un termopar tipo K y lo mandara a grafica a la PC y ademas una caja de potencia a la que se le metieran 4 a 20mA y pudiera manejar por PWM una resistencia calefactora de 100watts "COSA que todavia no he hecho"

En fin pues luego luego a buscar como hacerlo, muchos en el salon lo estan haciendo con el MAx6675 otros van usar el AD595 porque fueron con los que el profe dijo que podian hacerlo, "bola de entendidos" no saben buscar mas alla siempre lo que el profe les dice, bueno la cosa esta en que como grupo que somos valen para pura mama porque son bien envidiosos cada quien con lo que hacen o bajan de internet y no te pasan nada de nada y cada quien se rasca como puede cosa que veo muy mal pero bueno.

Asi que como casi no soy nada "che necio" pues decidi buscar otra alternativa algo que si fue dificil porque toda la info en internet sobre interfaces para termopar se basan en el AD595 y el MAX, pero bueno finalmente el la pagina de TexasInstrument encontre una seccion que dice Intrumentation y ahi encontre amplificadores para intrumentacion "porque se supone que soportan altas temperaturas son muy estables muy bajo offset etc, etc" en este caso vi el INA122 un operacional con ganancia de hasta 10000 hecho con resistencias grabadas con lasser etc etc y bueno dije pus con este

Despues me tope con el problema de medir temp ambiente con el termopar y esto lo hice con un tmp37 asi que mido temp ambiente con el tmp37 y lo sumo a lo que mide el termopar es decir compenso la lectura, luego el detalle del micro, nuevamente todos usaron el mugre pic16f4550 porque es el que anda en internet pero nuevamente hay va el necio y decido usar el atmega8 y luego una lcd y luego pues todo lo demas al fin me queda y pude descansar.

Subo una imagen de como es el circuito, el codigo luego se los paso porque honestamente no me gustaria que esos gandallas encontraran mi codigo y capaz que lo entregan y para que quieren no.

Por ultimo perdon por todo este rollo pero necesitaba contarlo jeje y nada mas que pase la fecha limite para la entraga y lo subo

Pero si detallo dos cosas
Primera la lectura del ADC sufre de ruidos cuando se arma en protoboard y un poco aun estando en la PCB esto porque no use las tecnicas para evitar ruidos, pero lo solucionas tomando en mi caso 10 muestras y luego las promedio

Segunda
El INA122 es muy delicado casi cualquier cosa amplifica, entonces mucho cuidado con los ruidos parasitos y otros detalles.

Tercera
Use el LM358 es necesario porque los atmegas chupan mucha corriente cuando lee los puertos entonces el tmp37 con sus 3mA pues hacia que se callera el voltaje al leer con el micro, igual con el ina122 entonces por eso coloque el OP con ganancia unitaria.

el ina esta amplificando aprox 62.5 veces y el ADC del avr esta a 10bits

Asi los 4E-5Volts del termopar *62.5 = 2.56Vref/1024 bueno aprox
 

Adjuntos

  • Interfaz.JPG
    Interfaz.JPG
    77.3 KB · Visitas: 21
Última edición:
Oye la caja de potencia la podria implementar con el atmega8 usando su modulo pwm, aver si mido la caida de tension sobre una resistencia de 250 ohms al hacerle circular la corriente de 4 a 20mA en el caso de que haya 4mA tendre 1Volt y en caso de que haya 20mA tendre 5volts luego esto lo meto al CAD del atmega y despues hago que el PWM quede en funcion del valor leido por el CAD, humm eso podria resultar??? Pues voy a tener que leer la parte del PWM en el atmega8, me vendrian bien ideas sobre todo la parte de configuracion del pwm porque por lo que es leido hasta ahorita esta algo confuso habla de muchos registros
 
A mira se trata de lo siguiente
En la industria los sensores en general envian la informacion en forma de corriente no de voltaje, el estandar dice que esta corriente va desde 4mA representando "NADA" hasta 20mA representado "TODO" entonces tengo que hacer una circuito que controle una resistencia de 100Watts con estas señales de 4 a 20mA, ejemplo si me llegan 8mA la resistencia debe calentar a la mitad "(20 - 4mA) / 2 = 8mA", para calentar debo usar el PWM en este ejemplo el PWM estaria al 50% de ciclo util, ahora bien el micro no recibe corriente por eso proponia poner una resistencia de 250 Ohms y hacer que la corriente fluya sobre ella asi para 4mA leeria 1Volt y para 20mA leeria 5Volts ahora si le meto esto al CAD y hago que el PWM varie de acuerdo al voltaje leido en la resistencia, como vez cres que se pueda, hechame la mano con la parte del PWM
 
Muy bien, primero quiero que hagas lo siguiente.

Convertir de corriente a voltaje, y eso se hace con el siguiente circuito

clip_image005.jpg


y su formula es:

VOUT =-RI

de tal manera es que si a 20 mA quieres tener 5V para que el ADC te indique de salida 255 (en caso de 8 bits) entonces tu deberás calcular...

VOUT = -R I.

R = -VOUT / I

R = -5V / 20mA

R= 250 ohms

Esta es la forma correcta de acondicionar los sensores de corriente.

Ahora, revisa ese circuito, y en la noche te mando informacion sobre el pwm que ahorita ando un poco ocupado y necesito sacar el datasheet. No me se todos los registros de todos los micros de memoria.
 
Muy bien, primero quiero que hagas lo siguiente.

Convertir de corriente a voltaje, y eso se hace con el siguiente circuito

clip_image005.jpg


y su formula es:

VOUT =-RI

de tal manera es que si a 20 mA quieres tener 5V para que el ADC te indique de salida 255 (en caso de 8 bits) entonces tu deberás calcular...

VOUT = -R I.

R = -VOUT / I

R = -5V / 20mA

R= 250 ohms

Esta es la forma correcta de acondicionar los sensores de corriente.

Ahora, revisa ese circuito, y en la noche te mando informacion sobre el pwm que ahorita ando un poco ocupado y necesito sacar el datasheet. No me se todos los registros de todos los micros de memoria.


Ya estas, revisando...
 
HOla que tal de nuevo aca, pues si ya hice pruebas y si funciona mucho mejor que una simplona resistencia jeje bueno ahorita sigo leyendo para entender bien el pwm del atmega, la verdad si esta algo largo el tema y como se mescla mucho con los timer del micro pues hay que leer tambien esa parte
 
No es dificil, mas bien no estas familiarizado con los términos.
Leelo y pregunta las dudas... Yo tengo algunos PWM funcionando, pero todos los micros los programo en ensamblador y a lo mejor te confundo si te pongo algunos codigos.
 
Nop no es que confunda terminos es solo que hay que configurar varios parametros para hechar andar el pwm, pero bueno ya estoy en eso ya genere una señal que va variando su ancho, ahora voy aver como hacerlo en funcion del nivel de tension que lea del adc
 
Ok, si vas a manejar 8 bits, lo mas facil es que al timer le pongas un top de #0xFFh de manera que el dato que lees del ADC directamente lo arrojes al TMR directamente. Eso para que hagas prueba. Si funciona, entonces ya podemos jugar con mas cosas.
 
Andale exactamente eso es lo que trato de hacer ahorita, pero no logro configurar para que haga la conversion a 8 bits, eso como se hace porque parece ser que me esta haciendo conversion a 10bits aver esto es lo que he hecho:


void config_pwm_8()
{
TCCR2 = (1<<WGM20)|(1<<WGM21)|(1<<COM21)|(1<<CS20);
TCNT2 = 0xFF; //Aqui ponemos el valor con que se compara
OCR2 = 0; //Contiene el valor que se compara con TCNT2 y generar la pwm
}
Esta en PWM rapida, usando el timer2 de 8bits, modo no invertida con salida en OC2

Y el ADC lo configuro asi:

int8_t LEE_ADC()
{
/*
@ 1Mhz y Preescala = 4 se tienen fadc = 250KHz resolucion 8bits en ADC0
Referencia interna de 2.56V con ajuste a la izquierda
*/
ADMUX = (1<<REFS1)|(1<<REFS0)|(1<<ADLAR);
ADCSRA = (1<<ADEN)|(1<<ADSC)|(1<<ADPS1);
_delay_ms(1);
return ADCH;
}


Se supone que asi deberia hacer conversion a 8bits porque la frecuencia es superior a 200Khz y ademas estoy poniendo ADLAR en 1 para que lo ajuste a la izquierda y luego leo la parte alta, pero no da bueno despues lo que hago es esto

OCR2 = LEE_ADC();

Y va bien pero cuando sobrepasa los primeros 8bits pues ya no varia, honestamente no tengo un osciloscopio pero lo probe con un foco y parece ser que no llega hasta pwm = 100%, luego lo probe en proteus para ver y en la simulacion tambien aparece que esta haciendo conversion a 10bits y yo quiero que lo haga a 8bits

Nota si leei la parte baja para que actualize el registro ADC

Alguna idea de como forzo a que sea conversion de 8bits

Ya nomas me falta eso lo demas ya lo tengo imaginado jejeje
 
Atrás
Arriba