Autor Tema: Problemas de simulacion o solo es configuracion de software.  (Leído 5012 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado humbertocg

  • PIC10
  • *
  • Mensajes: 5
Problemas de simulacion o solo es configuracion de software.
« en: 19 de Enero de 2013, 19:00:41 »
Este foro me ha ayudado con varias cosas.

El problema es el siguiente, quiero hacer un programa para el ATmega168a que use el modulo interno RS232. Como soy primerizo use varios codigos de ejemplo.
Me base en este ejemplo para un ATmega16, el cual funciona perfectamente en la simulacion en proteus.  Una disculpa por adelantado, se que el post se vera muy grande.

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Código: [Seleccionar]
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <HD44780/HD44780.h>
#include <USART/USART.h>

unsigned char data,cont;

void initialize()
{
DDRB=0B00000111;
MCUCR=0B00000010;
GICR=0B01000000;
DDRA=0B11110111;
LCDinit();
USART_init(MYUBRR);
LCDclr();
sei();
}

ISR(USART_RXC_vect)
{
data=UDR;
switch(data)
{
case 'R':
stdout=&lcd_str;
LCDclr();
printf("LED ROJO");
PORTB=0B00000001;
break;
case 'A':
stdout=&lcd_str;
LCDclr();
LCDhome();
printf("LED AMARILLO");
PORTB=0B00000010;
break;
case 'V':
stdout=&lcd_str;
LCDclr();
LCDhome();
printf("LED VERDE");
PORTB=0B00000100;
break;
default:
LCDclr();
LCDhome();
PORTA=0x00;
break;
}
}

ISR(INT0_vect)
{
_delay_ms(300);
cont++;
switch(cont)
{
case 1:
stdout=&lcd_str;
LCDclr();
LCDhome();
printf("Mensaje 1");
stdout=&usart_str;
printf("USART ATmega ");
break;
case 2:
stdout=&lcd_str;
LCDclr();
LCDhome();
printf("Mensaje 2");
stdout=&usart_str;
printf("WWW.VDUENASG.BLOGSPOT.COM ");
break;
case 3:
stdout=&lcd_str;
LCDclr();
LCDhome();
printf("Mensaje 3");
stdout=&usart_str;
printf("It Works d(^-^)b ");
cont=0;
break;
default:
break;
}
}

int main(void)
{

initialize();
    while(1)
    {
    }
}

Codigo de USART.h

Código: [Seleccionar]
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <stdio.h>

#define FOSC 8000000UL
#define BAUD 9600UL
#define MYUBRR FOSC/16/(BAUD-1)

void USART_init(unsigned int ubrr)
{
//set baud rate
UBRRH = (unsigned char)(ubrr>>8);
UBRRL = (unsigned char)ubrr;

//Enable receiver and transmitter
UCSRB = (1<<RXEN)|(1<<TXEN)|(1<<RXCIE);

//set frame format: 8 data, 1 stop bit
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
}

void USART_Transmit(unsigned char data)
{
//wait for empty transmit buffer
while(!(UCSRA & (1<<UDRE)));

//put data into buffer, sends the data
UDR = data;

}

unsigned char USART_Receive(void)
{
//wait for data to be received
while(!(UCSRA & (1<<RXC)));

//get and return received data from buffer
return UDR;
}

static int USARTsendstream(char d, FILE *stream);
static FILE usart_str = FDEV_SETUP_STREAM(USARTsendstream, NULL, _FDEV_SETUP_WRITE);
static int USARTsendstream(char d , FILE *stream)
{
USART_Transmit(d);
_delay_ms(10);
return 0;
}
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Modificando esos codigos para el ATmega168a.
Llego a estos.

Código: [Seleccionar]
#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include "USART.h"

unsigned int data;

ISR(USART_RXC_vect)
{
data=UDR0;
stdout=&usart_str;
printf("USART ATmega ");
}

int main(void)
{
UCSR0B|=(1<<RXCIE0); // Interrupción por recepción.
sei();
USART_init(MYUBRR);

    while(1)
    {
        //TODO:: Please write your application code
stdout=&usart_str;
printf("USART ATmega ");
_delay_ms(10);
    }
return 0;
}

Y el codigo de USART.h queda asi:

Código: [Seleccionar]
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <stdio.h>

#define FOSC 8000000
#define BAUD 9600
#define MYUBRR FOSC/16/(BAUD-1)

void USART_init(unsigned int ubrr)
{
//set baud rate
UBRR0H = (unsigned char)(ubrr>>8);
UBRR0L = (unsigned char)ubrr;

//Enable receiver and transmitter
UCSR0B = (1<<RXEN0)|(1<<TXEN0); //(1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0);  //Duda.

//set frame format: 8 data, 1 stop bit
UCSR0C = (3<<UCSZ00); //(1<<UCSZ00)|(1<<UCSZ01);  //Duda.
}

void USART_Transmit(unsigned char data)
{
//wait for empty transmit buffer
while(!(UCSR0A & (1<<UDRE0)));

//put data into buffer, sends the data
UDR0 = data;

}

unsigned char USART_Receive(void)
{
//wait for data to be received
while(!(UCSR0A & (1<<RXC0)));

//get and return received data from buffer
return UDR0;
}

static int USARTsendstream(char d, FILE *stream);
static FILE usart_str = FDEV_SETUP_STREAM(USARTsendstream, NULL, _FDEV_SETUP_WRITE);
static int USARTsendstream(char d , FILE *stream)
{
USART_Transmit(d);
_delay_ms(10);
return 0;
}

El punto es que solo recibo basura en la terminal virtual de proteus, en la señal del osciloscopio se puede ver que solo manda señales cuadradas y no como es el protocolo. Llegue a la conclucion que debe ser un problema con el oscilador. Pero la verdad no que hacer, espero me puedan ayudar. Hasta luego.

« Última modificación: 19 de Enero de 2013, 19:08:22 por humbertocg »

Desconectado stk500

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 4923
Re: Problemas de simulacion o solo es configuracion de software.
« Respuesta #1 en: 20 de Enero de 2013, 01:10:23 »
Hola Humbertocg,
yo creo que tiene problema con los registro Uart, ya que el Atmega8 y diferente al Atmega16, de todas forma seria mejor que pusiera todos los archivos en un paquete y probartelo, aunque no confio en Proteus yo lo uso muy poco.aparte ¿Que programa usa para compilar?

 Saludos

Desconectado humbertocg

  • PIC10
  • *
  • Mensajes: 5
Re: Problemas de simulacion o solo es configuracion de software.
« Respuesta #2 en: 20 de Enero de 2013, 02:08:06 »
Sabia que no habia puesto eso. Estoy usando el Atmel Studio 6.0

Supuse tambien eso, pero en fin encontre un monton de ejemplos y la verdad ninguno me quiere funcionar como por ejemplo los de esta pagina http://avrbasiccode.wikispaces.com/Atmega168

En fin, gracias por responder tan pronto. Adjunto el proyecto, el modelo en proteus esta dentro de la carpeta "Debug" la version de proteus es el 7.6 SP4

Desconectado stk500

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 4923
Re: Problemas de simulacion o solo es configuracion de software.
« Respuesta #3 en: 21 de Enero de 2013, 03:08:34 »
Hola Humberto,
he intentado comprender los archivo que pusiste, y veo que tiene una Sopa no tengo muchas experiencia con GCC pero siguiendo mi tutorial aprendido no es nada posible configurar los archivos, al menos a mi, quizas otro lo tenga mas claro que yo, por otra lado creo que esta intentando aprender como funciona la comunicacion Serial de los Atmel, y te recomiendo esta pagina aqui veras muchos proyectos y Tutorial de todos.
Saludos

Desconectado humbertocg

  • PIC10
  • *
  • Mensajes: 5
Re: Problemas de simulacion o solo es configuracion de software.
« Respuesta #4 en: 22 de Enero de 2013, 04:25:44 »
Bueno antes que nada gracias a stk500 por intentar ayudarme. Se que no hice el codigo limpio por lo que me disculpo por eso, pero me ayudo que hallas intentado ayudarme. La verdad estaba muy estresado pero el apoyo me sirvio. ((:-))

Ya pude hacer funcionar el programa. Si alguien quiere el codigo puedo subirlo, pero hay muchos ejemplos en internet, solo asegurense de leer un poco los que les pongo. Estos son los pasos que lleve acabo para poder hacer funcionar el codigo.

Primero. Asegurarse de configurar bien los registros.

Para esto hay que leer el PDF del atmel en cuestion. Los registros dependen del modulo que se esta usando por ejemplo para el USART0, el registro UBRRnH se debe cambiar la n por el "0" para quedar asi UBRR0H, si no dara un error.

Código: [Seleccionar]
#define FOSC 8000000
#define BAUD 9600
#define MYUBRR (((FOSC/(16UL*BAUD)))-1)

void USART_init(unsigned int ubrr)
{
//set baud rate
UBRR0H = (unsigned char)(ubrr>>8);
UBRR0L = (unsigned char)ubrr;

//Enable receiver and transmitter
UCSR0B = (1<<RXCIE0)|(1<<RXEN0)|(1<<TXEN0); // Interrupción por recepción.

//set frame format: 8 data, 1 stop bit
UCSR0C = (1<<UCSZ01)|(1<<UCSZ00);
}

Segundo. El orden del codigo.

Como en USART_init(MYUBRR) se estan habilitando la interrupcion por recepcion se debe llamar la funcion sei() para habilitar las interrupciones generales. En este caso me parece que el orden importa, entonces lo puse en ese orden porque de otra forma no funciona, no a mi por lo menos

Código: [Seleccionar]
        USART_init(MYUBRR);
sei();

Tercero. El parametro de la interrupcion.

Las interrupciones utilizan parametros para determinar el tipo de interrupcion. A mi me llamo la atencion que cada atmel tenga diferentes parametros para el mismo tipo de interrupcion. En este caso, para la interrupcion por recepcion de usart del ATmega168 usa como parametro "USART_RX_vect" mientras que otro Atmel como el ATmega323 use como parametro "USART_RXC_vect".

Código: [Seleccionar]
ISR(USART_RX_vect)
{
data=UDR0;
}

Si alguien se topa con ese problema, porque de hecho el compilador les dara un warning parecido a este "'USART0_RX_vect' appears to be a misspelled signal handler [enabled by default]" y por ende no entrara a la interrupcion. Les dejo esta pagina para que chequen, dependiendo del modelo que es lo que necesitan. Eso si, parace que esa informacion esta dentro de la librerria avr/interrupt.h

http://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html

Cuarto. Frecuencia de cristal.

Quien se mete a con la comunicacion serial y seguramente con otros modulos internos del atmel se va a dar cuenta que necesita definir una frecuencia de reloj. Para no hacer el cuento largo, al momento de programar se define las caracteristicas de ese cristal que se necesita, por lo que no es necesario meterse con los "fuses".

Ademas, si se simula en proteus. En las propiedades del microcontrolador atmel, viene por default, el CLKDIV8 esta habilidado como (0) programmed. Este valor debe cambierse por (1) unprogrammed para evitar la division por 8 del reloj y por tanto evitar anomalias. Claro a menos que se ocupe asi.

Espero que esta experiencia ayude a personas que van empezando como yo.

Cuidense.

Desconectado stk500

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 4923
Re: Problemas de simulacion o solo es configuracion de software.
« Respuesta #5 en: 22 de Enero de 2013, 08:02:55 »
 ((:-)) ((:-)) muchas gracias por tu gran corto Tutorial, claro que los registros de algunos micro son diferente, yo siempre me leo la hojas de datos,
lo que es siempre mejor aaprender con un solo micro todos sus registros y despues de saborearlo emigrar a otros, yo te recomiendo el Atiiny2313, claro que esta poco de uso, pero con ese aprende para emigrar a un Atmega8 su sucesor, el error que comete muchos que aprenden es  el no leer, eso lo aprendi aqui en este foro, gracias a muchas gente que se ofrecen a darte los pasos.
una vez mas me alegro que los pudiste hacer funcionar  ((:-)) ((:-))

Un gran saludos