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