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.