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

Ok gracias por tomarse el tiempo de leer esto yo tengo una cuestion como le hago para leer el estado de un solo pin del puerto X en los avr, yo para cambiar el estado de los pines de salida le hago asi

PORTA |= (1<<PA0) Activo el pin 0 del puerto A sin afectar a los demas
PORTA ^= (1<<PA0) Desactivo el pin 0 del puerto A sin afectar a los demas

Y para leerlos cual seria la mejor forma, segun lo de arriba es la mejor forma para los pines de salida pero que hay para los de la entrada :unsure:

if(PINA&PD0){ } Si es uno
if(!(PINA&PD0)){} Si es cero

Esto podria funcionar o que utilizan ustedes para esto claro menos ensamblador, por cierto me gustaria que fueran poniendo detalles que ustedes utilizan para facilitarse la programacion en C para AVR, detalles pequeños como este pero que son de utilidad
 
Ok gracias por tomarse el tiempo de leer esto yo tengo una cuestion como le hago para leer el estado de un solo pin del puerto X en los avr, yo para cambiar el estado de los pines de salida le hago asi

PORTA |= (1<<PA0) Activo el pin 0 del puerto A sin afectar a los demas
PORTA ^= (1<<PA0) Desactivo el pin 0 del puerto A sin afectar a los demas

Y para leerlos cual seria la mejor forma, segun lo de arriba es la mejor forma para los pines de salida pero que hay para los de la entrada :unsure:

if(PINA&PD0){ } Si es uno
if(!(PINA&PD0)){} Si es cero

Esto podria funcionar o que utilizan ustedes para esto claro menos ensamblador, por cierto me gustaria que fueran poniendo detalles que ustedes utilizan para facilitarse la programacion en C para AVR, detalles pequeños como este pero que son de utilidad


Primero que nada yo uso CodevisionAVR, entonces para cambiar el estado de un PIN yo utilizo:

PORTA.1 = 0; --> este pone en estado bajo el pin 1 del puerto A
PORTB.3 = 1; --> este pone en estado alto el pin 3 del puerto B
---------------------------------------------------------------------------------------------------------
Para leer el dato desde un pin yo utilizo:

IF(PINA.4) //si el pin 4 del puerto A está en 1...
{
//codigo aquí
}

IF(!PINA.4) //si el pin 4 del puerto A está en 0...
{
//codigo aquí
}

---------------------------------------------------------------------------------------------------------
También podés definir:

#define alarma PINB.5

IF(alarma) //si el pin 5 del puerto B está en 1...
{
//codigo aquí
}


Saludos
 
El manejo de bits no está definido en C, ni en C++. Así pues, dependiendo del compilador, lo podrás hacer de una manera o de otra.

Yo personalmente uso el WinAVR en casa, y en el trabajo, el IAR, y en ambos casos uso el sistema descrito por Benito: if (PINA&PA0)...

Soluciones hay bastantes, pero ya es más cuestión de gustos, compiladores, y hasta de filosofías de programación. O sea, cuestión de gustos.

Al final, el código compilado queda igual.
 
Cierto muy cierto, jaja se me olvido decir que tambien utilizo winavr y cierto la verdad no se porque C no soporta el manejo de bits, en fin ojala sigan participando, con sus aportes de tecnicas de programacion
 
A mi parecer es asi:
Para tu ejemplo la difinicion PA0 es 0.
PORTA|=1<<PA0 pone a uno PORTA.0
PORTA&=~(1<<PA0) pone a cero PORTA.0

Para ver bits.
Si porta es entrada.
if(PINA & (1<<PA0) ) si es uno
{
.....
}
else lo contrario
...;



if((PINA & (1<<PA0))==0) si es cero
{
...
}
 
Cierto ya lo probe cristian y si funciona jeje estoy por terminar mi adaptacion de libreria para manejar la glcd para cuando la termine la subo aca,
 
Hola de nuevo, pues ya ven aqui dando lata, pues veran tengo dos pequeñas grandes dudas la primera es.
La USART de un atmega8 invierte los datos que saca por la terminal TX?, porque estube haciendo pruebas para enviar por RS232 y use el max232 pero no funciona despues coloque una puerta inversora y funciono, despues quite el max y la puerta y lo conecte directo "claro en la simulacion" y tambien funciono, por lo que pienso que el atmega invierte los datos cuando los manda para cumplir con la norma rs232 pero el max lo vuelve hacer dejando igual el dato, sera eso o que paso aqui jeje.

La otra es con los mugres termopares tipo K segun lei estos entregan 0.04mV por lo que no puedo meterlo al micro entonces use un INA122 y amplifique hasta 122 veces, luego al micro le fije la referencia a 5 volts para que me dieran 5v/1023 = 0.04mV*122, lo de 1023 porque el CAD es de 10bits el chiste es que el mugre ampli no da a la salida 5V/1024 en el proteus, ya le puse la compensacion de Temperatura ambiente al termopar pero nada y luego estube probando y la amplificacion parece que no es lineal en fin que ya no se que hacer, la formula para sacar la amplificacion del operacional es G = 5 + (200K/R) la R me sale de 1709 ohms aprox.

Por el tema de la USART y el Termopar ya imagino que se imaginan que intento capturar la temperatura y enviarla al PC verdad jejej pero bueno hasta ahorita no me ha salido sale gracias
 
Una, si mal no recuerdo (me da flojera abrir el datasheet), hay un bit de configuracion de los bits del USART que se llama Polarity. Esa es justamente para invertir el nivel de los datos.

Dos, SIMULACION EN PROTEUS... NO SIRVE!!! (por no decirlo mas soez).

Tres, quiero ver tu diagrama de amplificacion del termpar y conectado al micro. Instrumentar termopar no es cosa simple.

Cuatro, el manejo de bits puedes hacerlo así...

int a;
a = porta & (1,2,4,8,16,32,64,128);

los numeros correspondientes al bit que buscas es

bit no. decimal
0 1
1 2
2 4
3 8
4 16
5 32
6 64
7 128

y listo.

cuatro,
 
Jaja si cierto ya lo encontre eso de la polaridad, y ya descubri que los de atmel lo hacen porque algunos fabricantes de aparatos hacian su interfaz Rs232 sencilla basada en un par de transistores y otros si usaban el max232 por eso te dan las dos opciones, lo de invertir no me quedo muy claro, yo queria hacer algo asi como dato = ~dato; pero no funciona

Ya subi la imagen del ampli a gracias por responder

No funciono eso de la polaridad al parecer solo funciona con el modo sincrono

This bit is used for Synchronous mode only. Write this bit to zero when Asynchronous mode is
used. The UCPOL bit sets the relationship between data output change and data input sample,
and the synchronous clock (XCK).

Me quiero volver chango

Miren esto es lo que pretendo pero no funciona ni el ampli del termopar y los datos solo se ven bien en la terminal virtual si tiene la compuerta inversora pero si se la quiro ya no funciona y solo salen puros datos mal:enfadado: ahora si ya me enoje voy a invertir la salida del atmega con un transistor y ya

Mugre proteus le puse el transistor en vez de la compuerta logica y tarda mucho en simular ¿POrque?
 

Adjuntos

  • Ampli.JPG
    Ampli.JPG
    38.8 KB · Visitas: 48
  • circuito.JPG
    circuito.JPG
    73.4 KB · Visitas: 51
Última edición:
Sale espero tu ayuda, y bueno apenas me acabo de dar cuenta que si realmente quieres un buen medidor de temperatura con termopar debes colocarle un circuito compensador de temperatura ambiente, y como no puedo crear una fuente que entrege 80microVolts pues voy a usar un TMP37 para medir la temperatura ambiente y compensar, e visto en el proteus que todo esto se puede envitar usando un MAX6675 lo malo es que en Mexico no lo venden en ningun lado y maxim lo vende en 16.69dlls + envio y otra alternativa es el ad659 pero igual no lo venden :enfadado::enfadado::enfadado::enfadado:
Bueno voy a seguir viendo que pasa ha y lo de la inversion del dato de la USART no doy con la solucion y la verdad no quiero colocar otro integrado o transistor para invertir la señal
 
Si sigues haciendo pruebas en proteuss, temo que no voy a poder seguir ayudandote...

Ref1.jpeg


Ahora, el termopar debe de conectarse así. Una punta debe de estar en agua con hielos para poder hacer la lectura correcta, y restarle a la lectura de voltaje, el voltaje del termopar que se encuentra a 0º. Ese voltaje lo puedes obtener de la tabla de voltajes de un termopar.

Este método lo he usado sin problemas y es el mas sencillo de aplicar. Sobretodo si lo necesitas para una practica de laboratorio academico. Por otro lado esa no es la correcta conexion del opamp.
Si no tienes un amplificador de instrumentacion en chip puedes armarlo con opamps sin problemas.

instrumentation_amplifier_1.png


de R1 a R4 puedes usar resistencias de 22k (por sugerir un valor, todas deben ser iguales)

R5 y R6 puedes usarlas de 56k, de manera que su ganancia para calcular RG es...

R5+R6 = RG.
Av.

Rapido, facil y sencillo.

Benito2312 dijo:
Mugre proteus le puse el transistor en vez de la compuerta logica y tarda mucho en simular ¿POrque?

No acepto pruebas en proteuss como prueba

El ATmega trabaja sin problemas el serial, lo he usado sinfin de veces y sin meterme con la polaridad.
 
Última edición:
Pues el serial si funciona pero sin el max232 porque al parecer el atmega8 ya invierte la polaridad, en fin del ampli pues mira segun el INA122 es especial como amplificador de instrumentacion y lo conecto tal cual dice su datasheet pero el proteus como que no simula bien, voy a comprarlo para probar lo que pasa que primero queria asegurarme porque aca en mexico cuesta 18 dolares aprox por eso jeje sale luego les cuento va muchas gracias
 
Hola que tal yo de latoso de nuevo, pues para comentarles que efectivamente proteus y multisim no simulan bien el amplificador de intrumentacion INA122, pero el TINA si lo hace curioso no!!! en fin compre el integrado y trabaja bien porfin ya voy a termina mi tarea, les cuento bien de que se trataba
Consiste en capturar temperaturas en el rango de 0 a 1000 °C usando un termopar, y por supuesto para poder medir desde 0 tenia que llevar un compesador, asi que use un sensor de temperatura de ANALOG el TMP37 para sensar la temperatura ambiente y asi compensar la lectura, tambien el circuito debe enviar la informacion de la temperatura cada 1 segundo a la PC, por el momento solo via RS232, e irla almacenando en un archivo para despues poder graficarla, esta parte del software de la PC aun no la tengo jeje pero bueno para eso todavia tengo tiempo, en fin en cuanto acabe de documentar y armar todo lo subo aca.

Solo tengo una pregunta respecto al famoso SPI de los atmega, y eso es como funciona, porque por mas que intente usarlo para poder conectarle el MAX6675 nomas no pude leerlo, el programa siempre se quedaba en la espera de la transmision o recepcion y no pude por mas que le busque no encontre la solucion y me aburri, use los ejemplos que trae la hoja de datos y nada no pude
 
jojojojojo
jajajajaja
que paso compadre?
SPI es un protocolo totalmente diferente al USART.
Tu necesitas usar los puertos Rx y Tx del USART nada mas.
 
jojojojojo
jajajajaja
que paso compadre?
SPI es un protocolo totalmente diferente al USART.
Tu necesitas usar los puertos Rx y Tx del USART nada mas.


HUmm no te entendi porque dices que confundo USART con SPI, si no tienen nada que ver, la parte de la USART ya le di solucion, y ahora estaba atorado con la SPI para usar el MAX6675, quizas tu te confundiste

USART con el MAX232 para enviar datos a la PC
SPI con el MAX6675 para capturar la temperatura del termopar

Bueno si les comente que habia solucionado lo del dato que invierte el MAX232, lo que pasa que el atmega ya invierte la polaridad de la salida, pero el max232 lo vuelve hacer, entonces decidi primeramente colocar una compuerta inversora, pero despues no quize usar otro integrado asi que coloque un transistor para invertir el pulso del atmega y asi funciona hasta ahorita.

Me gustaria saber si alguien conoce algun circuito similar al max232 pero que no invierta la señal

Les agradeceria mucho la ayuda
 
Cierto, ahora si me atrapaste en una enorme confusión de mi parte... Pero ya busque el datasheet y ya se que quieres hacer...

Muy bien, un tutorial rápido del SPI.

El SPI es un protocolo serial síncrono, eso significa que requiere una señal de reloj y seleccion de dispositivo (chip select).
El SPI trabaja por pares, donde esta el dispositivo maestro (el que genera la señal de reloj), y el esclavo.

Este circuito esta diseñado para ser un circuito esclavo, de tal manera que el atmega debe ser configurado como maestro. Su transferencia de datos esta hecha para trabajar a 16 bits. (ojo aquí) El AVR solo soporta transferencias de 8 bits, entonces se necesitará hacer truco en software para leer los nibles alto y bajo del convertidor.

De hecho la manera de leer y escribir en el SPI es similar al USART.
Escribes en el buffer y el solito envia, y cuando llega, enciende la bandera.
Te recomiendo que uses interrupciones de llegada y envio para hacer mas ágil tu software.

P.D. Nunca he necesitado invertir las señales del usart con el max232. El problema es la cochinada de programa feo del proteuss... no sirve, es como la quinta vez que te lo comento. Yo he hecho bastantes aplicaciones con el usart del AVR, incluyendo una donde graficaba entiempo real datos de un motor brushless.
 
Atrás
Arriba