logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[Atmega16][C/WinAVR] - INT2 vs POWERDOWN - nie działa

melersan 07 Maj 2009 15:50 1079 0
REKLAMA
  • #1 6502055
    melersan
    Poziom 11  
    Witam.

    Tym razem postanowiłem się pobawić trybem powerdown. Od początku natrafiłem na problem. Potrzebuję wywoływać przerwanie dla obu stanów, a wyjście z powerdown musi być sterowanie stanem wysokim.
    Na początku próbowałem na INT1 przez wyzwalanie dowolna zmianą stanu ISC10 = 1, ISC11=0, jednak nie działało, natomiast dla wyzwalania stanem niskim jak najbardziej się wybudzał.

    W datasheet wyczytałem, że INT2 potrafi również wybudzić Atmege, przy czym nie napisano czy tylko opadającym lub narastającym, więc doszedłem do wniosku że w obu przypadkach :). Postąpiłem tak jak zrozumiałem z datasheet przed zmianą typu wyzwalania przerwania i myślałem, że tym razem zadziała. No ale się pomyliłem:P Więc prośba do Was, może zauważycie co tu jest źle:)

    main.c
    #include "lcd.h"
    #include "keyboard.h"
    #include "globals.h"
    #include "pcf8583.h"
    #include "pin.h"
    #include "ds18b20.h"
    #include <avr/sleep.h>
    
    
    void main(void)
    {
    	//writePin();
    	LCD_ADD = 0xFF;	
    	LCD_PORT = 0xFF;
    	KEY_ADD = 0xF8;
    	KEY_PORT = 0x07;
    	PIN_INT0;
    	PIN_INT2;
    	
    	do
    	{
    		reset = 0;
    		STER_CLR; //odcina zapłon
    		
    		lcdInit();
    		i2cSet();
    		//confTemp();
    		INT_KEY_SET;
    		INT_IGNIT_SET_FALL;
    		
    		//INT_IGNIT_SET;
    		
    		sei();
    		
    		//resetPcf();
    		//pinLoop();
    		
    		lcdCommand(CLEAR);
    		do
    		{
    			dispClock();
    			dispCalendar();
    			lcdCommand(0xCB);
    			_delay_ms(10);
    			lcdString("T=25C");
    			//dispTemp();
    			//if(eepromRd(MIN_RESET_P) < readPcf(MIN_REG))
    			//{
    				//reset = 1;
    			//}
    		}while(!reset);
    		eepromWr(MIN_RESET_P,0xFF);
    		set_sleep_mode(SLEEP_MODE_PWR_DOWN);
    		sei();
    
    		sleep_mode();
    		reset=1;
    	}while(reset);
    }
    
    ISR(INT0_vect)
    {
    	keyCheck();
    	KEY_PORT = 0x0F;
    }
    
    ISR(INT2_vect)
    {	
    	if(bit_is_set(PINB,2))
    	{
    		eepromWr(MIN_RESET_P,0xFF);
    		INT_IGNIT_RESET;
    		INT_IGNIT_SET_FALL;
    		MCUCR &= ~_BV(SE);
    	}
    	else
    	{
    	reset = 1;
    		eepromWr(MIN_RESET_P,readPcf(MIN_REG));
    		INT_IGNIT_RESET;
    		INT_IGNIT_SET_RISE;
    	}
    	
    }
    


    globals.h
    
    #ifndef __GLOBALS_H__
    #define __GLOBALS_H__
    
    #include <avr/io.h>
    #include <avr/interrupt.h>
    
    #ifndef F_CPU
    #define F_CPU 16000000
    #endif
    
    
    /*********GLOBAL BEGIN**************/
    extern unsigned char sign; //variable for printing signs on LCD during operations.
    extern unsigned char button; //variable for giving information about pushing buttons.
    extern unsigned char error; //error=0 - wthout errors, error=1 - PIN error, error=2 - PIN change (if passed -> STER_SET).
    extern unsigned char reset; //reset=0 - engine works - don't reset, reset = 1 - reset.
    /*********GLOBAL END****************/
    
    /*********EEPROM ADDRESSES BEGIN****/
    //PIN:
    #define PIN_NUM_SIGN 0
    #define PIN_NUM_1 1
    #define PIN_NUM_2 2
    #define PIN_NUM_3 3
    #define PIN_NUM_4 4
    #define PIN_NUM_5 5
    #define PIN_NUM_6 6
    #define PIN_NUM_7 7
    #define PIN_NUM_8 8
    
    //YEAR:
    #define YEAR_P 10
    #define YEAR_NUM 11
    
    //RESET OPERATION:
    #define MIN_RESET_P 12
    /*********EEPROM ADRESSES END*******/
    
    /*********STER BEGIN****************/
    #define STER_SET DDRD |= _BV(7); PORTD |= _BV(7)
    #define STER_CLR DDRD |= _BV(7); PORTD &= ~_BV(7)
    /*********STER END******************/
    
    
    /*********INTERRUPTS BEGIN**********/
    #define PIN_INT0 DDRD &= ~_BV(PD2);PORTD &= ~_BV(PD2)
    //#define PIN_INT1 DDRD &= ~_BV(PD3);PORTD &= ~_BV(PD3)
    #define PIN_INT2 DDRB &= ~_BV(PB2);PORTD &= ~_BV(PB2)
    
    #define INT_KEY_SET MCUCR |= _BV(ISC01);MCUCR &= ~_BV(ISC00);GICR |= _BV(INT0) //fall
    //#define INT_IGNIT_SET MCUCR &= ~_BV(ISC11);MCUCR |= _BV(ISC10);GICR |= _BV(INT1) //changing
    #define INT_IGNIT_SET_FALL MCUCSR &= ~_BV(ISC2);GICR |= _BV(INT2) //fall
    #define INT_IGNIT_SET_RISE MCUCSR |= _BV(ISC2);GICR |= _BV(INT2) //rise
    #define INT_IGNIT_RESET GICR &= ~_BV(INT2);MCUCSR |= _BV(ISC2);GIFR |= _BV(INTF2)
    
    #define INT_KEY_CLR GICR &= ~_BV(INT0)
    #define INT_IGNIT_CLR GICR &= ~_BV(INT1)
    /*********INTERRUPTS END************/
    
    #endif
  • REKLAMA
REKLAMA