AVR Software PWM

One way to do software pwm is setting up a timer with interrupt corresponding to each pwm step. then in the interrupt routine check whether each pwm channel should be on or off.

The key question here is how fast and how many steps should be the PWM.
All depends in how much processing time you need for other tasks, and how many PWMs to run.

A good aproach that works for me is doing a 64 steps, 200 uS per step PWM for around 50 PWM channels.
This give us a total time of 50*200=12800 uS = 12.8 mS => 78.125 Hz.
Getting less than 10% of processing time.

I ussually do it with Timer0, this creates a 200 uS Timer0 CompA Interrupt.
I think it works for most AVR, but you can choose the part you need depending on wich registers your mcu uses:

```c
// For 16 MHz clock

#define T0Top_Avr 50
#define T0PresAvr 3

   #if defined( OCR0 )
      OCR0  = T0TOP_Avr;
      TCCR0 = 64 + TMR0PresAvr; // CTC mode: TOP = OCR0
   #elif defined( OCR0A )
      OCR0A  = T0TOP_Avr;
      TCCR0A = 2;               // CTC mode: TOP = OCR0A
      TCCR0B = TMR0PresAvr;
   #endif
  
   // enable Timer 0 compare_A interrupt
   #if defined( TIMSK0 )
      TIMSK0 = 0;
      TIMSK0 |= (1 << OCIE0A);
   #elif defined( TIMSK )
      TIMSK = 0;
      TIMSK |= (1 << OCIE0A);
   #endif
  
   sei();      // Enable interrupts



// Now in the interrupt routine:

#define numPWM 32             // Number of PWM Channels
uint8_t pwmChannel[ numPWM ]; // Array containing pwm values
uint8_t pwmCounter=0;

ISR(TIMER0_COMPA_vect)        // Timer 0 compare_A interrupt
 { 
    for( uint8_t i=0; i pwmCounter ) 
        {
            // Set the output line "i" HIGH
            // This depends on the hardware you are using
        }
        else
        {
            // Set the output line "i" LOW
        }
    }
    pwmCounter++;
    if( pwmCounter > 63 ) pwmCounter = 0;
{ 
```

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.

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



Fast linked list without list

If you need a very fast way to iterate over a list of objects and call the same method on all of them, then here is a posible solution. Der...