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
globals.h
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
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