Attiny2313A probuzeni z Power Down přes PCINT16

Mam problem s probuzenim z PD pres externi oreruseni z PCINT16. Neumim moc anglicky ale z datasheetu jsem vycetl ze, by to melo jit. Nevim co delam spatne. Nastavuju registry SREG, GIMSK, PCMSK2.

sei();
SREG = 0x80;
GIMSK |= (0x01 << INT0) & (0x01 << INT1) & (0x01 << PCIE2);
PCMSK2 |= (0x01 << PCINT17) & (0x01 << PCINT16);

Netusite nekdo kde by mohla byt chyba?

Do registru SREG není v C žádný důvod vrtat. Tudíž to nedělej(často ani není SREG definován). Pro globální povolení/zakázání přerušení slouží sei() a cli().
Mezi jednotlivými členy má být OR, nikoli AND.GIMSK |= (1<<PCIE2) | ...; PCMSK2 |= (1<<PCINT16); sei();Doplnit obsluhu přerušení(ikdyby byla prázdná) a nic víc by nemělo být třeba.
Přerušení se detekuje asynchronně, tudíž by buzení z PD fungovat opravdu mělo.

Tak jsem to opravil ale bohuzel to stale nejde. Obsluhu preruseni samozrejme mam.

ISR (PCINT2_vect)
{
vstan_PD();
GIMSK = 0x00; //Zakazani preruseni
PD_EN = 0;
delay_ms(500);
}

Jeste me napadlo, jak maji byt nastaveny porty? ja je mam jako vstup.

Jinak normalni preruseni z INT0 a 1 jde bez problemu.

Dej sem celej pokusnej program, ať víme, co za kouzla se tam schovává (např. ve vstan_PD()…).

Vecer to sem hodim ted musim zmizet zatim moc dekuju :slight_smile:

[code]#include <stdio.h>
#include <avr/io.h>
#define F_CPU 6000000
#include “delay.h”
#include <avr/pgmspace.h>
#include <avr/interrupt.h>

#define DC_L() (bit_is_clear(PIND,DCL))
#define DC_R() (bit_is_clear(PIND,DCR))

//****************************
//POJMENOVANI VSTUPU
//****************************

//PortD
#define IMP_OUT 0x00 // Vystupni impulz
#define ON_SW 0x02 // INT0
#define TEMP_ 0x03 // INT1
#define LED 0x04 // Ovladani LED
#define DCR 0x05 // INT1
#define DCL 0x06 // Ovladani LED

//Spi
void spi_PD(void)
{
MCUCR |= (1<<SE); //set bit //povoleni Power Down
MCUCR |= (1<<SM0); //set bit
MCUCR |= (1<<SM1); //set bit
GIMSK = 0xC0;
asm(“sleep”);
}

//Vstan
void vstan_PD(void)
{
MCUCR &= (~(1<<SE)); //clear bit vypnuti Power Down
MCUCR &= (~(1<<SM0)); //clear bit
MCUCR &= (~(1<<SM1)); //clear bit
}

//INT0
ISR (INT0_vect)
{
vstan_PD();
GIMSK = 0x00; //Zakazani preruseni
PORTD |= (1<<LED); //rozsviti LED
delay_ms(500);
PORTD &= (~(1<<LED)); //clear bit
}

//INT1
ISR (INT1_vect)
{
vstan_PD();
GIMSK = 0x00; //Zakazani preruseni
PORTD |= (1<<LED); //rozsviti LED
delay_ms(500);
PORTD &= (~(1<<LED)); //clear bit
}

ISR (PCINT2_vect)
{
vstan_PD();
GIMSK = 0x00; //Zakazani preruseni
PORTD |= (1<<LED); //rozsviti LED
delay_ms(500);
PORTD &= (~(1<<LED)); //clear bit
}

int main (void)
{
// Command PortB Bits
DDRB = 0xFF;
// Command PortD Bits
DDRD &= (~(1<<ON_SW)); //clear bit
DDRD &= (~(1<<TEMP_)); //clear bit
DDRD &= (~(1<<DCR)); //clear bit
DDRD &= (~(1<<DCL)); //clear bit
DDRD |= 0x01 << IMP_OUT; //vystup
DDRD |= 0x01 << LED; //vystup

// Po zapnuti zarizeni vypnuto
PORTB = 0xFF;		
PORTD = 0xFF;		
PORTD &= (~(1<<LED)); 		//zhasne LED nula
// Povoleni preruseni
GIMSK = ((1 << INT0) | (1 << INT1) | (1 << PCIE2)); 	
PCMSK2 = ((1 << PCINT17) | (1 << PCINT16));	//vystup 
sei();
// Nekonecna smycka
while(1)
{
	spi_PD();	// VSTUP DO POWER DOWN		
}

}
[/code]

Takze tady je ten zkusebni program.

Tak uz to asi vidim :smiley:

No jasne ze to uz funguje, tak se muzete pokochat jak jsem blbej:-D