#include <TinyWireM.h>
#include <Tiny4kOLED.h>
#include "font16x32digits.h"
#include <avr/io.h>
//#include <avr/sleep.h>
//#include <avr/interrupt.h>
#include <PinChangeInterrupt.h>
// normal delay() won't work anymore because we are changing Timer1 behavior
// Adds delay_ms and delay_us functions
//#include <util/delay.h>
// Clock at 1mHz
//#define F_CPU 1000000 //F_CPU 1000000. This is used by delay.h library
#define pulses 3
#define reset 4
#define PWMpin6 1
volatile long cpt = 0;
int var = 0;
String nombre = "000";
unsigned long debut;
void splash() {
//oled.setCursor(15, 1);
//oled.print(F("ATtiny85+SSD1306"));
//oled.setCursor(12, 3);
//oled.print(F("Blue Ring Testeur"));
oled.setCursor(35, 7);
oled.print(F("Andre BENARD"));
}
void PWM_config(){
//DDRB |= (1<<PB1); //Set pin PB0 as output
TCNT0 = 0;
TCCR0A=0;
TCCR0B=0;
TCCR0A |= (1 << WGM01 ) | (1 << WGM00); //Fast PWM
TCCR0A |= (1 << COM0B1) | (1 << COM0B0);
TCCR0B |= (1 << CS02) | (1 << CS00); // Prescaler Clk/1024 N=1024
//TCCR0B |= (1 << CS02); // Prescaler Clk/256 N=256
// Fréquence de sortie
// f_pwm = fclock/(N*256)=8000000/(1024*256) = 30Hz
// f_pwm = fclock/(N*256)=1000000/(256*256) = 15Hz
// f_pwm = fclock/(N*256)=1000000/(64*256) = 61Hz
// f_pwm = fclock/(N*256)=1000000/(1024*256) = 4Hz
// Port PB0 - pas de génération de signaux PB0, car PB0 sur utilisé pour I2C
//OCR0A=50; // OC0A +Duty = 50/255*100 = 19.6%
//Port PB1
//OCR0B=50; // OC0B +Duty = (255-50)/255*100 = 80.4% -Duty = 50/255*100 = 19.6%
OCR0B=134; // OC0B +Duty = (255-6)/255*100 = 97.65% -Duty = 6/255*100 = 2.35
// Make PWM pins OUTPUT
//DDRB |=(1<<DDB0); // PB0 en sortie - pas de génération de signaux PB0, car PB0 sur utilisé pour I2C
//DDRB |=(1<<DDB1); // PB1 en sortie
}
void setup() {
// set pins to input with a pullup
pinMode(reset, INPUT_PULLUP); // Pull down 47K externe
pinMode(pulses, INPUT);
pinMode(PWMpin6, OUTPUT);
oled.begin(128, 64, sizeof(tiny4koled_init_128x64br), tiny4koled_init_128x64br);
// Two fonts are supplied with this library, FONT8X16 and FONT6X8
oled.setFont(FONT6X8);
// To clear all the memory
oled.clear();
oled.on();
splash();
delay(1000);
init_Display();
//attach the new PinChangeInterrupts and enable event functions below
attachPinChangeInterrupt(digitalPinToPinChangeInterrupt(pulses), pulses_prog, RISING);
attachPinChangeInterrupt(digitalPinToPinChangeInterrupt(reset), reset_prog, FALLING);
PWM_config();
enablePinChangeInterrupt(digitalPinToPinChangeInterrupt(pulses));
enablePinChangeInterrupt(digitalPinToPinChangeInterrupt(reset));
}
void loop() {
unsigned long maintenant = millis();
//if (maintenant - debut >= 50) {
// Affich();
// }
}
void pulses_prog(void) {
// increase value
cpt++;
}
void reset_prog(void) {
// reset value
disablePinChangeInterrupt(digitalPinToPinChangeInterrupt(pulses));
disablePinChangeInterrupt(digitalPinToPinChangeInterrupt(reset));
Affich();
cpt=0;
enablePinChangeInterrupt(digitalPinToPinChangeInterrupt(pulses));
enablePinChangeInterrupt(digitalPinToPinChangeInterrupt(reset));
}
void init_Display() {
oled.clear();
oled.setFont(FONT8X16P);
oled.setCursor(5, 0);
oled.print("Blue Ring Tester");
oled.setCursor(8, 1);
oled.setFont(FONT16X32DIGITS);
oled.setCursor(42, 4);
oled.print(cpt);
}
void Affich() {
//disablePinChangeInterrupt(digitalPinToPinChangeInterrupt(pulses));
//disablePinChangeInterrupt(digitalPinToPinChangeInterrupt(reset));
//oled.setFont(FONT6X8);
//oled.setCursor(1, 2);
//oled.print(OCR0B);
nombre = String(cpt);
var = nombre.length();
switch (var) {
case 1:
nombre = "00" + String(cpt);
break;
case 2:
nombre = "0" + String(cpt);
break;
default:
nombre = String(cpt);
break;
}
//oled.setFont(FONT16X32DIGITS);
oled.setCursor(42, 4);
oled.print(nombre);
//debut = millis();
//delay(3000);
//cpt=0;
//enablePinChangeInterrupt(digitalPinToPinChangeInterrupt(pulses));
//enablePinChangeInterrupt(digitalPinToPinChangeInterrupt(reset));
}