/********************************************************
* RFM12-Kommunikation, hardwareabhängige Routinen *
* ATtiny45-Version für fs-d (Sandkiste) *
* Wird von rf12.h eingebunden, im »namespace "rf12"« *
********************************************************/
// Empfangsdaten (für rf_poll) vorhanden?
inline bool data() {return !!(PINB&0x01);}
// !SS schalten
inline void ss_lo() {PORTB&=~0x20;}
inline void ss_hi() {PORTB|= 0x20;}
#ifdef RF12_CPP // Aufrufer == rf12.cpp?
static void spi_clock() {
USISR = 0x40; // Flankenzähler auf 0, Interrupt löschen
do{
_delay_us(1);
USICR=0x1B; // Dreidrahtmodus = SPI
}while(!(USISR&0x40)); // 16 Flanken generieren
}
// Daten-WORD „austauschen“
word xfer(word data) {
PORTB &=~0x04; // Falls ein, rote LED aus
ss_lo(); // !SEL aktivieren (falls nicht bereits aktiv)
USIDR = data>>8;
spi_clock();
byte h = USIDR; // Gelesenes Datenbyte einfangen
USIDR = data; // Nächstes Datenbyte ausgeben
spi_clock();
ss_hi(); // !SEL deaktivieren
ss_lo(); // !SEL aktivieren: RGIT oder FFIT "guckt raus"
return h<<8|USIDR;
}
#include <avr/wdt.h>
#define PERBYTE_HOOK wdt_reset()
#endif
Detected encoding: UTF-8 | 0
|