Olá,
Precisava de medir a constante de tempo de um circuito RC mas ia utilizar apenas pinos digitais de um atmega328p.
Eu precisava de saber ao certo quando é que o atmega define um pino como 1 ou 0. Segundo a datasheet ele necessita no mínimo de 0.6*Vcc para ser considerar high e no máximo 0.3Vcc para ser low.
No entanto estou a medir 2.24V como a tensão a que ele muda de estado... A minha questão é se alguém com mais experiência acha que posso considerar que vai ser sempre este valor para esta alimentação, se isto vai mudar quando desligar e volta a ligar, ou outra coisa qualquer... Acham que posso considerar esta tensão para os cálculos da constante de tempo?
Defini uma interrupção de Falling Edge no int0 e lá mudo o valor de um bit que depois analiso no osciloscópio juntamente com o sinal que é utilizado para gerar a interrupção.
laranja - pino pb2 que vai carregar o condensador.
azul - tensão no condensador
lilás - pb1 só como debug
O sinal azul é o que é usado no INT0.
#define F_CPU 16000000 // AVR clock frequency in Hz, used by util/delay.h
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
ISR(INT0_vect){
PORTB |= (1<<PB1);
}
int main() {
DDRD |= (1<<DDD1); // set LED pin PD1 to output
DDRB |= (1<<PB2);//sinal
DDRB |= (1<<PB1);//debug
DDRB &= ~(1<<PB0);//ler entrada
PORTB |= (1<<PB2);
PORTB &= ~(1<<PB1);
uint16_t i=0;
EICRA = 0b00000010;
EIMSK = 0b00000001;
sei();
while (1) {
PORTB |= (1<<PORTB2); // drive PB2 high
PORTB &= ~(1<<PB1);
_delay_ms(3000); // delay 3000 ms
PORTB &= ~(1<<PORTB2); // drive PB2 low
_delay_ms(1);
}
}