Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:
Hola!!
He escrito un programilla de prueba que lo único que hace es enviar constantemente un byte por el puerto USART0 de un Atmega1284P.
Os copio el código para que me digáis qué es lo que falta o esta mal; es el primer programa que hago con AVR GCC y no sé si se me está pasando algo.#include <avr/io.h>
int main(void)
{
/ Activamos funciones USART 0 /
//UBRR a 51 (UBRRL a 33 hex) para Bitrate a 9600 y Clock de 8MHz
UBRR0H = (unsigned char)0;
UBRR0L = (unsigned char)51;
//Activamos recepcion y emision
UCSR0B = (1<<RXEN0)|(1<<TXEN0);
/* frame format: 8data, 1 stop bit */
UCSR0C = (3<<UCSZ00);
while(1)
{
while ( !( UCSR0A & (1<<UDRE0)) );
UDR0 = 200;
}
}
Como info adicional, los Fuses del micro para programar el reloj están como por defecto y con el CKDIV8 a 0, lo que supongo que es a 8MHZ, ¿cierto? Es decir, Oscilador RC interno, startup 6CK + 65 ms
Gracias!!!
Hola:
No tengo claro que el reloj te funcione a 8MHz, lo habitual suele ser que trabajen a 1MHz por defecto. Recuerda que los fuses, cuando se programan, se ponen a 0, y cuando están 'borrados' suelen estar a 1 (algo inherente a la Flash, EEPROM en general, etc.).
¿Has comprobado con el osciloscopio que algo salga por el puerto serie? Prueba a mandar 0xAA o 0x55, por ejemplo (una secuencia de 1 y 0 alternados).
Añado el código de un M128 a 8MHz (con resonador cerámico externo).
//UART1 initialize
// desired baud rate:9600
// actual baud rate:0 (0,2%)
void uart1init(void)
{
UCSR1B = 0x00; //disable while setting baud rate
UCSR1A = 0x00;
UCSR1C = 0x06;
UBRR1L = 0x33; //set baud rate lo
UBRR1H = 0x00; //set baud rate hi
UCSR1B = 0x98; //Activam es port i s'interrupció per Rx
}
¿Puedes poner una captura de pantalla del AVStudio cuando grabas con los settings del AVRISP o JTAG? ¿Tienes acceso a un depurador (AVRDragon o JTAGICE)?
Hola Beamspot!
Gracias por responder!! Esta semana ando bastante liado, pero a ver si hoy o el finde puedo ponerme otra vez con esto, pruebo lo que me comentas y te contesto en condiciones.
De momento te voy adelantando:
Es cierto que por defecto el micro trabaja a 1MHz, pero es debido a que esta activo el fuse CKDIV8, que divide la frecuencia por 8; pero ese fuse lo he desactivado. Para desactivarlo, desde el AVR Studio y utilizando el AVRISP, simplemente he desactivado la pestaña que estaba acivada por defecto (ya te pondré una captura cuando pueda).
No tengo osciloscopio 🙁 es un cacharro bastante caro y de momento no lo he hechado mucho en falta (quizá ahora empiece a hacerlo). Para comprobar si sale algo por el puerto serie simplemente envío bytes completos (255) cada cierto intervalo de segundos y compruebo si oscila bien el voltaje con un voltímetro..... ya lo sé, es impreciso y me puedes llamar cutre, pero no tengo justificado el gasto de 200€ en un osciloscopio, de momento 🙂
La verdad es que no he hecho esta prueba.... la haré y te comento.
Y no, tampoco tengo un depurador.... como puedes ver, mis métodos son bastante rudimentarios... me falta ponerme a soldar con yesca y pedernal 😉
Pero en este caso sí tengo en mente hacerme con un depurador pronto, porque sí que puede suponer un gran avance evolutivo en mi vida!!
Y bueno lo dicho, a ver si tengo tiempo este fin de semana y comento algo nuevo!
Gracias y un saludo!
Yo tengo un AVRDragon 'nuevo', y estoy muy contento con el, aunque lo use poco. He trabajado mucho con el JTAG, y una vez acostumbrado, no usar un ICD (In Circuit Debugger) es como volver a la prehistoria.
255 no es una buena idea para sacar por el puerto serie, tal y como te he recomendado, es mejor un valor que genera auténtica alterna (si puedes medir frecuencia con el multímetro, que hay que lo hacen), o tensiones diferentes de -5 o +5. Incluso puedes ir enviando el valor de un contador de 0 a 255.
Sin osciloscopio se puede vivir, pero hay algunos para PC/USB baratos, incluso para conectar directamente a la tele o a un monitor. Siempre es bienvenido el tener algo a mano, y quizás debería ser lo siguiente en la lista de prioridades.
Otra opción para el puerto serie es precisamente el hiperterminal o similares, configurado a velocidades altas. Así puedes ver si recibes algo, aunque sea basura, o no recibes nada de nada...
Gracias por los consejos!
Finalmente el problema estaba en el cableado.... al final fué la típica tontería de un cable conectado donde no debía.
Ahora me he puesto a probar el código de verdad.... y por supuesto no funciona 🙂 Asi que, como te comenté, estoy barajando la posibilidad de comprar un debugger, asi que pido algo de consejo:
Tengo comprado de hace un par de años el AVRISP.... existe alguna herramienta que me permita hacer debugging a través de él? Lo digo para aprovechar el programador que ya tengo comprado.
En caso negativo, si me tengo que comprar algo, me gustaría que me permitiese hacer debugging directamente desde la placa en la que esté montado el micro.
Que me recomiendas mejor? El JTAGICE o el AVRDRAGON? Aunque el DRAGON creo que va en placa de test, creo que es más barato, no?
Aún así, si conoces algun otro debugger, comentalo..... vamos, o que lo comente quien quiera del foro 😉
Gracias!!!