#include <util/delay.h>
#include <avr/interrupt.h>
#include <avr/io.h>
#define SetBit(valor,bit) (valor |= (1<<bit)) //1
#define ClrBit(valor,bit) (valor &= ~(1<<bit)) //0
#define toogleBit(valor,bit) (valor ^= (1<<bit))
#define testBit(valor,bit) (valor & (1<<bit))
#define L PORTD
#define M PD6
unsigned char tempo = 0;
int ad_conv();
void set(float valueD);
int duty;
int contador = 0;
int cont_pld = 1;
int contador2 = 1;
ISR (TIMER0_OVF_vect)
{
contador = contador + 1;
if(contador <= 4)
{
if(contador == 1){SetBit(L,M);}
if(contador == 2){ClrBit(L,M);}
if(contador == 3){SetBit(L,M);}
if(contador == 4){ClrBit(L,M);}
}
if(contador >= 5 && contador <= 108)
{
if(cont_pld == 1){SetBit(L,M);}
if(cont_pld > 1 && cont_pld <= 3){ClrBit(L,M);}
cont_pld = cont_pld + 1;
if(cont_pld > 3){cont_pld = 1;}
}
if(contador >= 109)
{
contador = 0;
contador2 = contador2 + 1;
if(contador2 > 2){contador2 = 1;}
cont_pld = 1;
}
}
int ad_conv()
{
static int analogH, analogL, analog; //variáveis locais para valores ADC
ADCSRA |= (1<<ADSC); //inicia conversão ad
while(!(ADCSRA&=~(1<<ADIF))); //aguarda conversão ad completar
ADCSRA |= (1<<ADIF); //limpa ADIF com transição LOW para HIGH
analogL = ADCL; //armazena o byte menos significativo sao 8 bits
analogH = ADCH; //armazena o byte mais significativo sao 8 bits
analog = (analogH<<8) | analogL; //calcula para valor de 10 bit
return analog; //retorna resultado da conversão
}
void set(float valueD)
{
valueD = valueD/100;
duty = valueD * 255;
OCR0A = duty;
}
int main(void)
{
//SetBit(DDRB,PB1);
SetBit(DDRD,M);
PORTD &= ~(1<<M);
sei();
TCCR0A=0b00000010;
TCCR0B=0x00;
TCCR0B |= (1<<CS00)|(1<<CS02);
TCNT0=0;
TIMSK0 |= (1<<TOIE0);
Serial.begin(9600);
ADCSRA = 0x93;
ADMUX = 0x43;
//cli();
while (1)
{
set(ad_conv()/10.23);
Serial.println(duty);
}
return (0);
}
Gostaria de saber onde esta o erro se alguem poder ajudar?
Qual IDE está usando?
O que deveria fazer?
O que faz?
Qual o erro?
oi usava o tinkercad online mas quando fui passar no proteus ou no arduino nao funcionou
Como assim não funciona? O que é que não faz? Que erro é que dá?
oi ele carrega td normal so nao sai o sinal no pino 6 mas se vc ver o serial e monitora o duty da p ver q o potencimetro ta funcionado convertendo td certo so a questao da interrupcao mas no tinkercad simulador funciona testa ai p vc ver me ajuda ai
Isto parece-me não estar a fazer muito... mas não é daqui que vem o problema.
Uma coisa que eu não estou a entender é como estás a pegar em 10 bits, divides por 100, multiplicas por 255 e esperas que caiba em 8??
valueD = valueD/100;
duty = valueD * 255;
Que valores vês aparecerem na variável duty? E que valores vias a sair do AD no tinkercad em comparação ao que tens agora?
Isto é uma coisa que pode estar a dar problemas.
No entanto, olhando ao teu código, o que estás a pretender fazer com o temporizador e o pino de saída do mesmo? Já viste como configuraste o timer? Explica exactamente o que pretendes aqui porque esse modo escreve no pino 6.
isso e um sinal para simular modulo de caminhao mercedes 36 +1
Quando pergunto o que pretendes fazer não é o objectivo final do projecto. Isso não me importa minimamente. É sim, o que pretendes fazer com o timer porque pela configuração não me faz sentido.
Copiaste isto de algum lado??
ok tem como me da um exemplo de como fazer o timer com variacao no potenciometro a parte do conv adc peguei do wr kits o resto fiz to aprendendo
Já descobriste o erro que não dava no tinkercad?
Já procuraste online??
Ainda não consegui já procurei
Queria um exemplo de timer0 controlado por um potenciômetro
RESOLVIDO
#include <avr/io.h>
#include <avr/interrupt.h>
#define SetBit(RES, BIT)(RES |= (1 << BIT)) // Por BIT em nível alto
#define ClrBit(RES, BIT)(RES &= ~(1 << BIT)) // Por BIT em nível baixo
#define TstBit(RES, BIT)(RES & (1 << BIT)) // testar BIT, retorna 0 ou 1
#define CplBit(RES, BIT)(RES ^= (1 << BIT)) // Inverter estado do BIT
#define L PORTD
#define M PD6
#define N DDRD
int ad_conv(); //função para conversão AD
void setDuty_pin03(float valueD); //Seleciona o duty cycle na saída digital 3
int contador = 0;
int cont_pld = 1;
int contador2 = 1;
int duty;
ISR(TIMER0_COMPA_vect)
{
contador = contador + 1;
if(contador <= 4)
{
if(contador == 1){SetBit(L,M);}
if(contador == 2){ClrBit(L,M);}
if(contador == 3){SetBit(L,M);}
if(contador == 4){ClrBit(L,M);}
}
if(contador >= 5 && contador <= 108)
{
if(cont_pld == 1){SetBit(L,M);}
if(cont_pld > 1 && cont_pld <= 3){ClrBit(L,M);}
cont_pld = cont_pld + 1;
if(cont_pld > 3){cont_pld = 1;}
}
if(contador >= 109)
{
contador = 0;
contador2 = contador2 + 1;
if(contador2 > 2){contador2 = 1;}
cont_pld = 1;
}
}
int ad_conv()
{
static int analogH, analogL, analog; //variáveis locais para valores ADC
ADCSRA |= (1<<ADSC); //inicia conversão ad
while(!(ADCSRA&=~(1<<ADIF))); //aguarda conversão ad completar
ADCSRA |= (1<<ADIF); //limpa ADIF com transição LOW para HIGH
analogL = ADCL; //armazena o byte menos significativo sao 8 bits
analogH = ADCH; //armazena o byte mais significativo sao 8 bits
analog = (analogH<<8) | analogL; //calcula para valor de 10 bit
return analog;
}
void setDuty_pin03(float valueD)
{
valueD = valueD/100;
duty = valueD * 255;
OCR0A = duty;
}
int main(){
sei(); //interrupcao global
N |= (1<<M) ; // 1 = OUT NO PINO
L &= ~(1<<M); //0 NO PINO 0
OCR0A = 250;
//OCR0B = 0;
TCCR0A =0b00000010;
// TCCR0B |= (1<<CS00)|(1<<CS02);
TCCR0B = 0b00000100;
TIMSK0 = 0b00000010;
ADCSRA = 0x93; //liga conversão AD, fator de divisão de 8
ADMUX = 0b01000011;
// ADCSRB |= (1<<MUX5); //tensão de ref. de 5V, canal A3 0100 ADC03 ->0011
//cli(); // DESABILITA A INTERRUPCAO GLOBAL
Serial.begin(9600);
while(1){
setDuty_pin03(ad_conv()/10.23);
//Serial.println(ADCL,BIN);
// Serial.println(TCNT0);
Serial.println(duty,BIN);
}
return 0; }
This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.