#include <avr/io.h>
#include "avr/pgmspace.h"
uint8_t i;
typedef struct
{
volatile uint8_t *relPort;
uint8_t relMaska;
volatile uint8_t *ledPort;
uint8_t ledMaska;
} OUTPUT;
//const PROGMEM
OUTPUT outputs[7] = {
{ &PORTA, 1<<PORTA2, &PORTB, 1<<PORTB0 },
{ &PORTD, 1<<PORTD4, &PORTB, 1<<PORTB1 },
{ &PORTD, 1<<PORTD3, &PORTB, 1<<PORTB2 },
{ &PORTA, 1<<PORTA0, &PORTD, 1<<PORTD7 },
{ &PORTD, 1<<PORTD2, &PORTD, 1<<PORTD6 },
{ &PORTD, 1<<PORTD1, &PORTD, 1<<PORTD5 },
{ &PORTD, 1<<PORTD0, &PORTB, 1<<PORTB7 }
};
int main(void)
{
//inicializace portu
DDRA = ~(1<<DDA1); //PA1 je analogovy vstup
DDRB = ~(1<<DDB4); //PB4 jako vstup MISO
DDRC = 1<<DDC7; //PC7 jediny nevyuzity pin, ostatni jsou vstupy
DDRD = 0xFF; //cely port jako vystupy
for (i=0; i<7; i++)
{
*(outputs[i].ledPort) |= outputs[i].ledMaska;
}
while (1)
{
}
}
Výše uvedený kód funguje - rozsvítí LED na požadovaném portu. Problémy nastanou když chci umístit pole
OUTPUT outputs[7] do paměti programu (v kódu je to vykomentováno). Jak toto pole struktur dostanu do paměti programu aby byl kód funkční?
Ještě jsem zkusil
#include <avr/io.h>
#include "avr/pgmspace.h"
uint8_t i;
typedef struct
{
volatile uint8_t *relPort;
uint8_t relMaska;
volatile uint8_t *ledPort;
uint8_t ledMaska;
} OUTPUT;
const PROGMEM OUTPUT outputs[7] = {
{ &PORTA, 1<<PORTA2, &PORTB, 1<<PORTB0 },
{ &PORTD, 1<<PORTD4, &PORTB, 1<<PORTB1 },
{ &PORTD, 1<<PORTD3, &PORTB, 1<<PORTB2 },
{ &PORTA, 1<<PORTA0, &PORTD, 1<<PORTD7 },
{ &PORTD, 1<<PORTD2, &PORTD, 1<<PORTD6 },
{ &PORTD, 1<<PORTD1, &PORTD, 1<<PORTD5 },
{ &PORTD, 1<<PORTD0, &PORTB, 1<<PORTB7 }
};
int main(void)
{
//inicializace portu
DDRA = ~(1<<DDA1); //PA1 je analogovy vstup
DDRB = ~(1<<DDB4); //PB4 jako vstup MISO
DDRC = 1<<DDC7; //PC7 jediny nevyuzity pin, ostatni jsou vstupy
DDRD = 0xFF; //cely port jako vystupy
i=0;
*(outputs[i].ledPort) |= outputs[i].ledMaska;
i=1;
*(outputs[i].ledPort) |= outputs[i].ledMaska;
while (1)
{
}
}
funguje také.
Prostě ty jednotlivé LED potřebuji obsloužit v cyklu.
hu