Atmel C Pin Manipulation Macros

2019-06-07 21:15发布

问题:

So I have been programming in Atmel C for a while and I have gotten used to all the C bit manipulation, so now I want to hide it. I want to hide the bit manipulation not only to make my code more readable but also make it easier to maintain and modify in case our hardware changes or we make new hardware.

So I am asking you what are the best macros for Atmel C for basic pin manipulation.

The features I am looking for are:

  1. Set a Pin to be Input or Output
  2. Set an Output Pin HIGH or LOW
  3. Read the Value of an Input Pin

So I have found a few macros that I could use but none really fit my bill.

Links:

http://www.piconomic.co.za/fwlib/group___a_v_r___p_i_o.html (still have to keep multiple defines per pin)

http://www.starlino.com/port_macro.html (doesn't compile, AVR Studio 6.2)

Changing a global variable in C (best one, near the top of the question under "/* LCD DEFINES */"

What I would really like is something like this:

#define LED1      PA1
#define BUTTON1   PB0



set_output(LED1);
output_high(LED1);
delay_ms(100);
output_low(LED1);


set_input(BUTTON1);
uint8_t tmpVal = get_input(BUTTON1);
if( tmpVal == 1 )
{
    // assuming button IS pressed here
}
else
{
    // assuming button IS NOT pressed here
}

Any ideas on the cleanest way to do this?

I could handle keeping around a few more defines per pin but I feel like that shouldn't be needed. Shouldn't PA1 and PB0 be able to tell us everything or do they get defined into a single value?

EDIT: Using Atmel Studio 6.2 on Windows

Thanks, Rob R.

回答1:

Nevermind this does compile

http://www.starlino.com/port_macro.html

// MACROS FOR EASY PIN HANDLING FOR ATMEL GCC-AVR
//these macros are used indirectly by other macros , mainly for string concatination
#define _SET(type,name,bit)          type ## name  |= _BV(bit)    
#define _CLEAR(type,name,bit)        type ## name  &= ~ _BV(bit)        
#define _TOGGLE(type,name,bit)       type ## name  ^= _BV(bit)    
#define _GET(type,name,bit)          ((type ## name >> bit) &  1)
#define _PUT(type,name,bit,value)    type ## name = ( type ## name & ( ~ _BV(bit)) ) | ( ( 1 & (unsigned char)value ) << bit )

//these macros are used by end user
#define OUTPUT(pin)         _SET(DDR,pin)    
#define INPUT(pin)          _CLEAR(DDR,pin)    
#define HIGH(pin)           _SET(PORT,pin)
#define LOW(pin)            _CLEAR(PORT,pin)    
#define TOGGLE(pin)         _TOGGLE(PORT,pin)    
#define READ(pin)           _GET(PIN,pin)

/*
    BASIC STAMPS STYLE COMMANDS FOR ATMEL GCC-AVR

    Usage Example:
    ———————————————–
    #define pinLed B,5  //define pins like this

    OUTPUT(pinLed);       //typo fixed
    //OUTPUT(pinLED);     //compiles as DDRB |= (1<<5);
    HIGH(pinLed);         //compiles as PORTB |= (1<<5);
    ———————————————–
*/

There is just one typo which I have fixed



标签: c macros atmel