Code:
//uint32_t_Auf_Ports_mappen.c
#include <avr/io.h>
#define ARRAY_LENGTH 20
uint8_t Port_Mask[ARRAY_LENGTH] = {
&PORTA, &PORTA, &PORTA, &PORTA, &PORTA, &PORTA, &PORTA, &PORTA,
&PORTC, &PORTC,
&PORTD, &PORTD, &PORTD, &PORTD, &PORTD,
&PORTC, &PORTC, &PORTC, &PORTC, &PORTC
};
uint8_t Pin_Mask[ARRAY_LENGTH] = {
PA7, PA6, PA5, PA4, PA3, PA2, PA1, PA0,
PC6, PC5,
PD7, PD6, PD5, PD4, PD3,
PC4, PC3, PC2, PC1, PC0
};
uint32_t Potenz_Zahlen[ARRAY_LENGTH] = {
1,2,4,8,16,32,64,128,256,512,1024,
2048,4096,8192,16384,32768,65536,131072,262144,524288
};
int main(void) {
DDRA = 0xFF;
DDRC = 0xFF;
DDRD = 0xFF;
uint32_t z = Potenz_Zahlen[2]| Potenz_Zahlen[7] | Potenz_Zahlen[11]; // schaltet bit 2,7 und 11 ein also PORTA.5 , PORTA.7 und PORTD.6
SET_PORTS(z);
}
void SET_PORTS(uint32_t x){
for(uint8_t i = 0; i< ARRAY_LENGTH; i++){
BIT_BOOL_SET(Port_Mask[i], Pin_Mask[i], x & Potenz_Zahlen[i]); // von x bleibt nur das i-te Bit unmaskiert,
// danach ist das int entweder 0 und das Bit muss gelöscht werden
// oder > 0 und dann wird es gesetzt
}
}
inline void BIT_BOOL_SET(volatile uint8_t *target, uint8_t bit, uint32_t b){
if (b>0){
BIT_SET(target, bit);
}else{
BIT_CLEAR(target, bit);
}
}
inline void BIT_SET(volatile uint8_t *target, uint8_t bit){
*target |= (1<<bit);
}
inline void BIT_CLEAR(volatile uint8_t *target, uint8_t bit){
*target &= ~(1<<bit);
}
Die wichtige Methode ist hier SET_PORTS der du einen 32-Bit int übergibst die setzt dann die Pins entsprechend in der Reihenfolge wie sie in Port_Mask und Pin_Mask aufgelistet sind.
Lesezeichen