#include "wiring_private.h" // possiamo utlizzare sbi e cbi per settare lo stato delle porte I/O
// AREA MODULO UART SW usw
#define USWNRXB 32 //byte
#define USWBRT 26 //TAU BAU IN RATE IN TICKS
volatile uint8_t uswmask, uswtmp, uswidx, uswbyte[USWNRXB], uswfer[USWNRXB];
void setup() {
Serial.begin(9600);
//Inizializzazione area modulo cattura
uswidx = 0;
uswmask = 0;
sbi(PCICR, PCIE2);
sbi(PCMSK2, PCINT18);
OCR0A = 0;
TCCR0A &= ~(_BV(WGM02) | _BV(WGM01) | _BV(WGM00)); //OPPURE DOVEVO FARE CBI() PER OGNUNO DEI 3 REGISTRI
sbi(TIMSK0, OCIE0A);
sbi(DDRD, 3); //VUOL DIRE METTI ALTO IL PIN DIGITALE 3
Serial.println("Hello world\n");
delay(2000);
Serial.println(F_CPU);
for (uint8_t i = 0; i < uswidx; i++) {
Serial.write(uswbyte[i]);// write-> stampa il codice ASCII passato
if (uswfer[i] == 0)Serial.write('@');
}
Serial.write(10);
/* fa perdere molto tempo: while(digitalRead(2)==1);
while(PIND&0x4);
*/
}
void loop() {
}
ISR(TIMER0_COMPA_vect) { // quando tcnt0 da 255 arriva a 0 (NON LO SAPEVO CHE RIPETEVA IL CONTEGGIO) fa l'interrupt facendo il confronto con OCR0A CHE VALE 0
if (uswmask) {
sbi(PORTD, 3);
//leggiamo la porta
uint16_t tbit = PIND & 0x04; // prendo valore PIND2
OCR0A += USWBRT;
if (uswmask == 0xff) {
if (uswidx < USWNRXB)uswfer[uswidx++] = tbit;
uswmask = 0;
sbi(PCMSK2, PCINT18);
} else {
if (tbit)
uswtmp |= uswmask; //sommo 1 a temp
uswmask <<= 1;
if (uswmask == 0) {
if (uswidx < USWNRXB)uswbyte[uswidx++] = uswtmp;
uswmask = 0xff; //metto tutto a 1
}
}
cbi(PORTD, 3); // 0CR0A POSSO ANCHE USARLO IN MODO CHE L'INTERRUPT VENGA ESEGUITO E VENGA COSTRUITO IL SEGNALE IN INTERVALLI DI TEMPO VARIABILI (INCREEMENTANDOLO E DECREMENTANDOLO) E NON SOLO QUANDO TCNT=0
};
}
//OVERFLOW VUOL DIRE CHE RITORNA A 0 (IN GENERALE)
ISR(PCINT2_vect) { //ISR = interrupt service routine
if ((PIND & 4) == 0 ) {
OCR0A = TCNT0 + USWBRT + USWBRT / 2;
cbi(PCMSK2, PCINT18);
uswmask = 1;
uswtmp = 0;
}
}