Ir ao conteúdo

Posts recomendados

Postado

 

Estou com o seguinte problema, estou tentando converter um programa que fiz em arduino para AVR, o código em arduino é o seguinte:

int Vout = 6;
float POWER = 2.00;
float POWER2 = 2.00;
volatile float PWR = 0;

void setup() {

  pinMode(Vout, OUTPUT);
  attachInterrupt(0, ZeroCross, RISING);
  
}

void loop() {

  if(POWER<96){
    POWER = POWER + 1;
    PWR = POWER*255.00/100.00;
    if(POWER == 95){
      POWER2 = 95;
    }
  }
  if(POWER2>2){
    POWER2 = POWER2 - 1;
    PWR = POWER2*255.00/100.00;
    if(POWER2 == 2){
      POWER = 2;
    }
  }
  delay(150);
  
}

void ZeroCross(){

  float T1 = 32.60*(255.00 - PWR);
  
  delayMicroseconds(T1);
  digitalWrite(Vout, HIGH);
  delayMicroseconds(8.33);
  digitalWrite(Vout, LOW);
  
}

Esse código funciona direitinho, é basicamente um dimmer que fica aumentando a intensidade de uma lampada e diminuindo. O que quero fazer e transforma esse código para baixo nivel. Segue minha tentativa falha:

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

float POWER = 2.00;
float POWER2 = 2.00;
volatile float PWR = 0;

void config_uC(){

    DDRD &= ~(1<<PD2);
    PORTD |= (1<<PD2);

    DDRD |= (1<<PD6);
    PORTD &= ~(1<<PD6);

}

void config_interrupt(){

    cli();

    EICRA |= (1<<ISC00);
    EICRA |= (1<<ISC01);

    EIMSK |= (1<<INT0);

    sei();

}

ISR(INT0_vect){

  float T1 = 32.60*(255.00 - PWR);

  _delay_us(T1);
  PORTD |= (1<<PD6);
  _delay_us(8.33);
  PORTD &= ~(1<<PD6);

}

int main(void)
{

    config_uC();

    while(1){

         if(POWER<96){
            POWER = POWER + 1;
            PWR = POWER*255.00/100.00;
            if(POWER == 95){
              POWER2 = 95;
            }
          }
          if(POWER2>2){
            POWER2 = POWER2 - 1;
            PWR = POWER2*255.00/100.00;
            if(POWER2 == 2){
              POWER = 2;
            }
          }
          _delay_ms(150);

    }
}

Espero que alguém possa me ajudar, porque faz um tempo que estou tentando fazer isso.

  • Membro VIP
Postado

Que erro ou mensagem aparece? O que ocorre e o que deveria ocorrer? etc

Sinto que a função delay_us(8.33) pode estar esperando outro tipo de argumento que não seja float. Confira

  • Membro VIP
Postado

Tuuuúdo bem. No entanto, além do ctr-c ctrl-v,  o ideal mesmo é você entender como funciona um dimmer e como o mc pode atuar no disparo do triac pra controlar a potência. Assim sua chance de sucesso aumenta exponencialmente.

É relativamente simples: ao detectar a passagem pelo zero, o sistema espera um tempo predeterminado antes de enviar o pulso de disparo. Quanto você menos espera, mais luz vai te iluminar... (trocadilho sem graça de duplo sentido)

 

Postado

uhsauhushuashuashu @Isadora Ferrazeu não fiz ctrl-c ctrl-v, semestre passado eu tive que desenvolver um controle de potência AC em Arduíno dai fiz o código que mostrei acima, só que agora precisava desse código em AVR, tentei converter meio que diretão só que não deu boassssssssssssssssss. Por isso estou pedindo socorro aqui, porque para continuar o projeto tenho que controlar essa carga AC sem usar o bootload do arduino :( Agora estou em casa vou ficar mexendo nisso, se tiver resultado mando aqui kkk

 

Postado

@Isadora Ferraz Deu certo, o que estava errando alem do vetor de interrupção errado era o recuo antes da passagem de zero, estava muito próximo e por isso o circuito perdia o sincronismo. Segue o código:

 

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

#define F_CPU 16000000UL

float POWER = 10.00;
float POWER2 = 10.00;
volatile int PWR = 50;
volatile int T1 = 0;

void config_uC(){

    DDRB |= 0xFF;
    PORTB &= ~0xFF;

    DDRC &= ~0x03;
    PORTC |= 0x03;

    DDRD |= (1<<PD2);
    PORTD &= ~(1<<PD2);

}

void config_interrupt(){

    cli();

    EICRA |= (1<<ISC10);
    EICRA |= (1<<ISC11);

    EIMSK |= (1<<INT1);

    sei();

}

ISR(INT1_vect){

    _delay_us(T1);

    PORTD |= (1<<PD2);
    _delay_us(10);
    PORTD &= ~(1<<PD2);

}

int main(void)
{

    config_uC();
    config_interrupt();

    while(1){

        if(POWER<95){
            POWER = POWER + 1;
            PWR = POWER*255.00/100.00;
            if(POWER == 95){
                POWER2 = 95;
            }
        }
        if(POWER2>10){
            POWER2 = POWER2 - 1;
            PWR = POWER2*255.00/100.00;
            if(POWER2 == 10){
                POWER = 10;
            }
        }

        T1 = 32.60*(255.00 - PWR);

        _delay_ms(50);
    }

}

 

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!