Bom dia amigos.

Iniciei a pouco tempo meus estudos com arduino e estou tendo dificuldades em fazer com que o dimmer funcione no attiny85.
Efetuei os testes no arduino e funcionou muito bem, mas agora queria poder transferir o projeto para o attiny85, porém devido as diferençás de Timers e esta rodando em 8MHz acredito que este seja o problema.

Já tentei alterar os timers na programação, mas ainda continua o problema, ou acende totalmente ou fica totalmente apagada a lampada.
Vocês que já são mais experiente no assunto, poderiam me ajudar sobre onde estou errando neste código?
Obrigado.

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

#define DETECT 0  //zero cross detect
#define GATE 3    //triac gate
#define PULSE 8   //trigger pulse width (counts)
int i=483;

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

  // set up Timer0
  OCR0A = 100;      //initialize the comparator
  TIMSK = 0x03;    //enable comparator A and overflow interrupts
  TCCR0A = 0x00;    //timer control registers set for
  TCCR0B = 0x00;    //normal operation, timer disabled


  // set up zero crossing interrupt
  attachInterrupt(5,zeroCrossingInterrupt, RISING);    
    //IRQ0 is pin 2. Call zeroCrossingInterrupt 
    //on rising signal

}  

//Interrupt Service Routines

void zeroCrossingInterrupt(){ //zero cross detect   
  TCCR0B=0x04; //start timer with divide by 256 input
  TCNT0 = 0;   //reset timer - count from zero
}

ISR(TIMER0_COMPA_vect){ //comparator match
  digitalWrite(GATE,HIGH);  //set triac gate to high
  TCNT0 = 65536-PULSE;      //trigger pulse width
}

ISR(TIMER0_OVF_vect){ //timer0 overflow
  digitalWrite(GATE,LOW); //turn off triac gate
  TCCR0B = 0x00;          //disable timer stopd unintended triggers
}

void loop(){ // sample code to exercise the circuit

i--;
OCR0A = i;     //set the compare register brightness desired.
if (i<65){i=483;}                      
delay(15);
}

Exibições: 1167

Responder esta

Respostas a este tópico

Meu chute = divida por dois esses valores e use isso ...

OCR0A = i;     //set the compare register brightness desired.
if (i<32){i=241;}                      
delay(15);

José, obrigado pela ajuda.

Efetuei os testes aqui, mas o problema continua, ainda não esta fazendo o fading.

Pesquisando #include <avr/io.h>

Diretorio = \arduino-1.0.5\hardware\tools\avr\avr\include\avr

#elif defined (__AVR_ATtiny85__)
# include <avr/iotn85.h>

Como será que o sketch sabe que é um ATtiny 85?

José, antes de compilar o sketck é selecionado a board como Attiny85 8Mhz.

Já alterei diversas opções do sketch, mas não faz a função corretamente.

Continuo pesquisando bastante, mas nada de dimmer relacionado ao Attini 85 ainda encontrei.

É mesmo, eu tinha me esquecido...

Boa noite Fábio,

  Apesar do tempo que vc fez esta postagem eu tive  o mesmo problema (em 2021) e após pesquisar encontrei a resposta na questão  que o Attiny 85 possui pinos específicos para a função de interrupção, no meu caso, precisei da interrupção em apenas 1 pino (o que monitora a entrada de um contador de voltas de um sensor de vazão) então descobri que bastava utilizar para a interrupção 0 o pino digital 2

(int flowPin = 2; //Este é o pino de entrada no Attint 85, para permitir a interrupção 0, pino físico 7, porta DIGITAL D2),

pelo que consegui pesquisar o Attiny 85 possui dois modos de interrupção a 0 e a 1, e são em pinos diferentes. após trocas as portas consegui resolver e fazer o programa funcionar, agora vou para os testes práticos.

meu programa tem o objetivo de controlar a vazão em L/min de um poço semi-artesiano que perfurei em um terreno muito argiloso e que não me garante uma vazão constante, a ideia é de impedir que a bomba trabalhe a seco. meu código funcionando em testes de bancada está assim para o Attiny 85:

------------------------------------------Attiny 85------------------------------------------------------------------------------------------

int flowPin = 2; //Este é o pino de entrada no Attint 85, para permitir a interrupção 0, pino físico 7, porta DIGITAL D2
double flowRate; //Este é o valor que pretende-se calcular

volatile int count; //Este número precisa ser setado como volátil para garantir que ele seja atualizado
//corretamente durante o processo de interrupção

int buttonPin = 4; // pino de controle para a bomba, módulo relé, saída digital 4 porta D4

void setup() {

pinMode(buttonPin, OUTPUT);
pinMode(flowPin, INPUT); //Seta o pino de entrada D3
attachInterrupt(0, Flow, RISING); //Configura o interruptor 0 (pino D2 no Attiny 85) para rodar a função "Flow"

digitalWrite(buttonPin, 1); //liga a bomba
delay(3000); // tempo para encher a tubulação 3s
}


void loop() {

count = 0; // Reseta o contador para iniciarmos a contagem em 0 novamente
interrupts(); //Habilita o interrupção no Arduino
delay (1000); //Espera 1 segundo
noInterrupts(); //Desabilita o interrupção no Arduino

//Cálculos matemáticos
flowRate = (count * 2.25); //Conta os pulsos no último segundo e multiplica por 2,25mL, que é a vazão de cada pulso
flowRate = flowRate * 60; //Converte segundos em minutos, tornando a unidade de medida mL/min
flowRate = flowRate / 1000; //Converte mL em litros, tornando a unidade de medida L/min

// controle da bomba d'agua
if (flowRate > 1){

digitalWrite(buttonPin, 1); //mantem a bomba ligada se a medição de vazão for superior a 1 lito por minuto

}

if (flowRate < 1){

digitalWrite(buttonPin, 0); //deliga a bomba se a medição de vazão for inferior a 1 lito por minuto

interrupts(); //Habilita a interrupção no Arduino
delay (60000); //Espera 1 min para o poço encher de água

digitalWrite(buttonPin, 1); //liga a bomba

delay(3000); // ligando a bomba d'água, espera 3 segundos para bombear e realizar a nova medição,
//se for superior a 1,0 L/min, mantem ligada, caso contrário é aguardado mais 1 min para o poço encher de água

}
}

void Flow()
{
count++; //Quando essa função é chamada, soma-se 1 a variável "count"
}

------------------------------------------------------------------------------------------------------------------------------------

Para o Arduíno Uno, onde realizei testes práticos com a bomba d'água e o módulo relê que fiz, e funcionou por mais de 8hs contínuas e acompanhei pelo serial monitor/ploter o comportamento da vazão do poço, onde o programa funcionou muito bem interrompendo o funcionamento da bomba quando a vazão era igual ou menor que a 1 L/min a bomba era desligada e aguardava 1 min para o poço encher. e assim reiniciando o processo em automático.

============  Arduino UNO ===============================================

int flowPin = 2; //Este é o pino de entrada no Arduino
double flowRate; //Este é o valor que pretende-se calcular
volatile int count; //Este número precisa ser setado como volátil para garantir que ele seja atualizado corretamente durante o processo de interrupção
int buttonPin = 4; // pino de controle para a bomba, módulo relé

void setup() {

pinMode(buttonPin, OUTPUT);
pinMode(flowPin, INPUT); //Seta o pino de entrada
attachInterrupt(0, Flow, RISING); //Configura o interruptor 0 (pino 2 no Arduino Uno) para rodar a função "Flow"
Serial.begin(9600); //Inicia o Serial

digitalWrite(buttonPin, 1); //liga a bomba
Serial.println("ligada");
Serial.println("bombeamento inicial");
delay(3000); // tempo para encher a tubulação
}
void loop() {


count = 0; // Reseta o contador para iniciarmos a contagem em 0 novamente
interrupts(); //Habilita o interrupção no Arduino
delay (1000); //Espera 1 segundo
noInterrupts(); //Desabilita o interrupção no Arduino

//Cálculos matemáticos
flowRate = (count * 2.25); //Conta os pulsos no último segundo e multiplica por 2,25mL, que é a vazão de cada pulso
flowRate = flowRate * 60; //Converte segundos em minutos, tornando a unidade de medida mL/min
flowRate = flowRate / 1000; //Converte mL em litros, tornando a unidade de medida L/min

Serial.print(flowRate); //Imprime a variável flowRate no Serial
Serial.println(" L/Min");

// controle da bomba d'agua
if (flowRate > 1){

digitalWrite(buttonPin, 1); //liga a bomba
Serial.println(" ligada");
}
if (flowRate < 1){

digitalWrite(buttonPin, 0); //desliga a bomba
Serial.println(" desligada");
Serial.println("espera o poço encher");


interrupts(); //Desabilita o interrupção no Arduino
delay (60000); //Espera 1 min para o poço encher

digitalWrite(buttonPin, 1); //liga a bomba
Serial.println(" ligada apos queda");

delay(3000); //espera 3s antes de iniciar as medições/interrupções de contagem da vazão

//delay(180000); //180.000= 3min= 180segundos

}
}

void Flow()
{
count++; //Quando essa função é chamada, soma-se 1 a variável "count"
}

===============================================================

Espero com esta postagem poder ajudar a você ou alguém que precise de ajuda com esta dificuldade, ainda vou atualizar meu projeto com leds para indicar o funcionamento da bomba e da vazão, caso alguém precise de mais detalhes ou fotos das montagens que realizei podem me enviar e-mail john2n3055@yahoo.com.br . um abraço a todos.

referência que me ajudou: https://www.youtube.com/watch?v=JHjAf-ynYKk

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço