C++ in arduino : interrupted ADC with free running mode

Does your embedded product need faster ADC processing and do you want to implement all that in C++ . In this post I am going to show you how to run ADC of Arduino UNO in interrupted mode. In the next post, we will wrap the code in C++. 

But why do we need to run ADC in interrupted mode?

Well, when you use analogRead() to read an ADC value CPU goes to the function & waits until a conversion is completed by the ADC peripheral. So you are actually waiting and wasting the CPU cycles.

How about you tell the ADC peripheral of the MCU to inform you when it finishes a conversion. In this way, CPU can go back to doing other works and return the ADC value once it is ready/converted. 

So the optimized way is to enable the ADC interrupt & configure the ADC to run in free-running mode. the following code snippet shows how to configure the ADC registers of atmega328 for this purpose.

  ADMUX|=(1<<REFS0);    //AVCC with external capacitor at AREF pin 
  ADMUX|=(1<<MUX2)|(1<<MUX0); //0101adc channel 5 selected for adc input
  ADCSRA|=(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);   //prescalar 128 selected 
  ADCSRA|=(1<<ADEN);    //adc enabled
  ADCSRA|=(1<<ADATE);   // ADC Auto Trigger Enable
  ADCSRA|=(1<<ADIE);   //adc interrupt enable such that interrupt will happen after each conversion
  ADCSRA|=(1<<ADSC);   //conversion process begins
  sei(); //dont forget to enable the global interrupt 

Please Note that Arduino UNO's mcu is actually atmega328 And the above C snippet configuring Registers will also get compiled by Arduino IDE. 

In this mode after each conversion ADC peripheral will automatically throw an interrupt and at that interrupt service routine CPU will read the adc value from the ADC register. the following code snippet shows how to handle the interrupt handler. 

ISR(ADC_vect)       //adc interrupt service routine /tasks which will be executed by microprocessor after each conversion
{
adcValue=ADCL;        //ADCL data register read 
adcValue+=(ADCH<<8);  //ADCH data register read
}

We can structure all of the above in a good OOP manner. The steps are described in this link  https://whileinthisloop.blogspot.com/2016/05/c-in-arduino-isr-in-class.html 

C++ in Arduino : auto initialization of private variable at constructor

In C++, there may be cases where we need to initialize a private variable with a particular value. In this post, I want to show how initialization should be done in the right manner so that compiler can generate the exact binary instruction & save us from any undefined runtime issue. We will first go through the basics and then implement the concept for initializing an LCD-type object acting as an LCD driver. 

let's say you have a class Counter with a variable noOfCounts


now you might be thinking to initialize the noOfCounts variable like this 

Counter::Counter()
{
   noOfCounts = 0;
}

although it works BUT it is not the preferred approach. There is a better way which is : 

Counter::Counter():noOfCounts(0)
{}

This way the member noOfCounts gets initialized before the constructor even starts to execute. this is important because this is also the only way to initialize const member data & references.

The above argument is true if you want to initialize an object (which is also a variable) with arguments.  

Now let's see how you actually create an LCD object in your Arduino sketch. You may have declared object like this 
#include <Arduino.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);      //object created with pin numbers as argument

But Now let's say you want to make a custom class of your own that internally uses the LiquidCrystal class and does LCD operations for example showing an animation that the actual 
LiquidCrystal does not do. If you ask me then I would think about the following ways. 
  1. Modify the original LiquidCrystal Class        
  2. Make a new class  by Inheriting LiquidCrystal class or 
  3. Make your own Class where a private variable is of LiquidCrystal type and then initialize that object at your own custom class constructor 
I am going to show you solution no 3 (which is an Aggregate pattern) keeping the original Library as it is. 

First of all, Create your CustomLCD class and declare a LiquidCrystal type object lcd as a private variable :

class CustomLCD
{
   public:
          CustomLCD();
          void showSomething(void);
   private:
          LiquidCrystal lcd;
};

Then you can auto init this lcd variable like the way we discussed avobe i.e. using the colon : at the constructor

CustomLCD::CustomLCD():lcd(12, 11, 5, 4, 3, 2)   //here private variable lcd object gets auto initilized with pins                                               
{
  lcd.begin(16, 2);
}

Then you can create a CustomLCD kind object in your sketch and use it

#include "CustomLCD.h"

CustomLCD myCustomLCD;   //CustomLCD object is created

void setup() 
{
  Serial.begin(9600);
  myCustomLCD.showSomething();
}

void loop() 
{}

here is the circuit simulation output in proteus:



Note: you can also init any basic type class variable in this way & it is a good practice to prevent abnormal runtime behaviors. In a later post, I will explain why! 

All the Source Code and circuit diagrams are available at this link https://github.com/hassin23ayz/ArduinoCpp/tree/master/T36_auto_init_constructor 

C++ in arduino : Classes and objects

Hello in this post I want to share how we can implement OOP concepts in Arduino
OOP  means object oriented programming

In OOP Class is the blueprint of an object, in UML class is represented by a rectangle



Object : 
  • The object is an instance of a Class 
  • Both data and functions that operate on data are bundled as a unit & it is called an object 
  • You can create one or more instances of a Class 
OOP designing help solve the problem in a modular fashion and the code becomes very structured, readable & maintainable 

Making a class in Arduino

.cpp & .h are the 2 file  formats of a c++ class and you only need these 2 files to make a class  

.h contains : 
  • any import statement that the class needs to make
  • name of the class & anything that the class extends 
  • Declaration of variables
  • Declaration of methods 
.cpp contains : 
  • The definition of the methods
Let us create a class Ball in Arduino using the following steps 
  1. Open Arduino IDE 
  2. Save the sketch somewhere 
  3. Click the rightmost arrow and press new tab 
  4. Type Ball.h and press enter
  5. Ball.h header file is created 

Now lets think what does a ball can do ?  ............
well it can bounce :) so lets declare a method named bounce() in the .h file


#ifndef _BALL_H      //tells compiler to compile this class only once 
#define _BALL_H

#include <Arduino.h>

class Ball
{
   public:
          Ball(byte _pin, unsigned long int _bounceTime);
          void bounce();
   private:
          unsigned long int bounceTime;
          byte pin;
};
#endif

here the public function Ball() is the constructor . note you can pass argument to the constructor also

but what can we put in the bounce() ? ...
lets Blink the LED at pin 13 so that it would look like bounce :)

now lets make the implementation file to do this like the header file press newtab and create the Ball.cpp  file

#include "ball.h"

Ball::Ball(byte _pin, unsigned long int _bounceTime)
{
  bounceTime=_bounceTime;
  pin = _pin;
  pinMode(pin,OUTPUT);
}

void Ball::bounce()
{
  digitalWrite(pin,HIGH);
  delay(bounceTime);
  digitalWrite(pin,LOW);
  delay(bounceTime);
}

now your blueprint i.e. Class is ready now you can create an instance of it and play with it . now select the sketch from the tabs & copy paste the following code
/*
 * this example shows how to make Class and create object 
 * author : Hassin Ayaz 
 */

#include "ball.h"

Ball b(13,1000);

void setup() 
{
  Serial.begin(9600);
  Serial.println("Ball object created");
}

void loop() 
{
 Serial.println("Ball will bounce i.e Led will Blink");
 b.bounce();
}

so here an object of Ball type is created (note: object b is a global variable)

verify it and upload it
you will see the LED at pin 13 will blink :)

All the sources are available in this link https://github.com/hassin23ayz/ArduinoCpp/tree/master/T13_obj_classes 

I hope you have enjoyed this post
Welcome to the world of OOP :)

Categories

Pages

Firmware Engineer

My photo
Works on Firmware, Embedded Linux, Smart Metering, RTOS, IoT backend

Contact Form

Name

Email *

Message *

Copyrighted by Hassin. Powered by Blogger.