Skip to main content
Improved the formatting of the example comments and code, removing extra whitespace.
Source Link
Anonymous Penguin
  • 6.4k
  • 10
  • 34
  • 62
// this code scans ADC1 for an analog signal upon request, using 8Mhz processor clock

#include <avr/io.h>
#include <stdint.h>       // needed for uint8_t
    
int ADCsingleREAD(uint8_t adctouse)
{
    int ADCval;

    ADMUX = adctouse;        // use #1 ADC
    ADMUX |= (1 << REFS0);   // use AVcc as the reference
    ADMUX &= ~(1 << ADLAR);  // clear for 10 bit resolution
    
    // 128 prescale for 8Mhz
    ADCSRA |= (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);
        
    ADCSRA |= (1 << ADEN);    // Enable the ADC
    ADCSRA |= (1 << ADSC);    // Start the ADC conversion
    
    while(ADCSRA & (1 << ADSC)); // waits for the ADC to finish 
        ;
    
    ADCval = ADCL;
    ADCval = (ADCH << 8) + ADCval; // ADCH is read so ADC can be updated again
    
    return ADCval;
}
   

int main(void)
{
    int ADCvalue;

    while (1)
    {
        ADCvalue = ADCsingleREAD(1);
        // ADCvalue now contains an 10bit ADC read
    }
}
// this code scans ADC1 for an analog signal upon request, using 8Mhz processor clock

#include <avr/io.h>
#include <stdint.h>       // needed for uint8_t
    
int ADCsingleREAD(uint8_t adctouse)
{
    int ADCval;

    ADMUX = adctouse;        // use #1 ADC
    ADMUX |= (1 << REFS0);   // use AVcc as the reference
    ADMUX &= ~(1 << ADLAR);  // clear for 10 bit resolution
    
    // 128 prescale for 8Mhz
    ADCSRA |= (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);
        
    ADCSRA |= (1 << ADEN);    // Enable the ADC
    ADCSRA |= (1 << ADSC);    // Start the ADC conversion
    
    while(ADCSRA & (1 << ADSC)) // waits for the ADC to finish 
        ;
    
    ADCval = ADCL;
    ADCval = (ADCH << 8) + ADCval; // ADCH is read so ADC can be updated again
    
    return ADCval;
}
   

int main(void)
{
    int ADCvalue;

    while (1)
    {
        ADCvalue = ADCsingleREAD(1);
        // ADCvalue now contains an 10bit ADC read
    }
}
// this code scans ADC1 for an analog signal upon request, using 8Mhz processor clock

#include <avr/io.h>
#include <stdint.h>       // needed for uint8_t
    
int ADCsingleREAD(uint8_t adctouse)
{
    int ADCval;

    ADMUX = adctouse;        // use #1 ADC
    ADMUX |= (1 << REFS0);   // use AVcc as the reference
    ADMUX &= ~(1 << ADLAR);  // clear for 10 bit resolution
    
    // 128 prescale for 8Mhz
    ADCSRA |= (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);
        
    ADCSRA |= (1 << ADEN);    // Enable the ADC
    ADCSRA |= (1 << ADSC);    // Start the ADC conversion
    
    while(ADCSRA & (1 << ADSC)); // waits for the ADC to finish
    
    ADCval = ADCL;
    ADCval = (ADCH << 8) + ADCval; // ADCH is read so ADC can be updated again
    
    return ADCval;
}
   

int main(void)
{
    int ADCvalue;

    while (1)
    {
        ADCvalue = ADCsingleREAD(1);
        // ADCvalue now contains an 10bit ADC read
    }
}
Improved the formatting of the example comments and code, removing extra whitespace.
Source Link

For a quickThe following is an example from Arduino'sthe Arduino website.

DDRD is the direction register for Port D (Arduino digital pins 0-7). The bits in this register control whether the pins in PORTD are configured as inputs or outputs so, for example:

    DDRD is the direction register for Port D (Arduino digital pins 0-7). The bits in this register control whether the pins in PORTD are configured as inputs or outputs so, for example:    

DDRD = B11111110; // sets Arduino pins 1 to 7 as outputs, pin 0 as input  
DDRD = DDRD | B11111100; // this is safer as it sets pins 2 to 7 as outputs 
     // without changing the value of pins 0 & 1, which are RX & TX 

//See the bitwise operators reference pages and The// Bitmathwithout Tutorial inchanging the Playground

PORTDvalue isof thepins register0 for& the1, statewhich ofare theRX outputs.& ForTX example;

See the bitwise operators reference pages and The Bitmath Tutorial in the Playground

PORTD is the register for the state of the outputs. For example;

PORTD = B10101000; // sets digital pins 7,5,3 HIGH

You will only see 5 volts on these pins however if the pins have been set as outputs using the DDRD register or with pinMode().

You will only see 5 volts on these pins however if the pins have been set as outputs either by using the DDRD register directly or by using the pinMode() function.

For analog read

// this code scans ADC1 for an analog signal upon request, using 8Mhz processor clock
 

#include <avr/io.h>
 
#include <stdint.h>       // needed for uint8_t

 
    
int ADCsingleREAD(uint8_t adctouse)
 
{
 
    int ADCval;
 

    ADMUX = adctouse;          // use #1 ADC
 
    ADMUX |= (1 << REFS0);     // use AVcc as the reference
 
    ADMUX &= ~(1 << ADLAR);     // clear for 10 bit resolution
 
         
    // 128 prescale for 8Mhz
         ADCSRA |= (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);    
  // 128 prescale for 8Mhz
   
    ADCSRA |= (1 << ADEN);    // Enable the ADC

 
    ADCSRA |= (1 << ADSC);    // Start the ADC conversion
 
    
    while(ADCSRA & (1 << ADSC));      // waits for the ADC to finish 
        ;
    
    ADCval = ADCL;
 
    ADCval = (ADCH << 8) + ADCval;     // ADCH is read so ADC can be updated again
 
    
    return ADCval;
 
}
   

   int main(void)
 
{
 
    int ADCvalue;
 

    while (1)
 
    {
 
            ADCvalue = ADCsingleREAD(1);
 
             // ADCvalue now contains an 10bit ADC read
 
    }
 
}

For a quick example from Arduino's website

    DDRD is the direction register for Port D (Arduino digital pins 0-7). The bits in this register control whether the pins in PORTD are configured as inputs or outputs so, for example:    

DDRD = B11111110; // sets Arduino pins 1 to 7 as outputs, pin 0 as input DDRD = DDRD | B11111100; // this is safer as it sets pins 2 to 7 as outputs     // without changing the value of pins 0 & 1, which are RX & TX 

//See the bitwise operators reference pages and The Bitmath Tutorial in the Playground

PORTD is the register for the state of the outputs. For example;

PORTD = B10101000; // sets digital pins 7,5,3 HIGH

You will only see 5 volts on these pins however if the pins have been set as outputs using the DDRD register or with pinMode().

For analog read

// this code scans ADC1 for an analog signal upon request, using 8Mhz processor clock
 

#include <avr/io.h>
 
#include <stdint.h>       // needed for uint8_t

 

int ADCsingleREAD(uint8_t adctouse)
 
{
 
    int ADCval;
 

    ADMUX = adctouse;          // use #1 ADC
 
    ADMUX |= (1 << REFS0);     // use AVcc as the reference
 
    ADMUX &= ~(1 << ADLAR);    // clear for 10 bit resolution
 
      

      ADCSRA |= (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);     // 128 prescale for 8Mhz

    ADCSRA |= (1 << ADEN);    // Enable the ADC

 
    ADCSRA |= (1 << ADSC);    // Start the ADC conversion
 

    while(ADCSRA & (1 << ADSC));      // waits for the ADC to finish 

    ADCval = ADCL;
 
    ADCval = (ADCH << 8) + ADCval;     // ADCH is read so ADC can be updated again
 

    return ADCval;
 
}
   

   int main(void)
 
{
 
    int ADCvalue;
 

    while (1)
 
    {
 
            ADCvalue = ADCsingleREAD(1);
 
             // ADCvalue now contains an 10bit ADC read
 
    }
 
}

The following is an example from the Arduino website.

DDRD is the direction register for Port D (Arduino digital pins 0-7). The bits in this register control whether the pins in PORTD are configured as inputs or outputs so, for example:

DDRD = B11111110; // sets Arduino pins 1 to 7 as outputs, pin 0 as input 
DDRD = DDRD | B11111100; // this is safer as it sets pins 2 to 7 as outputs 
                         // without changing the value of pins 0 & 1, which are RX & TX 

See the bitwise operators reference pages and The Bitmath Tutorial in the Playground

PORTD is the register for the state of the outputs. For example;

PORTD = B10101000; // sets digital pins 7,5,3 HIGH

You will only see 5 volts on these pins however if the pins have been set as outputs either by using the DDRD register directly or by using the pinMode() function.

For analog read

// this code scans ADC1 for an analog signal upon request, using 8Mhz processor clock

#include <avr/io.h>
#include <stdint.h>       // needed for uint8_t
    
int ADCsingleREAD(uint8_t adctouse)
{
    int ADCval;

    ADMUX = adctouse;        // use #1 ADC
    ADMUX |= (1 << REFS0);   // use AVcc as the reference
    ADMUX &= ~(1 << ADLAR);  // clear for 10 bit resolution
    
    // 128 prescale for 8Mhz
    ADCSRA |= (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); 
        
    ADCSRA |= (1 << ADEN);    // Enable the ADC
    ADCSRA |= (1 << ADSC);    // Start the ADC conversion
    
    while(ADCSRA & (1 << ADSC)) // waits for the ADC to finish 
        ;
    
    ADCval = ADCL;
    ADCval = (ADCH << 8) + ADCval; // ADCH is read so ADC can be updated again
    
    return ADCval;
}
   

int main(void)
{
    int ADCvalue;

    while (1)
    {
        ADCvalue = ADCsingleREAD(1);
        // ADCvalue now contains an 10bit ADC read
    }
}
Source Link
bpinhosilva
  • 486
  • 3
  • 12

In theses cases you are right, using register address is the way to read/write data from/to digital pins. In the case you use analog input, the process is similar but you have to follow some procedures before getting the value of the data.

GPIO REGISTERS

For AVR micro-controllers these registers are: DDRn – Data Direction Register PORTn – Port Output data Register PINn – Port Input Register n- Indicates the port name i.e. A, B, C & D If you have arduino board and want to use these pins, look for mapping pictures about arduino and avr pins.

For a quick example from Arduino's website

    DDRD is the direction register for Port D (Arduino digital pins 0-7). The bits in this register control whether the pins in PORTD are configured as inputs or outputs so, for example:    

DDRD = B11111110; // sets Arduino pins 1 to 7 as outputs, pin 0 as input DDRD = DDRD | B11111100; // this is safer as it sets pins 2 to 7 as outputs     // without changing the value of pins 0 & 1, which are RX & TX 

//See the bitwise operators reference pages and The Bitmath Tutorial in the Playground

PORTD is the register for the state of the outputs. For example;

PORTD = B10101000; // sets digital pins 7,5,3 HIGH

You will only see 5 volts on these pins however if the pins have been set as outputs using the DDRD register or with pinMode().

For analog read

You just need to include the headers and start using the registers. They hold the equivalent hexadecimal values for your microcontroller. And the procedure is described in the datasheet. All you have to do is to translate it to code.

// this code scans ADC1 for an analog signal upon request, using 8Mhz processor clock


#include <avr/io.h>

#include <stdint.h>       // needed for uint8_t



int ADCsingleREAD(uint8_t adctouse)

{

    int ADCval;


    ADMUX = adctouse;         // use #1 ADC

    ADMUX |= (1 << REFS0);    // use AVcc as the reference

    ADMUX &= ~(1 << ADLAR);   // clear for 10 bit resolution

    

    ADCSRA |= (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);    // 128 prescale for 8Mhz

    ADCSRA |= (1 << ADEN);    // Enable the ADC


    ADCSRA |= (1 << ADSC);    // Start the ADC conversion


    while(ADCSRA & (1 << ADSC));      // waits for the ADC to finish 

    ADCval = ADCL;

    ADCval = (ADCH << 8) + ADCval;    // ADCH is read so ADC can be updated again


    return ADCval;

}
   

   int main(void)

{

    int ADCvalue;


    while (1)

    {

            ADCvalue = ADCsingleREAD(1);

            // ADCvalue now contains an 10bit ADC read

    }

}

For more information about analog read, see this.