#define oneWirePin 2 // Definisci il pin a cui è collegato il bus 1-Wire
//PORTD Pin 2 al 7
//PORTB Pin 8 al 13
//PORTC Pin 14 al 19
//DDR configura pin come output o input
//PORT configura i livelli alto e basso
//PIN legge il valore di un pin
byte rom_code[8] = {0x28, 0xFF, 0x4C, 0x46, 0x7A, 0x05, 0x00, 0x00};
volatile unsigned long timer1_microseconds = 0; // Contatore di microsecondi
// Funzione ISR per l'interruzione del Timer1
ISR(TIMER1_COMPA_vect) {
timer1_microseconds++; // Incrementa il contatore dei microsecondi
}
// Inizializza il Timer1 per generare un interrupt ogni 1µs
void setupTimer1() {
cli(); // Disabilita gli interrupt globali
TCCR1A = 0; // Imposta il registro di controllo del Timer1 A su 0
TCCR1B = 0; // Imposta il registro di controllo del Timer1 B su 0
TCNT1 = 0; // Inizializza il contatore del Timer1 su 0
// Imposta il compare match register per generare un interrupt ogni 10µs
OCR1A = 159; // Calcolato per un prescaler di 1
// Imposta il prescaler su 1 e la modalità CTC (Clear Timer on Compare Match)
TCCR1B |= (1 << WGM12) | (1 << CS10);
// Abilita l'interrupt del compare match A del Timer1
TIMSK1 |= (1 << OCIE1A);
sei(); // Abilita gli interrupt globali
}
// Funzione per implementare un delay non bloccante basato sul timer1
void delayUs(unsigned long us) {
unsigned long startMicros = timer1_microseconds;
while (timer1_microseconds - startMicros < us) {
// Loop vuoto: attende il passaggio del tempo
}
}
//Imposta il pin come output
void setPinOutput() {
DDRD |= (1 << oneWirePin);
}
//Imposta il pin come input
void setPinInput() {
DDRD &= ~(1 << oneWirePin);
}
//Imposta il livello alto
void setPinHigh() {
PORTD |= (1 << oneWirePin);
}
//Imposta il livello basso
void setPinLow() {
PORTD &= ~(1 << oneWirePin);
}
//Ritorna valore pin, cioè alto (1) o basso (0)
int readPin() {
return PIND & (1 << oneWirePin) ? 1 : 0;
}
//Prova
void setup() {
Serial.begin(9600);
// Configura il pin come input
setPinInput();
setPinHigh();
Serial.println("Slave avviato.\n");
setupTimer1();
}
void loop() {
if (readPin() == 0) {
Serial.println("Reset pulse del Master rilevato, inizio Presence Pulse.\n");
setPinOutput();//Imposto il pin come uscita
setPinLow();//Imposto a low il pin per il Presence Pulse
delayUs(24);
setPinHigh();
Serial.println("Andata");
}
}