Ciao a tutti
Vorrei realizzare un periodimetro, cioè un misuratore della durata del tempo a livello alto, di quello a livello basso e del duty cycle di un segnale. Per questo vorrei usare una base dei tempi di 1us, contro i 4us standard di aggiornamento di micros(). Secondo il calcolatore
https://www.arduinoslovakia.eu/application/timer-calculator
ho provato così:
// Interrupt: https://dronebotworkshop.com/interrupts/
#include <PCF8574_HD44780_I2C.h> // LCD I2C.
// LCD 16x2 con indirizzo I2C 0x27:
PCF8574_HD44780_I2C lcd(0x27,16,2);
volatile int32_t microsecondi=0;
uint32_t t=0;
void setup()
{
pinMode(0, OUTPUT); // TEST.
pinMode(4, INPUT); // INPUT.
pinMode(8, INPUT_PULLUP); // Encoder A.
pinMode(9, INPUT_PULLUP); // Encoder B.
lcd.init();
lcd.backlight();
lcd.print("Start");
// AVR Timer CTC Interrupts Calculator v8
// http://www.arduinoslovakia.eu/application/timer-calculator
// Microcontroller: ATmega328P
// Created: 2023-02-04T17:43:37.092Z (4/2/2023 h.17.43)
noInterrupts();
// Clear registers:
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
OCR1A = 1;
TCCR1B |= (1 << WGM12); // CTC
TCCR1B |= 2; // Prescaler 8
TIMSK1 |= (1 << OCIE1A); // Output Compare Match A Interrupt Enable
interrupts();
}
void loop()
{
if(millis()-t>=1000) {t=millis(); lcd.setCursor(0,0); lcd.print(microsecondi);}
}
ISR(TIMER1_COMPA_vect)
{
microsecondi+=1;
}
ma compare solo lo "Start" iniziale... Solo cambiando i valori comincia a funzionare. Sembra proprio che con 16MHz di clock non ce la faccia... E' così? Che schedina/microcontrollore potrei usare? L'ESP8266 o ESP32 (ma il WiFi non mi serve)? Altrimenti quale altra? Dovrà gestire anche un LCD e/o un 7219 con 8 display a 7 segmenti a LED.
Grazie
Gianluca