gonium.net » ATMega http://gonium.net/md so much time, so little to do. Sat, 11 Sep 2010 16:42:09 +0000 en hourly 1 http://wordpress.org/?v=3.0.1 FreeRTOS for ATMega644 http://gonium.net/md/2008/08/10/freertos_for_atmega644/ http://gonium.net/md/2008/08/10/freertos_for_atmega644/#comments Sun, 10 Aug 2008 16:19:26 +0000 md http://gonium.net/md/?p=89 six-legged chip bug

FreeRTOS is an open-source realtime operating system for microcontrollers. The ATMega644 of ATMEL provides 64KB of flash program memory in a DIY-friendly 40-pin PDIP package. Read on for how to combine both to my new software development platform.

FreeRTOS provides a nice RTOS for embedded systems and is readily available for various platforms. One timer of the hardware is used to implement multitasking features. A library provides routines for creating tasks and synchronization. Unfortunately, FreeRTOS is currently only ported to the ATMega323 – so I created a basic port to the ATMega644 and stripped all unnecessary features.

Typically, the FreeRTOS demo shows how to implement various threads and let them access the hardware. While it is educating to read the code, it is too bloated to serve as a template for new developments. In addition, I prefer Peter Fleury’s UART library for serial outputs. So, I removed all threads and included the library. To make sure that two threads cannot write to the same UART at the same time, I introduced a mutex per UART to synchronize the output on a per-string basis. Please note that there is no Mutex to synchronize read access. The main program starts two tasks which print “foo” and “bar” to the serial line, respectively. I kept the task surveilance mechanism as implemented in the original FreeRTOS demo (this might become handy ;-))

Here is a peek at the main.c file:

[viewcode]src=freertos-atmega644-main.c [/viewcode]


HTML code generated by vim-color-improved v.0.4.0.Download this code: freertos-atmega644-main.c

You can get the whole package (GPL licensed) from the download page. Have fun! Kudos for the CC’ed chip bug picture go to oskay.

]]>
http://gonium.net/md/2008/08/10/freertos_for_atmega644/feed/ 1
Tweaking the code http://gonium.net/md/2007/04/18/tweaking-the-code/ http://gonium.net/md/2007/04/18/tweaking-the-code/#comments Wed, 18 Apr 2007 14:54:47 +0000 md http://gonium.net/md/2007/04/18/tweaking-the-code/

Thanks to Lasse Lambrecht, I can release a new version of the DCF77 code – now you can run it on the ATMega168-based Arduinos.

The ATMega8 differs slightly from the ATMega48/88/168-series: The latter chips have an extended Timer2-hardware and therefore need different initializations. Lasse send me a nice adjustment of the code, basically he uses preprocessor flags to figure out which initialization commands to use: #ifdef ATMEGA168 TCCR2B |= (1<
  • arduino-dcf77-clock-0.2.1.tar.bz
  • For the hardware setup, please refer to my initial post. ]]>
    http://gonium.net/md/2007/04/18/tweaking-the-code/feed/ 12
    Arduino on Steroids http://gonium.net/md/2007/01/23/arduino-on-steroids/ http://gonium.net/md/2007/01/23/arduino-on-steroids/#comments Tue, 23 Jan 2007 21:46:29 +0000 md http://gonium.net/md/2007/01/23/arduino-on-steroids/ steroids

    I just upgraded by little Arduino to the ATMega168 – and basically doubled the memory. But, be warned: This is not a hassle-free procedure if you have not some experience with microcontrollers.

    I bought a cheap serial programmer – only to figure out that the firmware is outdated and the ATMega168 is not supported. You can update the firmware – but you need another programmer for this *grmp*. So I bought a not-so-cheap mySmartUSB which runs over USB (so there is a chance it will work on the mac, I already found a driver for the USB chipset – stay tuned.)

    Today, most programmers come with a 10-pin header (aka Kanda connector), but the Arduino uses the old 6-pin ICSP header. I soldered a converter to solve this. Once I succeeded with the electrical connection, I failed in using avrdude – programming went fine, but I wasn’t able to set the fuse bits. Finally, I have found AvrOspII which worked perfectly on my Windows box. Please read Wolf Paulus’ description to save yourself a lot of time (and broken ATMegas) – he has written a great article about the fuse settings.

    If you’re interested in a pre-flashed Arduino, send me an email.

    PS: picture CC’ed by opk on flickr.

    ]]>
    http://gonium.net/md/2007/01/23/arduino-on-steroids/feed/ 0
    I will think before I code… http://gonium.net/md/2006/12/27/i-will-think-before-i-code/ http://gonium.net/md/2006/12/27/i-will-think-before-i-code/#comments Wed, 27 Dec 2006 09:54:04 +0000 md http://gonium.net/md/2006/12/27/i-will-think-before-i-code/ #include < avr / io.h > #define INIT_TIMER_COUNT 6 #define RESET_TIMER2 TCNT2 = INIT_TIMER_COUNT int ledPin = 13; [...]]]> CosineKitty pointed out: My Arduino timer interrupt code did not work because the Prescaler bits were not set correctly. Applying basic boolean logic helps ;-) This is the working code: #include < avr / interrupt.h > #include < avr / io.h > #define INIT_TIMER_COUNT 6 #define RESET_TIMER2 TCNT2 = INIT_TIMER_COUNT int ledPin = 13; int int_counter = 0; volatile int second = 0; int oldSecond = 0; long starttime = 0; // Aruino runs at 16 Mhz, so we have 1000 Overflows per second... // 1/ ((16000000 / 64) / 256) = 1 / 1000 ISR(TIMER2_OVF_vect) { RESET_TIMER2; int_counter += 1; if (int_counter == 1000) { second+=1; int_counter = 0; } }; void setup() { Serial.begin(9600); Serial.println("Initializing timerinterrupt"); //Timer2 Settings: Timer Prescaler /64, TCCR2 |= (1< "); Serial.print(millis() - starttime); Serial.println("."); digitalWrite(ledPin, HIGH); delay(100); digitalWrite(ledPin, LOW); oldSecond = second; } } I will think before I code, I will think before I code, I will think before I code, ... The timer now works perfectly. I think the CTC mode will be more efficient, but my measurement shows that the clock has a slight skew (3 ms) when the Arduino starts up (lets say, during the first five minutes). Later, the skew is about zero. So the overflow mechanism is quite exact ;-) Note that the TIMER2 is used for PWM in the Arduino libraries, so this sketch might interfere with PWM applications - I did not test this.]]> http://gonium.net/md/2006/12/27/i-will-think-before-i-code/feed/ 24 Arduino Timer Interrupt http://gonium.net/md/2006/12/23/arduino-timer-interrupt/ http://gonium.net/md/2006/12/23/arduino-timer-interrupt/#comments Sat, 23 Dec 2006 22:12:02 +0000 md http://gonium.net/md/2006/12/23/arduino-timer-interrupt/ Continuing my interrupt experiments, I wrote a little sketch to print the seconds since startup to serial. But: Something is wrong…

    I use the Timer2 of the ATMega8. It consists of a 8 bit counter which is automatically increased. When an overflow occurs, the interrupt routine TIMER2_OVF_vect is called.

    This is the code:

    
    #include < avr / interrupt.h >
    #include < avr / io.h >
    
    #define INIT_TIMER_COUNT 0
    #define RESET_TIMER2 TCNT2 = INIT_TIMER_COUNT
    
    int ledPin = 13;
    int int_counter = 0;
    volatile int second = 0;
    int oldSecond = 0;
    
    // Aruino runs at 16 Mhz, so we have 61 Overflows per second...
    // 1/ ((16000000 / 1024) / 256) = 1 / 61
    ISR(TIMER2_OVF_vect) {
      int_counter += 1;
      if (int_counter == 61) {
        second+=1;
        int_counter = 0;
      }
    };
    
    void setup() {
      Serial.begin(9600);
      Serial.println("Initializing timerinterrupt");
      //Timer2 Settings:  Timer Prescaler /1024
      TCCR2 |= ((1 < < CS22) | (1 << CS21) | (1 << CS20));
      //Timer2 Overflow Interrupt Enable
      TIMSK |= (1 << TOIE2);
      RESET_TIMER2;
      sei();
    }
    
    void loop() {
      if (oldSecond != second) {
        Serial.print(second);
        Serial.println(".");
        oldSecond = second;
      }
    }
    
    

    Unfortunately, the counter is not increased every second but every three seconds. I need to investigate this. Anyway, it seems to be more reasonable to use the CTC mode (clear-timer-on-compare-match). I need to read the datasheet ;-)

    ]]>
    http://gonium.net/md/2006/12/23/arduino-timer-interrupt/feed/ 0
    Arduino DCF77 radio clock receiver http://gonium.net/md/2006/11/05/arduino-dcf77-radio-clock-receiver/ http://gonium.net/md/2006/11/05/arduino-dcf77-radio-clock-receiver/#comments Sun, 05 Nov 2006 20:31:08 +0000 md http://gonium.net/md/2006/11/05/arduino-dcf77-radio-clock-receiver/ DCF77-arduino.jpg

    As a first sketch, I developed a little DCF77 library for the arduino. The DCF77 sender broadcasts the exact time in Germany. It uses a binary format which needs to be decoded – which is exactly what the library does.

    There are others around who wrote a DCF77 decoder: I would like to thank Captain for his DCF77 code. You need to have an Arduino and a DCF77 receiver in order to use this sketch.

    I use the “DCF-Empfänger BN 641138″ of Conrad. You need a pull-up resistor as displayed here:

    arduino-dcf77-setup.jpg

    arduino-dcf77-schematic.jpg

    When everything is connected, the exact time is printed on the serial line. Note that this is a very early release of the software – there is a lot of functionality missing. From the README:

    The current todo list is:
     * Use interrupt routines for detecting signal changes
     * Use interrupt routines to add seconds automatically
       (currently, the 59th second is shown properly)
     * Implement parity checks to prevent faulty time
       signals to be evaluated
    

    The sketch eats up 6400 of the 7168 bytes in the Arduino. I am currently considering to upgrade my board to the ATMega 168 processor in order to have 16kb of memory…

    You can download the code here:


    The code is released under terms of the CC-GNU GPL.

    ]]>
    http://gonium.net/md/2006/11/05/arduino-dcf77-radio-clock-receiver/feed/ 24