Timer? probleem met Attiny85

Arduino specifieke Software
Berichten: 132
Geregistreerd: 21 Feb 2013, 16:04

Timer? probleem met Attiny85

Berichtdoor René » 06 Okt 2019, 18:38

Ik probeer een AC dimmer te maken met een spanningsgestuurde Attiny en esp8266 als communicatie module.
Mijn probleem betreft de Attiny85 software.
Van Internet (https://forum.arduino.cc/index.php?topic=314773.0) heb ik de volgende code (uit 2015) gehaald en geïnstalleerd
Code: Alles selecteren
// Voltage controlled dimmer with ATtiny85
//
// This arduino sketch includes a zero
// crossing detect function and an opto-isolated triac.
//
// AC Phase control is accomplished using the internal
// hardware timer1 in the ATtiny85
//
// Timing Sequence
// * timer is set up but disabled
// * zero crossing detected
// * timer starts counting from zero
// * comparator set to "delay to on" value
// * counter reaches comparator value
// * comparator ISR turns on triac gate
// * counter set to overflow - pulse width
// * counter reaches overflow
// * overflow ISR turns off triac gate
// * triac stops conducting at next zero cross

// The hardware timer runs at 8MHz.
// A half period of a 50Hz AC signal takes 10 ms is 80000 counts.
// Prescaler set to 1024 gives 78 counts per half period


#include <avr/io.h>
#include <avr/interrupt.h>

#define DETECT 2      //zero cross detect, interrupt 0, is physical pin 7
#define GATE 3        //triac gate is physical pin 2
#define PULSE 2       //trigger pulse width (counts)
#define INSTELPIN 2   // =A2 (digital pin4) is physical pin 3

void setup(){
  // set up pins
  pinMode(DETECT, INPUT);      //zero cross detect
  digitalWrite(DETECT, HIGH);  //enable pull-up resistor
  pinMode(GATE, OUTPUT);       //triac gate control

  // set up Timer1
  TCCR1 = 0;     // stop timer
  OCR1A = 50;    //initialize the comparator
  TIMSK = _BV(OCIE1A) | _BV(TOIE1);  //interrupt on Compare Match A | enable timer overflow interrupt
  sei();  // enable interrupts
  // set up zero crossing interrupt
  attachInterrupt(0,zeroCrossingInterrupt, FALLING);   
}

//Interrupt Service Routines
void zeroCrossingInterrupt(){   
  TCNT1 = 0;   //reset timer - count from zero
  TCCR1 = B00001011;        // prescaler on 1024, see table 12.5 of the tiny85 datasheet
}

ISR(TIMER1_COMPA_vect){    //comparator match
  digitalWrite(GATE,HIGH); //set triac gate to high
  TCNT1 = 255-PULSE;       //trigger pulse width, when TCNT1=255 timer1 overflows
}
 
ISR(TIMER1_OVF_vect){       //timer1 overflow
  digitalWrite(GATE,LOW);   //turn off triac gate
  TCCR1 = 0;                //disable timer stop unintended triggers
}

void loop(){     // use analog input to set the dimmer
int instelwaarde = analogRead(INSTELPIN);
OCR1A = map(instelwaarde, 0, 1023, 65, 2);
}

Op INSTELPIN heb ik een potmeter aangesloten die 0 tot 5V afgeeft.
Verder gebruik in Arduino 1.8.9
De Attiny85 (met 8Mhz instelling) laadt ik via een NANO met Arduino as ISP
Ik verwacht dat op de GATE pin een puls verschijnt die in tijd verschuift van ca 1 naar 10 ms als ik aan de potmeter draai.
Dat gebeurt niet.
Als ik draai verschijnt gedurende een klein stukje van de potmeteruitslag een puls van 4 ms breed om de 10 ms die niet verschuift.
Als ik doordraai wordt de puls ineens 10 ms breed met een herhaaltijd van 20 ms. Als ik verder draai wordt de GATE blijvend hoog.
Als ik andere testprogramma's draai werkt de potmeter zoals verwacht.
Als ik een andere Attiny85 gebruikt krijg ik dezelfde fout.

Advertisement

Berichten: 132
Geregistreerd: 21 Feb 2013, 16:04

SOLVED Re: Timer? probleem met Attiny85 OPGELOST

Berichtdoor René » 07 Okt 2019, 16:27

Het was een beginnersfout?
De attiny85 draaide intern op ca 1/8 van de door mij geselecteerde 8 Mhz.
Na het laden van de bootloader werkt het allemaal zoals verwacht.

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: RussellAlets en 19 gasten