background preloader

Microcontroller tutorial series: AVR and Arduino timer interrupts

Microcontroller tutorial series: AVR and Arduino timer interrupts
Does your program seem like it’s trying to do too much at once? Are you using a lot of delay() or while() loops that are holding other things up? If so, your project is a good candidate to use timers. In this tutorial, we’ll discuss AVR and Arduino timers and how to use them to write better code. In our prior article, we covered interrupt basics and how to use external interrupts that are triggered by a pin change or similar event. Check it out if you’re looking to brush up on interrupts in general. This chapter moves on to timer interrupts and talks about their applications in Arduino projects or custom AVR circuits. What is a timer? You’re probably familiar with the general concept of a timer: something used to measure a given time interval. The beauty of timers is that just like external interrupts, they run asynchronously, or independently from your main program. For example, say you’re building a security robot. How do timers work? Our timer resolution is one millionth of a second.

EXTERNAL INTERRUPTS ON THE ATmega168/328 - QEEWiki External Interrupt Mask Register External Interrupt Flag Register ATmega168/328 Code: #include <avr/io.h> #include <avr/interrupt.h> int main(void) DDRD &= ~(1 << DDD2); // Clear the PD2 pin // PD2 (PCINT0 pin) is now an input PORTD |= (1 << PORTD2); // turn On the Pull-up // PD2 is now an input with pull-up enabled EICRA |= (1 << ISC00); // set INT0 to trigger on ANY logic change EIMSK |= (1 << INT0); // Turns on INT0 sei(); // turn on interrupts while(1) /*main program loop here */ ISR (INT0_vect) /* interrupt code here */ Figure 2: ATmega168/328 - Pin Change Interrupt Pins One important thing to note, on the older ATmega8 does not have any PCINT pints, therefore, this section of the tutorial only applies to ATmega88 through ATmega328. Pin Change Interrupt Control Register Pin Change Interrupt Flag Register Pin Change Mask Register 0 Pin Change Mask Register 2 Pin Change Mask Register 1 Pin Change Mask Register 0 DDRB &= ~(1 << DDB0); // Clear the PB0 pin // PB0 (PCINT0 pin) is now an input else Cheers

scheduler - avrtutorials2 My final year project will be an implementation of a Real Time Operating System (RTOS) for the AVR microcontrollers. Although many have said it isn't wise to write yet another OS (apparently, there are enough of these around), I decided it is the best way to learn, since the source of other OSes weren't as easy to understand as I had expected.To start off, I began with the Scheduler. What is a Scheduler? A scheduler is a piece of code that calls functions (usually refered to as "Tasks") at periodic intervals of time. Schedulers form one of the basic components of an RTOS. For example, let the maximum time for each task to execute be 100ms. The following scheduler is based on an Atmel Application Journal, which unfortunately, seems to be missing some pages. Implementation Code Listing: scheduler.c The Code, Explained A Task Control Block is how a RTOS "sees" a task. A task is STOPPED if it is no longer going to run. The Timer0 Overflow Interrupt is used to provide a tick. Closing Thoughts

Mastering timer interrupts on the Arduino « Popdevelop – A developer team from Malmö, Sweden Lately I’ve become more and more fan of the Arduino microcontroller. I really like how easy it is to work with; the accompanying IDE plus the huge amount of community support and libraries available. However, for a project I needed to be able to sample input audio at a certain frequency and this required me to understand a bit more deeply on how to configure the ATMEGA328 timer registers. In this post I’ll show you how to call a user function at a period of one millisecond. I decided to use the 8-bit Timer2 which is one of the timers in the ATMEGA328. After some tedious reading in the ATMEGA328 datasheet (and googling!) The code should be pretty clear from the comments but let me just elaborate a bit on the calculations: First of all, the observant reader will notice that the above code will only be accurate for a CPU running at 16MHz since the calculations are based on this frequency. Joy oh joy! Well, what’s the use of this, you might ask? Well, There you have it!

Tutorial: Using AVR Studio 5 with Arduino projects | EngBlaze Note: This tutorial has been replaced with an updated version that covers the same topic with Atmel Studio 6. Studio 6 makes a lot of improvements over the prior version, so there’s really no reason not to upgrade unless you have a very specific need. We’ve also incorporated a lot of fixes, tips, and great user feedback. Check it out here: Tutorial: Using Atmel Studio 6 with Arduino projects This article explains, step-by-step, how to set up the AVR Studio 5 IDE for use with Arduino projects. Introduction My my, what a temperamental beast we are. The answer: well, partially. Why should I switch? A primary use case for AVR Studio has always been to serve users that have grown out of the integrated Arduino IDE. AVR Studio is a huge step up from those limitations, but for many, making the switch cold turkey is just that: a huge step. So why not have the best of both worlds? Preparing AVR Studio and the Arduino core library First, a few preparation steps. Compiler and linker setup Flash!

Gestion du temps, Time manager, delay() | Présentation de la gestion du temps Je ne sais pas si vous avez l’habitude d’utiliser la fonction delay() dans vos sources Arduino mais si c’est le cas vous avez sans doute dû vous rendre compte que la fonction est blocante. Ayant directement pour incidence que si vous souhaitez actionner un autre composant que celui en standby, c’est tout simplement impossible. De multiples limites s’ajoutent, empêchant parfois le comportement le plus basique demandé comme, par exemple, faire clignoter 2 LED à des fréquences différentes pouvant à n’importe quel moment vouloir s’eteindre ou s’allumer. Sauf que si on est bloqué dans un delay() et ben c’est le drame. Une carte arduino UNO dispose malheureusement que d’une seule horloge ce qui rend une parfaite parallélisation des tâches impossible. Petit aparté fait, cela ne faisant pas de graves décalages dans notre cas, passons aux choses sérieuses. Pti montage si vous voulez faire de même : Passons à l’étude de l’objet « Tache » : La LED doit pouvoir :

Using AVR Studio 5 « maxEmbedded Hello folks! Now that you are aware of the different port operations in AVR, we can move forward to actually code our way right through it! Since we will be using C (in fact Embedded C), the best software is the AVR Studio 5 by Atmel. The latest version is 5.1 which was updated in February 2012. The best part is that it is very interactive, user friendly, has awesome UI and unlike other compilers, it is totally free of cost. For those who do not want to register in order to download, I am posting the direct download links of the images here. AVR Studio 5.1 Installer (396MB) – Contains AS5.1, ASF, AVR ToolchainAVR Studio 5.1 Installer – Full (616MB) – Also contains Visual Studio Shell & .NET 4.0 (Download it if your system will not be connected to the internet during installation). Those of you who like to learn how to use the AVR Simulator, you would prefer to skip this post and move on to the next. You have been familiar with C (I presume). Installation Creating your first AVR Project

[Lib] SoftTimer - Une lib pour faciliter les taches périodique ou liées au temps Bonjour Je me suis aperçu que beaucoup de débutants ne savait pas bien comment découper leur code proprement pour gérer plusieurs tâches sur un système qui n'a pas de noyau multi-tâches.D'habitude, je pousse beaucoup sur l'utilisation de machines d'états qui sont de mon point de vue une manière propre, claire, maintenable de subdiviser une tâche principale en sous-tâches élémentaires et à gérer à la fois leur séquencement propre et "l'entremelage" manuel qu'il faut effectuer pour obtenir ce que j'appelle du multi-tâche coopératif. Avant d'élaborer sur ce sujet (peut être dans un tuto), un problème récurrent est la gestion des opérations répétitives ou liées à l'expiration d'un délai. C'est pourquoi je vous propose une lib qui implémente une classe appellée SoftTimer. Vous pouvez télécharger le ZIP de la lib incluant un soft d'exemple en bas de ce post, sur l'historique (On ne peut pas attacher de fichier à un post sur ce forum ?) Méthode de la classe void stop()Rend le timer inactif.

Tutoriel: Développement Arduino avec AVR Studio 5.1 - BreizhMakers Ce tutoriel est une traduction et adaptation de cet excellent tutoriel en anglais. Il s'adresse à ceux qui comme moi trouvent l'environnement de développement Arduino un peu trop rudimentaire et qui souhaiteraient profiter de tous les avantages d'un vrai IDE avec leur Arduino. AVR Studio 5.1 est un Environnement de Développement Intégré (ou IDE en anglais). Il est destiné à la programmation de tous les microcontrôleurs AVR. Il intègre la chaine d'outils avr-gcc ainsi qu'un émulateur d'AVR permettant de débugguer ses programmes (dans une certaine mesure). L'environnement est basé sur Microsoft Visual Studio. Malheureusement sa prise en main pour développer avec l'Arduino et ses librairies est fastidieuse. Mais l'effort en vaut la chandelle dès qu'on doit travailler sur des projets un peu conséquents. L'IDE Arduino fait tellement de choses automatiquement qu'il est quelque peu limitant pour des développeurs expérimentés. AVR Studio va très au-delà de ces limitations. 5) Bien! Enfin! Enfin!

Trig This tutorial is for Processing version 1.1+. If you see any errors or have comments, please let us know. This tutorial is from the book, Processing:Creative Coding and Computational Art, Ira Greenberg, Friends of ED 2007. Trigonometry (really just a couple of the trig functions) is central to graphics programming. soh stands for "sine equals opposite over hypotenuse." The unit circle is a circle with a radius of 1 unit in length—hence its imaginative name. In the unit_circle diagram, the point p is at 45° or pi / 4. In the polar system, you use radians to measure angles, instead of degrees. There is a really simple relationship between the trig functions and the unit circle. x = cosine(theta) * radius y = sine(theta) * radius These seemingly humble little expressions are very powerful and can be exploited for all sorts of expressive and organic purposes. Here's how you actually use the trig functions in Processing: theta = angle*pi/180 angle = theta*180/pi

smbus Archives - Raspberry Pi Home Server Certains disent qu’on ne lie pas des chiens avec des saucisses mais des fois pourquoi pas. Alors le Raspberry Pi et l’Arduino ne sont pas forcement aussi opposés, avec même des points communs mais chacun à des avantages qui peuvent être bons de combiner. Avec le Raspberry Pi vous pouvez via les ports GPIO contrôler des composants externes et faire de la bidouille en électronique. Mais j’imagine que certains maitrisent déjà bien leur Arduino, qu’ils ont le matériel, etc. Pour lier les deux, nous allons passer par le protocole I2C. Le protocole I2C, créé par Philips avec une orientation domotique, permet à plusieurs composants de dialoguer entre eux de manière bidirectionnel mais en half-duplex uniquement. Il y a un principe de maitre et esclave. Avant tout pour connecter les deux appareils il faut savoir quelles broches utiliser ! Pour l’Arduino, ça se passe sur les broches A4 et A5 pour les cartes de type Arduino Uno. Il faudra ajouter une connexion à la masse entre les deux. i2c-dev