Comunicacion rs232 con ATMEGA32?


#1

[QUOTE=mesenier;22597]Hola amigos, normalmente programo con PIC y esto no me habria supuesto ningun problema, pero esto de practicas y aqui parece ser que impera ATMEL sobre PIC, con lo cual me veo obligado a adaptarme…

Necesito utilizar el sistema de comunicacion rs232 para comunicar el Micro Con la PC y viceversa, sin embargo no soy capaz de conseguirlo… tengo un programa he buscado y rebuscado en google pero no he sido capaz de adaptar un programa de por ahi a mi atmega32…

Con lo cual, necesito vuestra ayuda…

Aqui un enlaze con lo que he conseguido hasta ahora, Proteus+AVRstudio , es con el atmega 168, que no he logrado hacer funcionar en el atmega32, y ademas el pic solo emite, no recibe, es decir estoy bastante lejos de lograr mi objetivo…

Podria alguien pasarme un codigo de ejemplo???, por favooor jaja no tengo a quien recurrir.

Os lo agradezco mucho[/QUOTE]

Este codigo es uno de los mil que he probado y no funciona

include <avr/io.h>
#include <util/delay.h>
#define clear_bit(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#define set_bit(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#define toogle_bit(sfr, bit) (_SFR_BYTE(sfr) ^= _BV(bit))
#define USART_BAUDRATE 4800
#define BAUD_PRESCALE (F_CPU / 16 / USART_BAUDRATE - 1)
int main(void)
{
clear_bit(DDRD, DDD7);
set_bit(PORTD, PD7); //PD7 (pulsador)
set_bit(DDRD, DDD6); //PD6 (led)
clear_bit(PORTD, PD6); //led apagado
UCSRB |= (1 << RXEN) | (1 << TXEN); // Inicializa la USART para envio y recepción.
UCSRC |= (1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1); // Asincrónica, 8,N,1
UBRRH = (BAUD_PRESCALE >> 8);
UBRRL = BAUD_PRESCALE;
char mensaje[] = "Hola mundo AVR
";
for (;;)
{
if (bit_is_clear(PIND, PD7))
{
_delay_ms(20);
if (bit_is_clear(PIND, PD7))
{
char *s = mensaje;
while (*s != 0)
{
while (( UCSRA & (1 << UDRE ) ) == 0) {};
UDR = *s++;
}
loop_until_bit_is_set(PIND, PD7);
}
}
if ( UCSRA & (1 << RXC ))
{
if (UDR == '0')
toogle_bit(PORTD, PD6);
}
}
}

Bueno llegar si que llega, pero solo simbolos extraños,

Supongo que es un conflicto entre el reloj del micro y baud rate pero no se, no he sido capaz de solucionar…

Aqui una imagen de uno dee mis intentos fallidos en proteus

https://docs.google.com/file/d/0BzzRKo_lcYklbXNXZ2R0Y3VmckE/edit?usp=sharing


Alguna sugerencia???
Graciaaas


#2

[QUOTE=mesenier;22597]Hola amigos, normalmente programo con PIC y esto no me habria supuesto ningun problema, pero esto de practicas en polonia y aqui parece ser que impera ATMEL sobre PIC, con lo cual me veo obligado a adaptarme…

Necesito utilizar el sistema de comunicacion rs232 para comunicar el Micro Con la PC y viceversa, sin embargo no soy capaz de conseguirlo… tengo un programa he buscado y rebuscado en google pero no he sido capaz de adaptar un programa de por ahi a mi atmega32…

Con lo cual, necesito vuestra ayuda…

Aqui un enlaze con lo que he conseguido hasta ahora, Proteus+AVRstudio , es con el atmega 168, que no he logrado hacer funcionar en el atmega32, y ademas el pic solo emite, no recibe, es decir estoy bastante lejos de lograr mi objetivo…

Podria alguien pasarme un codigo de ejemplo???, por favooor jaja no tengo a quien recurrir.

Os lo agradezco mucho[/QUOTE]

Este codigo es uno de los mil que he probado y no funciona

include <avr/io.h>
#include <util/delay.h>
#define clear_bit(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#define set_bit(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#define toogle_bit(sfr, bit) (_SFR_BYTE(sfr) ^= _BV(bit))
#define USART_BAUDRATE 4800
#define BAUD_PRESCALE (F_CPU / 16 / USART_BAUDRATE - 1)
int main(void)
{
clear_bit(DDRD, DDD7);
set_bit(PORTD, PD7); //PD7 (pulsador)
set_bit(DDRD, DDD6); //PD6 (led)
clear_bit(PORTD, PD6); //led apagado
UCSRB |= (1 << RXEN) | (1 << TXEN); // Inicializa la USART para envio y recepción.
UCSRC |= (1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1); // Asincrónica, 8,N,1
UBRRH = (BAUD_PRESCALE >> 8);
UBRRL = BAUD_PRESCALE;
char mensaje[] = "Hola mundo AVR
";
for (;;)
{
if (bit_is_clear(PIND, PD7))
{
_delay_ms(20);
if (bit_is_clear(PIND, PD7))
{
char *s = mensaje;
while (*s != 0)
{
while (( UCSRA & (1 << UDRE ) ) == 0) {};
UDR = *s++;
}
loop_until_bit_is_set(PIND, PD7);
}
}
if ( UCSRA & (1 << RXC ))
{
if (UDR == '0')
toogle_bit(PORTD, PD6);
}
}
}

Bueno llegar si que llega, pero solo simbolos extraños,

Supongo que es un conflicto entre el reloj del micro y baud rate pero no se, no he sido capaz de solucionar…

Alguna sugerencia???
Graciaaas