Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:
Hola. me encuentro empezando a programar un atmega16 para poder comprar con los pics.. con el avrstudio y el winavr, de programador uso un avrisp mkii.
Le he hecho la conexión para ISP, y al intentar programar me pasa lo siguiente:
Entering programming mode.. OK!
Erasing device.. OK!
Programming FLASH .. OK!
Reading FLASH .. FAILED!
Leaving programming mode.. FAILED!
Me falla en la lectura, pero el programa aún así parece que lo graba bien.
El otro problema es con el programa, estoy utilizando un cristal de 16 MHz, y yo diría que el programa se está ejecutando mucho más lento. No sé si es que me selecciona algún oscilador interno o que pasa, ya que la salida que obtengo en el osciloscopio en el PORTA.0 es esta:
Con los 16 MIPS yo me esperaba algo más de esos 90 kHz x_x.
El código del programa no sé si me falla algo, ya que estoy dando palos de ciego con este compilador, tanto que me estoy pensando en cambiarme a otros de los que tengo libros basados en ellos./***************************************************
*
* Apagar y encender el PORTA.0
*
*****************************************************/
#include <avr> //falta la barra .io que me lo edita mal esto
void inicializar_puertos(void);
//Programa principal
int main(void)
{
inicializar_puertos();
while(1)
{
PORTA=0x00;
PORTA=0x01;
}
}
// Funciones
void inicializar_puertos(void)
{
DDRA=0x01;
PORTA=0x00;
DDRB=0x00;
PORTB=0x00;
DDRC=0x00;
PORTC=0x00;
DDRD=0x00;
PORTD=0x00;
}
Al hacer el build obtengo lo siguiente:
avr-gcc.exe -mmcu=atmega16 -Wall -gdwarf-2 -DF_CPU=16000000UL -O0 -fsigned-char -MD -MP -MT led.o -MF dep/led.o.d -c ../led.c
avr-gcc.exe -mmcu=atmega16 led.o -o led.elf
avr-objcopy -O ihex -R .eeprom led.elf led.hex
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 --no-change-warnings -O ihex led.elf led.eep || exit 0
Device: atmega16
Program: 242 bytes (1.5% Full)
(.text + .data + .bootloader)
Data: 0 bytes (0.0% Full)
(.data + .bss + .noinit)
Build succeeded with 0 Warnings...
No sé que puede estar mal, ya que es de los primeros circuitos y programas que monto con esta familia, seguro que será cualquier tontería, alguna opción del avrstudio, o incluso el C que lo tengo bastante olvidado.
En la placa tengo montada la conexión de isp, alimentadas las vcc, gnd, avcc y agnd, y conectado el cristal de 16 MHz con sus dos condensadores de 22p.
En fin a ver si alguien sabe que me puede estar pasando, mañana le daré más vueltas y buscaré por internet, que habrá código y ejemplos para el winavr para aburrir.
Gracias. Saludos.
Una pregunta, como se hace para poder ver el código de ensamblador que genera el compilador si es posible, que sólo veo un .hex para grabar. Como en el ejemplo que pusistes para la comparativa.
Lo digo porque en este ejemplo tenemos un duty del 50%, es como si después de la primera instrucción hubiese unos cuantos nop, equivalentes al tiempo de las instrucciones de salto del loop.
Si pensamos este mismo ejemplo en ensamblador saldría un duty del 25% (on, off, salto(2 ciclos máquina)).
Hola:
Por fin en casa, pero en la de campo (Segur de Calafell, sin internet), así que en unos momento que me he pasado por Vilanova, te cuento esto.
Me alegra que lo solucionases, y que fuese lo que me esperaba. También me alegra haberte sido de ayuda. Así que te explico un poquito más: lo que buscas, está en las carpetas del proyecto (en la ventana de la izquierda), bajo la carpeta de 'Other files'. Abre el archivo con extensión .lss.
No te asustes por la cantidad de código que mete el compilador por tí, y tampoco por la mala 'correspondencia' entre el código que tienes escrito en C y el que te sale compilado. La única manera que te haga al pie de la letra lo que le pides en C es que la optimización esté en -O0 (Ventana de Project Options, justo debajo de la frecuencia de reloj). Por defecto te viene en la optimización mejor, de manera que te puede (seguro que lo hace) dar sorpresas.
Por cierto, yo hubiese hecho el main así:
int main(void)
{
Inicializa_puertos();
for(;;)
{
PORTA^=0x01;
}
}
que te hace el complemento de la máscara de bits (0x01 en este caso) en el puerto A (or exclusiva).
Deformaciones del C. Que conste que lo que tienes es correcto, y que los pasos que sigues son los que a mi juicio son correctos (ver el ensamblado etc). Por cierto, el simulador que viene incorporado va bastante bien para estas cosas, así que puede ser interesante que lo uses de vez en cuando.
Que os divirtáis.
Beamspot.
Ese archivo no lo tengo, tengo la carpeta de other files vacía, y mirando en la carpeta creada con el proyecto tampoco aparece.
Pero bueno creo que me voy a atrever a diseñar ya la placa para el velocista con el atmega16, porque como me ponga con cada uno de los periféricos se me va a demorar mucho, así que lo más rápido va a ser intentar hacer la placa mirando los ejemplos que tengo en un libro y aprender a programar sobre ella, ya que el otro día me tire una tarde para hacer una máquina de estados con 3 leds y 3 pulsadores y no conseguí que funcionase, no pongo el código que me da vergüenza 😳
La duda que tengo es en como medir la velocidad sin meter enconders, pensaba en medir la tensión en la batería para aumentar el duty cuando esta disminuya, pero creo que va a ser difícil de calcular que duty es necesario para que tensión.
Lo de medir la fuerza contraelectromotriz del motor tb lo veo complicado.
Se os ocurre alguna otra forma? ya que lo de poner un enconder en el miniz está complicado.
Bueno voy a ver cuantos atmega16 quemo hasta tener algo que funcione.
Gracias. Saludos.
¿Has probado a compilar? Si no está compilado, la carpeta está vacía. Una vez compilado aparecen los archivos. Si los borras y vuelves a compilar, te los vuelve a generar. El archivo .lss te debería aparecer dentro e la carpeta default que debería aparecer (creo que te la crea el GCC solito) en la carpeta donde tengas el proyecto (los archivos en .c).
Para medir la velocidad, yo pensaba poner encoders. De hecho, he pegado un trocito de placa de C.I. en la parte posterior del eje del motor, con un papel impreso en blanco y negro. De esta manera, se puede medir la velocidad del motor, y por ende, la velocidad del aparato. Lo difícil, en mi caso, va a ser poner los optos (los mismos que tengo para la placa de sensores del siguelíneas/velocista).
Si tuvieses un JTAG, podrías depurar el programa dentro del mismo circuito y ver el ensamblado, mientras lo ejecutas paso a paso. De hecho, puedes hacer lo mismo sin JTAG, pero con el simulador, para depurar tu máquina de estados. Y simulas las teclas con las entradas de un puerto, y las salidas con la salida del mismo (PINX y PORTX).
Para usar el depurador, desde el AVRStudio, una vez abierto el proyecto, en el menú de Debug, Select Platform and Device, en la ventana de diálogo, seleccionas AVR Simulator y ATmega16.
Entonces, una vez compilado, de las al icono/botón tipo play o al menú Debug Start Debugging (primera opción del menú).
Empezará la depuración, y podrás ver la ventana de ensamblado desde le menú View Disassembler. Con F10 y F1 podrás ir avanzando por el programa, y en la ventana de I/O View podrás vér y modificar el estado de los registros, puertos, etc. Es fácil de usar, intuitivo, y muy in-formativo, así que lo recomiendo a todos.
Aviso, por cierto, que los timers no parecen ir muy bien en el simulador, pero como yo no lo uso, no se que problemas presenta.
Que os divirtáis.