Menú
Foros
Nuevos mensajes
Buscar en foros
Novedades
Nuevos mensajes
Nuevos recursos
Última actividad
Recursos
Últimas revisiones
Buscar recursos
Acceder
Registrarse
Novedades
Buscar
Buscar
Buscar sólo en títulos
De:
Nuevos mensajes
Buscar en foros
Menú
Acceder
Registrarse
Install the app
Instalar
Foros
Diseño digital
Microcontroladores y sistemas embebidos
Problemas con las interrupciones de mi AVR ATmega2056
JavaScript está desactivado. Para una mejor experiencia, por favor, activa JavaScript en el navegador antes de continuar.
Estás usando un navegador obsoleto. No se pueden mostrar este u otros sitios web correctamente.
Se debe actualizar o usar un
navegador alternativo
.
Responder al tema
Mensaje
[QUOTE="EduardoVT, post: 1247888, member: 486013"] Hola a todos. Tengo un problema y necesito ayuda con un programa que estoy haciendo en donde manejo de instrucciones externas. Compila correctamente y al momento de simularlo en Proteus trabaja tal como lo programé, pero al momento de descargarlo en mi ATMega2056 se muestra una interrupción pero no ejecuta las tareas dentro de ésta. Principalmente lo que hace el programa es encender y apagar un led mientras no se presente alguna interrupción. En el momento que se presenta la interrupción INT0 comenzará a incrementarse la intensidad de iluminación de otro led a través de un PWM y en el momento que se presenta la interrupción INT1 se decrementa la intensidad de iluminación del mismo led. El programador que estoy utilizando es el USBasp y el microcontrolador es el que está montado en una tarjeta Arduino Mega la cual fue borrada para poder trabajar sobre Atmel Studio en C. Dejo el código de mi programa: [CODE=c]/* * Dolly_project.c * * Created: 25/10/2018 11:51:02 a. m. * Author : Eduardo-WCM */ //#ifndef F_CPU #define F_CPU 16000000UL // set the CPU clock //#endif #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> #define Max_Level 255 volatile char brightness = 0; void PWM_UP() { while((PIND&0x01)==0x01 && brightness < 250) { brightness += 10; OCR3A = brightness; OCR3B = brightness; _delay_ms(50); } } void PWM_DOWN() { while ((PIND&0x02)==0x02 && brightness>=30) { brightness -= 10; OCR3A = brightness; OCR3B = brightness; _delay_ms(50); } } ISR (INT0_vect) { PORTA = (1<<PINA4)|(1<<PINA5)|(1<<PINA6); EIFR |= (1<<INTF0); PWM_UP(); EIFR &=~ (1<<INTF0); } ISR (INT1_vect) { EIFR |= (1<<INTF1); PWM_DOWN(); EIFR &=~ (1<<INTF1); } // initialize PWM void Config() { //---------------------- INTERRUPTS --------------------------------- // cli(); //Disable interrupts EICRA |= (1<<ISC11)|(1<<ISC10)|(1<<ISC01)|(1<<ISC00); // Interrupts are activated in rising edge PCICR |= (1<<PCIE0); EIMSK |= (1<<INT0)|(1<<INT1); // Enable Int1 and Int0 sei(); //Enable Interrupts //----------------------- PWM --------------------------------------- // initialize timer0 in PWM mode // Waveform Generation Mode: Phase correct PW Mode, 8-bit, TOP = 0x00FF, Update OCR3x at BOTTOM, TOV3 Flag Set on TOP TCCR3A |= (1<<WGM30); // Compare Output Mode: Phase correct PWM, non-inverting mode, A, B and C Registers are activated TCCR3A |= (1<<COM3A1)|(1<<COM3B1)|(1<<COM3C1); // Clock Select: clk/64 => CS32|CS31|CS30 = 0|1|1 */ TCCR3B |= (0<<CS32)|(1<<CS31)|(1<<CS30); // Set Timer3 pins as output : Channel A :(PE3/OC3A/AIN1) Channel B :(PE4/OC3B/INT4) Channel C :(PE5/OC3C/INT5) DDRE |= (1<<DDE3)|(1<<DDE4)|(1<<DDE5); DDRA = 0xFF; DDRB = 0xFF; DDRC = 0xFF; DDRD = 0xF0; _delay_ms(10); } int main(void) { Config(); OCR3A = brightness; OCR3B = brightness; while(1) { PORTA |= (1<<PINA0); _delay_ms(50); PORTA &=~ (1<<PINA0); _delay_ms(50); } return 0; }[/CODE] [/QUOTE]
Verificación
Responder
Foros
Diseño digital
Microcontroladores y sistemas embebidos
Problemas con las interrupciones de mi AVR ATmega2056
Arriba