martes, 5 de septiembre de 2017

USBaspLoader: Bootloader por USB sin ftdi

USBaspLoader es un bootloader por USB para microcontroladores AVR con al menos 2 KB flash de memoria para bootloader, por ejemplo los populares ATMega8, 168 y 328.

La ventaja es que no necesita ningún chip conversor USB-Serie ni ningún otro controlador usb ya que tiene un driver por software basado en V-USB, también de obdev.

Basicamente emula un programador USBasp que se puede usar desde avrdude, de manera que en el host USB se presenta como si hubiéramos conectado un USBasp y se programa normalmente con avrdude, por tanto las placas que lo usen se pueden integrar en el software Arduino seleccionando USBasp como método de programación.
Ejemplo de uso con avrdude para grabar un Atmega328p:

 avrdude -c usbasp -p m328p -u -U flash:w:archivo.hex

Al resetear el micro arranca el bootloader si se cumple cierta condición, normalmente el estado de un pin, que se puede ajustar con un jumper o conmutador; aunque esta condición es configurable si se editan y compilan las fuentes; si no se cumple la condición se ejecuta normalmente el programa grabado en la sección baja de la flash.

Este bootloader se puede grabar al chip con cualquier programador ICSP, pero antes hay que ajustar los fuses correctamente, esta información se puede encontrar en el makefile del firmware, por ejemplo para Atmega328 a 16 MHz:

lfuse: 0xF7
hfuse: 0xDA
efuse: 0x03

El bootloader lo podéis descargar de aquí: http://www.obdev.at/products/vusb/usbasploader.html Más info sobre V-USB: http://www.obdev.at/products/vusb/index.html

 USBaspLoader permite hacer placas de desarrollo u otros proyectos con un mínimo de hardware y por tanto de costo reducido.

miércoles, 21 de junio de 2017

Simulador de Circuitos.

SimulIDE es un simulador de circuitos electrónicos en tiempo real que incluye simulación de microcontroladores PIC y AVR.

ES simple y facil de usar, con una interface gráfica muy limpia en la que no te sentirás sobrecargado por infinidad de opciones y herramientas.
Simplemente eliges componentes, los colocas en el circuito, los conectas y le das al botón de encendido.

La mayoria de las cosas las puedes hacer con el ratón, a veces usando las teclas ctrl o shift.


Tiene un buen número de componentes y en cada versión añaden algunos nuevos.

Dispone de osciloscopio así como de plotter, que se activan con el componente "Probe".

Es de destacar que en la simulación de microcontroladores tienes varias opcione interesantes:

- Monitor serie, para monitorizar comunicaciones por puerto serie primario, pudiendo también enviar datos/ASCII al micro.


- Conectar a un puerto serie en tu computadora, ya sea un puerto serie real como virtual.

- Observar variables y registros del Micro


En resumen, interesante y muy facil de usar simulador, con versiones para Windows y Linux.

Esta es su página web: SimulIDE



viernes, 16 de marzo de 2012

Sensor de tempearatura interno Atmega328p

El atmega320P y algunos otros AVR tienen un sensor de tempeartura interna, accesible desde el conversor analógico-digital. Util para detectar sobrecalentamiento.

La precisión no es muy buena en principio, pero se puede calibrar.
Hay una guía de Atmel pra el calibrado: www.atmel.com/Images/doc8108.pdf

Para leer el sensor hay que configurar el ADC con referencia interna de voltaje 1.1 V, y leer el canal 8:

ADMUX = 1100 1000


La conversión a ºC puede variar según condiciones, pero una aproximación podría ser:

ºC = (lectura-325)/1.22


domingo, 9 de octubre de 2011

Atmel AVR Free Running ADC

Lectura continua de ADC.

 La lectura de ADC se dispara automaticamente cada vez que finaliza la lectura anterior.

En modo 8 bits se puede conseguir una lectura cada 13 uS (con reloj 16 MHz) lo que nos da una frecuencia de muestreo de 76923 sps sin usar tiempo de procesador.

Basta con configurar ADC de la siguiente forma para leer el canal 0:

    ADMUX  = b'01100000'    ' Channel 0, Left justified, Vref = Avcc
    ADCSRA = b'11100100'    ' Enabled, Auto-Trigger, presc = 16
    ADCSRB = 0

lunes, 3 de octubre de 2011

Interrupciones Puerto Paralelo en C

Ejemplo de uso, espera por una interrupción, lee e imprime por pantalla el valor presente en el puerto de datos.



//gcc -opport pport.c


#include <linux/ppdev.h>
#include <linux/parport.h>
#include <stropts.h>
#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/select.h>
 
#define PP_DEV_NAME "/dev/parport0"
 
int main()
{
    //Get a file descriptor for the parallel port
    int ppfd;
 
    ppfd = open(PP_DEV_NAME, O_RDWR);
    if(ppfd == -1)
    {
        printf("Unable to open parallel port!\n");
        return 1;
    }
 
    //Have to claim the device
    if(ioctl(ppfd, PPCLAIM))
    {
        printf("Couldn't claim parallel port!\n");
        close(ppfd);
        return 1;
    }
 
    while(1)
    {
        //Set up the control lines for when an interrupt happens
        int int_count;
        int busy = PARPORT_STATUS_ACK | PARPORT_STATUS_ERROR;
        int acking = PARPORT_STATUS_ERROR;
        int ready = PARPORT_STATUS_ACK | PARPORT_STATUS_ERROR;
        unsigned char value;
 
        int dir = 1;
        ioctl(ppfd, PPDATADIR, &dir);  // data port as inputs
        
        //Let ppdev know we're ready for interrupts
        ioctl(ppfd, PPWCONTROL, &ready);
 
        //Wait for an interrupt....................................................
        fd_set rfds;
        FD_ZERO(&rfds);
        FD_SET(ppfd, &rfds);

        if(select(ppfd + 1, &rfds, NULL, NULL, NULL))
        {
            printf("Received interrupt\n");
        }
        else
        {
            printf("No interrupt\n");
            continue; //Caught a signal
        }//.........................................................................
 
            //Read Data port
        ioctl(ppfd, PPRDATA, &value[i]);
        
        unsigned int int_value = value;
        printf("data =  %i\n", int_value);
        
        
        //Clear the interrupt
        ioctl(ppfd, PPCLRIRQ, &int_count);
        if(int_count > 1)
            printf("Uh oh, missed %i interrupts!\n", int_count - 1);
 
        //Acknowledge the interrupt
        //ioctl(ppfd, PPWCONTROL, &acking);
        //usleep(2);
        //ioctl(ppfd, PPWCONTROL, &busy);
    }
 
    return 0;
}

viernes, 30 de septiembre de 2011

PyParallel, puerto paralelo en Python



En Consola:
:~$ sudo apt-get install python-parallel
:~$ sudo rmmod lp
:~$ sudo modprobe ppdev
:~$ python
Python 2.5.1 (r251:54863, Mar  7 2008, 04:10:12)
[GCC 4.1.3 20070929 (prerelease) (Ubuntu 4.1.2-16ubuntu2)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import parallel
>>> p = parallel.Parallel()
>>> p.setData(0x55)



En programa:
#!/usr/bin/env python
import parallel

if __name__ == "__main__":
	pyp = parallel.Parallel()
	pyp.setData(0x01)             # Valor en d0-d7, pines 2-9

Class referenfe pyparallel 0.2-6