//
// Programado por LMDG
// Fecha: 14/04/2024
// Programa para que cambie de estado PC5 cada vez que exista
// una interrupción por INT0.
// Programa para realizar la conversión de una señal analógica por
// canal 0 del ADC. El resultado deberá mostrarse por puerto B
// y puerto D. Usa interrupción del ADC.
#ifndef F_CPU
#define F_CPU 16000000UL // 16 MHz clock speed
#endif
#include <avr/io.h>
#include <avr/interrupt.h>
unsigned char R0;
unsigned char R1;
int main () {
DDRB = DDRB | 0b00111111; // PB0 a PB5 como salida
DDRD = DDRD | 0b11110000; // PD4 A PD7 como salida
DDRC = DDRC & 0b11111110; // PC0 como entrada
DDRD = DDRD & 0b11111011; //pin 2 de PORTD como entrada.
DDRC = DDRC | 0b00100000; //pin 5 de PORTC como salida.
//DDRC = 1<<5; //PC5 as an output
PORTD = 1<<2; //pull-up activated
EIMSK = (1<<INT0); //enable external interrupt 0
EICRA = 0x02;
ADCSRA = 0x8E; // habilita ADC e interrupción, CK/128,
ADMUX = 0x60; // VCC Vref, ADC0, left-justified
ADCSRA|=(1<<ADSC); // Comienza la conversión
sei (); //enable interrupts
while (1); //wait here
}
ISR (INT0_vect) //ISR for external interrupt 0
{
PORTC ^= (1<<5); //toggle PORTC.5
}
ISR(ADC_vect){
PORTB = (ADCH>>2); // envia 6 bits MSB a PB (PB0 A PB5)
R0 = (ADCH & 0x03);
R0 = R0<<2;
R1 = ADCL;
R1 = R1>>6;
R0 = R0 | R1;
R0 = R0<<4;
PORTD = R0; // envía 4 bits LSB a PD (PD7 A PD4)
ADCSRA|=(1<<ADSC); // Comienza la conversión
}