AVR - Portok/lábak kezelése - "tkiraaly_avr_macros.h"

2016-03-15

 

Az utóbbi időben több AVR uC-vel is foglalkoztam, és láttam, hogy hozzájuk készített .h file-imban van azonos rész, ezeket kiemeltem a egy "tkiraaly_avr_macros.h"-ba. Ez az eleje, a közös rész.


/*******************************************************************************
*   Author       -  Kiraly Tibor
*                   www.tkiraaly.hu
*   Date         -  2016.03.09.
*   Chip         -  Atmel AVR
*   Compiler     -  avr-gcc (WinAVR 20080610) 4.3.0
*
*   AVR macros
*
*******************************************************************************/

#ifndef tkiraaly_avr_macros
#define tkiraaly_avr_macros


#define U8                   unsigned char
#define U16                  unsigned int


#define KHZ                  *1000
#define MHZ                  *1000000


#define B_1(sfr,bit)         sfr|= ( 1 << ( bit))               // egy regiszter adott bitjenek 1-re allitas
#define B_0(sfr,bit)         sfr&= ~( 1 << ( bit))              // egy regiszter adott bitjenek 0-ra allitas
#define B_R(sfr,bit)         bit_is_set( sfr, bit)              // egy regiszter egy bitjenek olvasasa


#define NOP                  __asm__ __volatile__ ("nop" ::)    // egy ures utasitas beszurasa


#define IT_ENABLE            __asm__ __volatile__ ("sei" ::)    // megszakitas engedelyezese
#define IT_DISABLE           __asm__ __volatile__ ("cli" ::)    // megszakitas tiltasa


#define USART_UCSRC          0B10000000          // UCSRC kivalasztasa
#define USART_ASYNCRON       0                   // asszinkron mukodes     - UCSR_C
#define USART_SYNCRON        0B01000000          // szinkron mukodes       - UCSR_C
#define USART_RX_ENABLE      0B00010000          // vetel engedelyezese    - UCSR_B
#define USART_TX_ENABLE      0B00001000          // adas engedelyezese     - UCSR_B
#define USART_NO_PARITY      0                   // nincs paritas bit      - UCSR_C
#define USART_EVEN_PARITY    0B00100000          // paros paritas          - UCSR_C
#define USART_ODD_PARITY     0B00110000          // paratlan paritas       - UCSR_C
#define USART_1_STOPBIT      0                   // 1 stopbit              - UCSR_C
#define USART_2_STOPBITS     0B00001000          // 2 stopbit              - UCSR_C
#define USART_7_BIT          0B00000100          // 7 bit-es karakterhossz - UCSR_C
#define USART_8_BIT          0B00000110          // 8 bit-es karakterhossz - UCSR_C


#define OCR_TIMER( ido_usec, osztas)  ido_usec* FCPU/ osztas/ 1000000UL+ 1UL
#define OCR_CLOCK( f_hz, osztas)      F_CPU/ osztas/ f_hz- 1UL
#define OCR_WAVE( f_hz, osztas)       F_CPU/ 2UL/ osztas/ f_hz- 1UL


Azután láttam, hogy bizony vannak nagyobb darab AVR-k is, amiben akár lehet PORTK is. Ezekhez nem kevés favágással készítettem egy makró csomagot, amivel könnyen kezelhetőek a port lábak. Az a jó a makrókban, hogy csak a használtak fordulnak bele a kódba, ezért nyugodtan használhatók a legkisebb ATtiny13A-hoz is, amiben a PORTB-ből is csupán néhány bit van megvalósítva. Ide most csak a PORTA-hoz tartozó makrókat tettem ki.


// Port A

#define PA0_OUTPUT           B_1( DDRA, 0)       // Port A 0. bit kimenetre allitasa    
#define PA1_OUTPUT           B_1( DDRA, 1)
#define PA2_OUTPUT           B_1( DDRA, 2)
#define PA3_OUTPUT           B_1( DDRA, 3)
#define PA4_OUTPUT           B_1( DDRA, 4)
#define PA5_OUTPUT           B_1( DDRA, 5)
#define PA6_OUTPUT           B_1( DDRA, 6)
#define PA7_OUTPUT           B_1( DDRA, 7)
#define PAU_OUTPUT           DDRA|= 0B11110000   // Port A felso fel byte (upper nible) kimenetre allitasa
#define PAL_OUTPUT           DDRA|= 0B00001111   // Port A also fel byte (lower nible) kimenetre allitasa
#define PAA_OUTPUT           DDRA=  0B11111111   // Port A osszes (all) bit kimenetre allitasa

#define PA0_INPUT            B_0( DDRA, 0)       // Port A 0. bit bemenetre allitasa   
#define PA1_INPUT            B_0( DDRA, 1)
#define PA2_INPUT            B_0( DDRA, 2)
#define PA3_INPUT            B_0( DDRA, 3)
#define PA4_INPUT            B_0( DDRA, 4)
#define PA5_INPUT            B_0( DDRA, 5)
#define PA6_INPUT            B_0( DDRA, 6)
#define PA7_INPUT            B_0( DDRA, 7)
#define PAU_INPUT            DDRA&= 0B00001111
#define PAL_INPUT            DDRA&= 0B11110000
#define PAA_INPUT            DDRA=  0

#define PA0_PULLUP           B_1( PORTA, 0)      // Port A 0. bit belso felhuzas bekapcsolasa   
#define PA1_PULLUP           B_1( PORTA, 1)          
#define PA2_PULLUP           B_1( PORTA, 2)          
#define PA3_PULLUP           B_1( PORTA, 3)          
#define PA4_PULLUP           B_1( PORTA, 4)          
#define PA5_PULLUP           B_1( PORTA, 5)          
#define PA6_PULLUP           B_1( PORTA, 6)          
#define PA7_PULLUP           B_1( PORTA, 7)          
#define PAU_PULLUP           PORTA|= 0B11110000
#define PAL_PULLUP           PORTA|= 0B00001111
#define PAA_PULLUP           PORTA=  0B11111111

#define PA0_1                B_1( PORTA, 0)      // Port A 0. bit 1-be allitasa   
#define PA1_1                B_1( PORTA, 1)          
#define PA2_1                B_1( PORTA, 2)          
#define PA3_1                B_1( PORTA, 3)          
#define PA4_1                B_1( PORTA, 4)          
#define PA5_1                B_1( PORTA, 5)          
#define PA6_1                B_1( PORTA, 6)          
#define PA7_1                B_1( PORTA, 7)          
#define PAU_1                PORTA|= 0B11110000
#define PAL_1                PORTA|= 0B00001111
#define PAA_1                PORTA=  0B11111111

#define PA0_0                B_0( PORTA, 0)      // Port A 0. bit 0-ba allitasa    
#define PA1_0                B_0( PORTA, 1)          
#define PA2_0                B_0( PORTA, 2)          
#define PA3_0                B_0( PORTA, 3)          
#define PA4_0                B_0( PORTA, 4)          
#define PA5_0                B_0( PORTA, 5)          
#define PA6_0                B_0( PORTA, 6)          
#define PA7_0                B_0( PORTA, 7)          
#define PAU_0                PORTA&= 0B00001111
#define PAL_0                PORTA&= 0B11110000
#define PAA_0                PORTA=  0

#define PA0_R                B_R( PINA, 0)       // Port A 0. bit kiolvasasa   
#define PA1_R                B_R( PINA, 1)          
#define PA2_R                B_R( PINA, 2)          
#define PA3_R                B_R( PINA, 3)          
#define PA4_R                B_R( PINA, 4)          
#define PA5_R                B_R( PINA, 5)          
#define PA6_R                B_R( PINA, 6)          
#define PA7_R                B_R( PINA, 7)          
#define PAU_R                ( PINA & 0B11110000) >>> 4
#define PAL_R                PINA & 0B00001111 
#define PAA_R                PINA 

#define PA0_W( X)            X ? B_1( PORTA, 0) : B_0( PORTA, 0)     // Port A 0. bit irasa 
#define PA1_W( X)            X ? B_1( PORTA, 1) : B_0( PORTA, 1)          
#define PA2_W( X)            X ? B_1( PORTA, 2) : B_0( PORTA, 2)          
#define PA3_W( X)            X ? B_1( PORTA, 3) : B_0( PORTA, 3)          
#define PA4_W( X)            X ? B_1( PORTA, 4) : B_0( PORTA, 4)          
#define PA5_W( X)            X ? B_1( PORTA, 5) : B_0( PORTA, 5)          
#define PA6_W( X)            X ? B_1( PORTA, 6) : B_0( PORTA, 6)          
#define PA7_W( X)            X ? B_1( PORTA, 7) : B_0( PORTA, 7)          
#define PAU_W( X)            PORTA= ( PORTA & 0B00001111) | ( ( X << 4) & 0B11110000)
#define PAL_W( X)            PORTA= ( PORTA & 0B11110000) | ( X & 0B00001111)
#define PAA_W( X)            PORTA= X          

Nézzünk egy LED villogtató mintaprogramot, ami most konkrétan egy ATMega8-ra készült:


/*******************************************************************************
*   Author       -  Kiraly Tibor
*                   http://www.tkiraaly.hu
*   Date         -  2016.01.13.
*   Chip         -  Atmel AMega8
*   Compiler     -  avr-gcc ( WinAVR)
*
*   kpin bemutatasa, egy LED villogtatasa
*
********************************************************************************
*   PonyProg Configuration and Security Bits (bepipalva):
*
*   CKSEL3, CKSEL2, CKSEL1, CKSEL0
*   P       P       -       -       0011  Calibrated Internal RC Oscillator 4MHz
*
*   Calibrated Internal RC Oscillator
*   SUT1  SUT0
*   -     P         Slowly rising power
*   
*******************************************************************************/
#define F_CPU                4 MHZ


#include "tkiraaly_atmega8.h"
#include <util/delay.h>


#define LED_ON      PB0_0
#define LED_OFF     PB0_1


int main( void)
{
   PB0_OUTPUT;                                   // LED katod a 14. labra
   for(;;)
   {
      LED_ON;
      _delay_ms( 200);
      LED_OFF;
      _delay_ms( 200);
   }
}

Itt a vége, fuss el véle, legytek az én vendégeim, innen letölthetitek a teljes programokat, miegymást, összecsomagolva.