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

Oigan que opinan del microcontrolador DS89C450 de Maxim, creen que el nucleo 8051 ya paso de moda, o creen que todavia tenga mucho sentido aprenderlo, yo se usar el 8031 y pues practicamente igual al ds89c450 claro esta este ultimo solo le he visto como ventaja su memoria flash de 64KB y su habilidad para ser programado via serie rs232, que opinan a cerca de este micro, yo he visto que se usa mucho en la industria ¿Porque?
 
Última edición:
Hola otra vez yo consultando, y esta vez para saber que interruptor de AC me recomiendan, tengo que aplicarle el PWM, al principio se supone que hiba a ser con CD e hiba usar un mosfet, pero ahora ya me la cambiaron y debe ser con AC, pero el mosfet con AC no va bien, y el triac pues no responde al AC, entonces estaba viendo la posibilidad de usar un IGBT, pero es la primera vez que trabajaria con uno, alguna idea, recomendacion, sugerencia o queja de porque pregunto mucho jeje todas son aceptadas, o me recomiendan mas que rectifique la señal de AC en este caso es de 120V y despues de rectificada se la aplico a la resistencia calefactora con un mosfet, encontre Switch para AC
http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/DATASHEET/CD00003319.pdf

pero no entiendo si funcionaria con PWM, pues al ser alterna como es que responderia este dispositivo al PWM

Ayuda porfa
 
A ver, no entiendo que quieres... quieres controlar la amplitud de voltaje de una corriente AC?
Como los dimmer de los focos domésticos para controlar la luminosidad?
 
OYe porque te pusiste antiworlxd?? bueno te explico, hiba usar el pwm para controlar la temperatura de una resistencia para calentar agua de esas comerciales, entonces hiba usar CD, pero ahora me piden que use AC, pero como funciona el pwm con AC, "Eso se puede" que no el pwm solo se aplica a DC, en fin tengo que controlar la temperatura pero con el uso de PWM, como le hago, y si mejor rectifico la AC y la paso a CD, eso seria una buena solucion?? y bueno pues si es parecido al dimmer al fin y al cabo creo que hacen lo mismo
 
Otra pregunta mas, fijate que estoy jugando con el rtc ds1307 de maxim, total que no he podido leer desde el, segun el programa si escribe bien puesto que no se traba pero cuando intento leer no lee nada se queda trabado alguien conoce la rutina para leer con I2C porque la que hice no funciona, o no se si me esta fallando el concepto de NACK porque tengo que enviarlo pero no entendi bien desde la datasheet como se envia podrian explicarme esto
case i2c_Datos_Salen:
TWDR = dato;
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT))); //Esperamos a que finalize
return (TWSR&0xF8);
break;

case i2c_Datos_Entran:
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
while (!(TWCR & (1<<TWINT))); //Esperamos a que finalize
return TWDR;

La que dice datos_salen es para grabar y al parecer eso lo hace bien pero en Datos_Entran se queda en el ciclo while, la hoja de datos dice que para finalizar la lectura se debe enviar el NACK pero no se como se envia, la datasheet del atmega dice que no es accesible por el usuario
 
Nunca he usado el I2C, ahi si te voy a fallar para no decirte mentiras.
Por otro lado, mañana te cuento como es que se trabajan los triac para controlar el voltaje promedio de una corriente AC. No es algo asi que muy sencillo que digamos. Tiene su chiste.
Es que ahorita vengo llegando de la parranda XD XD, y ya traigo sueño...
 
pero como funciona el pwm con AC, "Eso se puede" que no el pwm solo se aplica a DC, en fin tengo que controlar la temperatura pero con el uso de PWM, como le hago, y si mejor rectifico la AC y la paso a CD, eso seria una buena solucion?? y bueno pues si es parecido al dimmer al fin y al cabo creo que hacen lo mismo

Hola, claro que se puede. Pero para situaciones y cargas particulares. Yo lo probé... lee este tema (https://www.forosdeelectronica.com/f12/controlar-tension-alterna-corriente-continua-53111/index2.html#post468813) y de una véz miras la discución:cabezon:... en varios sitios de la red como edaboard.com hablan de este método. El cuál ha sido muy anatematizado por un par de foristas........

mira con tus propios ojos y pruébalo para que nos cuentes como te fué.... puede que te funcione, como puede que no.. eso depende de ese sistema que vas a controlar.

La idea es utilizar una frecuencia relativamente Baja de PWM, que abarque unos 20 semiciclos de la señal de potencia, así tendras unos 20 "niveles" de potencia. Si tu red trabaja a 50Hz entonces serán como 200ms en el PWM, unos 5Hz.

Otra manera que se menciona un par de veces acá en el foro, es utilizar un puente rectificador y mosfet, un IGBT también servirá. Así tendrás encendido y apagado instantáneo aprovechando el PWM a una frecuencia mucho mas alta....

PD: espero que no se empiece una discusión en este tema, debido al frankenstein PWM-OptoTriac


Por otro lado......

Otra pregunta mas, fijate que estoy jugando con el rtc ds1307 de maxim, total que no he podido leer desde el, segun el programa si escribe bien puesto que no se traba pero cuando intento leer no lee nada se queda trabado alguien conoce la rutina para leer con I2C porque la que hice no funciona, o no se si me esta fallando el concepto de NACK porque tengo que enviarlo pero no entendi bien desde la datasheet como se envia podrian explicarme esto
case i2c_Datos_Salen:
TWDR = dato;
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT))); //Esperamos a que finalize
return (TWSR&0xF8);
break;

case i2c_Datos_Entran:
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
while (!(TWCR & (1<<TWINT))); //Esperamos a que finalize
return TWDR;

La que dice datos_salen es para grabar y al parecer eso lo hace bien pero en Datos_Entran se queda en el ciclo while, la hoja de datos dice que para finalizar la lectura se debe enviar el NACK pero no se como se envia, la datasheet del atmega dice que no es accesible por el usuario

Ya miraste por acá?? http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=49778

Tuve una tarea similar...., yo trabajo con el codevision el cual no tenía la libreria TWI, o por lo menos la version con la que estaba trabajando...

Luego, un dia después de buscar mucha información y a punto de empezar a desarrollar esa libreria, me llegó un e-mail de Adriana Haiduc de HP infotech informandome que habia una nueva version de mi codevisionAVR... la descargué y púm!!! ahí estaba la nueva libreria jejejej me ahorro muchísimo trabajo....

Arriba en el vinculo que lleva a el foro de AVRfreaks dicen que hay un proyecto que explíca mucho mejor lo que necesitas.... pero te toca registrarte para verlo.

Paz y Saludos
 
Última edición:
PD: espero que no se empiece una discusión en este tema, debido al frankenstein PWM-OptoTriac, jejeje muy cierto todo mundo anda emocionado con su opto y triac, pues mira ya le di una mirada a eso que mencionas del pwm, sin embargo por lo que entendi "a no ser que no haya entendido nada" es que esto solo funcionaria con el semiciclo positivo, ¿¿¿???, en fin la segunda, pues he intentado usar codevision pero la verdad no me late, ya estoy muy metido con WinAvr gcc entonces no veo ahorita la necesidad de cambiarme, pero aun asi voy a ver como implementa codevision la rutina del twi, aver si se la copio jeje

Chales ya cheque el codigo de la twi, pero la verdad estos cuates se emocionan haciendo codigo y termino mas confundido mejor voy a hacer el mio jejej mas facil y sin tantas complicaciones
 
Última edición:
Obvio, no quiero que te cámbies jejejej sólo te estaba contando la historia..... Pero revizaste la página AVRFreaks? allí hablan sobre AVR gcc no sobre codevision.

Sobre frankestein, hablan de un semiciclo haciendo mencion a 20 semiciclos como el tiempo del PWM, funciona sobre ambos ciclos. Mencionan es que se deberia utilizar un Zero Crossing.

Saludos
 
Oye me acabo de topar con un compilador llamado MikroC AVR, alguien a trabajado con este compilador, lo estoy probando y parece muy bueno, me gusta hasta ahorita, alguien tiene referencias de el
 
Yo he usado el mikro C para pics y viene muy completo. Trae rutinas de teclado, lcd y mas chucherias. Pero en lo personal no me gusta tener codigo que no conozco jejejeje.

Por mi puedo decirte que no tuve problemas con el las veces que lo he usado.
 
Yo he usado el mikro C para pics y viene muy completo. Trae rutinas de teclado, lcd y mas chucherias. Pero en lo personal no me gusta tener codigo que no conozco jejejeje.

Por mi puedo decirte que no tuve problemas con el las veces que lo he usado.

Pues si, mira que cosas, me llevo solo 20 minutos "resolver" el problema del DS1307 y la TWI, muy bonito compilador, aunque honestamente quien sabe que tanto haga por dentro, voy a seguir urgando entre sus codigo .h a ver que le saco de bueno, ok mientras voy a emocinarme, nota tambien tienen compilador para PIC, 8051 y ARM y todos en tres lenguajes distintos, C, Pascal y BASIC, y bueno ya porque paresco mas vendedor que otra cosa jaja
 
Hola, yo he tenido y estoy teniendo un problema con la uart del atmega8L en este caso.
yo configuro todo para 9600 baud 8datos sin paridad 1 bit de stop pero no se por que no logro que se comunique a la pc. uso el term95 y con el attiny2313 no he tenido problemas. espero que me puedan ayudar por que ya intente de todo como por ejemplo invertir la señal aunque solo por que en proteus funcionaba asi, pero bueno es que ya no se que hacer dejo el codigo:

#define F_CPU 8000000UL
#define BAUD 9600
#define MYUBRR F_CPU/16/BAUD-1
#include <avr/io.h>
#include <util/delay.h>
#include <stdio.h>

void initUART(unsigned int ubrr)
{
UBRRH = (unsigned char) (ubrr >> 8); //Guardo el bautrate en el registro
UBRRL = (unsigned char) ubrr; //si supera un byte el 2°byte se guarda en el byte alto
UCSRB = (1<< RXEN)|(1<<TXEN);//|(1<<RXCIE); //Habilito recepción, transmisión e interrupcion RX
UCSRC = (1<<UCSZ1)|(1<<UCSZ0); //bit de datos = 8
//Registro de estado de la UART
//UCSRA=|RXC|TXC|UDRE|FE|DOR|PE|U2X|MPCM|
}
int USART_Transmit(char data,FILE *stream )
{
if (data =='\n')
USART_Transmit('\r',stream);
while ( !( UCSRA & (1<<UDRE)) ); //Esperar transmision completa
UDR = data; //Guardo dato en el registro UDR
return 0;
}
int USART_Receive( FILE *stream)
{
unsigned char data;
while ( !(UCSRA & (1<<RXC)) ); //Espera recepcion
data = UDR;
//USART_Transmit(data,stream);
return data; //Retorno con el dato en el buffer data
}

FILE uart_str = FDEV_SETUP_STREAM(USART_Transmit, USART_Receive, _FDEV_SETUP_RW);

int main(void)
{
DDRB=0X00;
PORTB=0X00;
DDRD=0XFF;
PORTD=0X00;
stdout = stdin = &uart_str;
initUART(MYUBRR);

while(1)
{
printf("H");
_delay_ms(1000);
//TODO:: Please write your application code
}
}

cuando mando esa H todo el dato dura unos 30ms creo que eso esta re mal pero uds me guiaran

desde ya muchas gracias!!
 
Yo veo algunos detalles por ejemplo defines MYUBRR pero en la funcion initUART pones ubrr y bueno ademas no deberias usar stdio solo complica las cosas cuando en realidad es mas facil

//Definimos la frecuencia del micro
#define F_CPU 4000000L
//Y la tasa de transferencia
#define USART_UBBR_VALUE 25


#include <stdint.h>
#include <avr/io.h>
#include <avr/delay.h>

void USART_INIT(void) //Inicializamos al modulo USART
{
UBRRH = (uint8_t)(USART_UBBR_VALUE>>8);
UBRRL = (uint8_t)USART_UBBR_VALUE;
UCSRC = (0<<USBS)|(1<<UCSZ1)|(1<<UCSZ0);
UCSRB = (1<<RXEN)|(1<<TXEN);
}

void USART_SendByte(uint8_t u8Data)
{
while((UCSRA&(1<<UDRE)) == 0);
UDR = u8Data;
}

unsigned char USART_ReceiveByte()
{
while ( !(UCSRA & (1<<RXC)) );
return UDR;
}
int main()
{
USART_INIT();
USART_SendByte('J');
while(1)
{
}

}

Asi tal cual funciona en el atmega8 y es cierto recuerda que el proteus tiene el error de que no invierte la señal que sale por TX por eso en la simulacion le pones un inversor pero en la realidad no se lo pones. Si quieres enviar toda una cadena de texto por la USART pues solo usas un ciclo for y ya

for(int k = 0; k != _Caracteres; k++)
{
USART_SendByte(cadena[k]);
}
 
Atrás
Arriba