Witam,
Ostatnio musiałem zrobić coś na Avr, ale po kilkumiesięcznych zmaganiach z c# zapisy typu `PORTA |= (1<<x);` nie były mi przyjemne dla oka.
Pomyślałem - jak dużo tego i parametryzować trzeba to templaty. G++ nie chciał przyjąć jako parametru szablonu adresów portów. Dałem spokój z nimi po chwili szukania na necie.
Potem pomyślałem - dużo tego, w zależności od procka są inne porty itp. Napiszę szybko generator kodu. Wyszło takie coś http://www.github.com/pixellos/CodeGenerator.
Niby ładnie działa, wywalone do innego pliku nagłówkowego.
Tylko czy takie rozwiązanie nie jest mało eleganckie?
Przykładowy output dla A i 2 pin
class PortA{
public:
void static Set(uint8_t uCharValue)
{
PORTA |= uCharValue;
}
void static Clear(uint8_t uCharValue)
{
PORTA &= ~(uCharValue);
}
void static Toggle(uint8_t uCharValue)
{
PORTA ^= uCharValue;
}
uint8_t static Check()
{
return PINA;
}
void static AsOutput(uint8_t uCharValue)
{
DDRA &= ~(uCharValue);
}
void static AsInput(uint8_t uCharValue)
{
DDRA |= uCharValue;
}
};class Pin_A0{
public:
void static Set()
{
PORTA |= 1 << 0;
}
void static Clear()
{
PORTA &= ~(1<<0);
}
void static Toggle()
{
PORTA ^= (1<<0);
}
bool Check()
{
return ((PINA >> 0) & 1);
}
void static AsOutput()
{
DDRA &= ~(1<<0);
}
void static AsInput()
{
DDRA |= 1<<0;
}
};class Pin_A1{
public:
void static Set()
{
PORTA |= 1 << 1;
}
void static Clear()
{
PORTA &= ~(1<<1);
}
void static Toggle()
{
PORTA ^= (1<<1);
}
bool Check()
{
return ((PINA >> 1) & 1);
}
void static AsOutput()
{
DDRA &= ~(1<<1);
}
void static AsInput()
{
DDRA |= 1<<1;
}
};