GlobLib
HAL and API libraries for MCUs and hardware.
attiny13a_gpio.c
Go to the documentation of this file.
1 
17 #include "attiny13a_gpio.h"
18 
19 #ifdef GPIO_ISR
20 static void ( *isr_handler)(void);
21 #endif
22 
23 //Initialize a port's pin to a function defined by macro definitions passed in as mode
25 
26  switch(mode){
27 
28  case GPIO_DO:
29 
30  DDRB |= 1<<pin;
31  break;
32 
33  case GPIO_DI:
34  DDRB &= ~(1<<pin);
35  *(uint8_t*)PORTB &= ~(1<<pin);
36  break;
37 
38  default:
39  return E_GPIO_PORT;
40  break;
41  }
42 
43  return E_GPIO_NOERROR;
44 }
45 
46 //Set a corresponing port's pin high
47 void pinHigh(gpio_port port, gpio_pin pin){
48 
49  *(uint8_t*)PORTB |= 1<<pin;
50 }
51 
52 //Set a corresponding port's pin low
53 void pinLow(gpio_port port, gpio_pin pin){
54 
55  *(uint8_t*)PORTB &= ~(1<<pin);
56 }
57 
58 //Set a corresponding port's pin to a given state (defined as macro definition)
59 void pinWrite(gpio_port port, gpio_pin pin, gpio_state state)
60 {
61  if(state)
62  {
63  pinHigh(port,pin);
64  }
65  else
66  {
67  pinLow(port,pin);
68  }
69 }
70 
71 //Toggle a given port's pin
72 void pinToggle(gpio_port port, gpio_pin pin){
73 
74  *(uint8_t*)PORTB ^= (1<<pin);
75 }
76 
77 //Read the input state of a port's pin.
78 uint8_t pinRead(gpio_port port, gpio_pin pin){
79 
80  return PINB & (1<<pin) ;
81 }
82 
83 #ifdef GPIO_ISR
84 
85 
86 mcu_error GPIO_ISREnable(const gpio_port port, const gpio_pin pin, const gpio_isr trigger, void (*handle)(void)){
87 
88  cli();
89  pinSetup(GPIO_DI,port,pin);
90  PCMSK |= (1<<pin);
91  GIMSK |= 1<<PCIE;
92  isr_handler = handle;
93 
94  switch(trigger){
95 
96  case GPIO_RISING:
97 
98  MCUCR |= 1<<ISC00;
99  MCUCR |= 1<<ISC01;
100  break;
101 
102  case GPIO_FALLING:
103 
104  MCUCR &= ~(1<<ISC00);
105  MCUCR |= 1<<ISC01;
106  break;
107 
108  case GPIO_BOTH:
109 
110  MCUCR |= 1<<ISC00;
111  MCUCR &= ~(1<<ISC01);
112  break;
113 
114  case GPIO_LEVEL_LOW:
115 
116  MCUCR &= ~(1<<ISC00);
117  MCUCR &= ~(1<<ISC01);
118  default:
119 
120  return E_GPIO_TRIGGER;
121  break;
122  }
123  sei();
124  return E_GPIO_NOERROR;
125 }
126 
128 
129  PCMSK &= ~(1<<pin);
130 
131  if(0 == PCMSK){
132 
133  GIMSK &= ~(1<<PCIE);
134  }
135 
136  return E_GPIO_NOERROR;
137 }
138 
139 
140 ISR(PCINT0_vect){
141 
142  isr_handler();
143 }
144 
145 #endif
146 
gpio_port
GPIO ports available for the MCU.
Setup the port for digital output.
Interrupt occurs on low level.
void pinToggle(gpio_port port, gpio_pin pin)
Toggle the output of a given pin on a port.
void pinLow(gpio_port port, gpio_pin pin)
Set a given gpio pin on a port to logic low.
Header file for attiny13a GPIO.
gpio_state
GPIO pin states.
ERROR GPIO: Port doesn&#39;t exist.
mcu_error GPIO_ISRDisable(gpio_pin pin)
Disable interrupts on a gpio port / pin.
void pinHigh(gpio_port port, gpio_pin pin)
Set a given gpio pin on a port to logic high.
Setup the port for digital input.
Interrupt occurs on falling edge detection.
gpio_pin
GPIO pins available for each port.
Interrupt occurs on rising edge detection.
Interrupt occurs on rising and falling edge detection.
Port B of the MCU.
gpio_isr
GPIO interrupt options for pins.
ERROR GPIO: ISR trigger doesn&#39;t exist.
mcu_error pinSetup(gpio_mode mode, gpio_port port, gpio_pin pin)
Setup a GPIO pin for a given function.
void pinWrite(gpio_port port, gpio_pin pin, gpio_state state)
Set a given gpio pin on a port to a logic state.
uint8_t pinRead(gpio_port port, gpio_pin pin)
Read the current digital value of an input pin.
ERROR GPIO: No Error.
mcu_error GPIO_ISREnable(gpio_port port, gpio_pin pin, gpio_isr trigger, void(*handle)(void))
Setup interrupts on a gpio port / pin.
gpio_mode
GPIO setup options.
mcu_error
Error enumerators for the Debug peripheral.