Sleep módy Atmegy8

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Odpovědět
Zpráva
Autor
Uživatelský avatar
marli
Příspěvky: 173
Registrován: 15 bře 2007, 01:00

Sleep módy Atmegy8

#1 Příspěvek od marli »

Ahoj, potřeboval bych radu od někoho kdo má zkušenosti s ATmegou8 a jejími sleep módy. Potřeboval bych ATmegu vždy na 2 sekundy uspat, pak probudit, udělat nějakou operaci- například odeslat číslo UARTem, udělat jeden AD převod... a zase uspat. Podle datasheetu lze probouzet z Power-safe-mode událostí od Timer/counter2 pokud je clockován asynchronně... Ten Timer2 je ale pouze 8 bitový, takže nevím jak udělat tak dlouhou pauzu- mám k dispozici vnější krystal 16MHz... děkuju za reakce Milan

Uživatelský avatar
caven
Příspěvky: 417
Registrován: 15 srp 2006, 02:00

#2 Příspěvek od caven »

no pokud si myslím jak to je, může to být i špatně, ale na asynchronní zdroj ten timer může běžet jenom na hodinkový krystal ? Čili na 16MHz ti to nepoběží ;) a hlavně to má ještě předděličku 1:1024.

v datasheetu je napsáno : The Oscillator is optimized for use with a 32.768 kHz watch crystal. Applying an external
clock to the TOSC1 pin may result in incorrect Timer/Counter2 operation. The CPU main
clock frequency must be more than four times the Oscillator frequency.

Uživatelský avatar
marli
Příspěvky: 173
Registrován: 15 bře 2007, 01:00

#3 Příspěvek od marli »

Ahoj, děkuju za odpověď. Dneska jsem přes den pořádně prostudoval datasheet a přečetl jsem si přesně to co jsi psal... Takže jsem v AVR studiu nastavil fuses na interní 8MHz oscilátor a na vstup Atmegy jsem připojil ten hodinkovej. Po zkouknutí osciloskopem kmitá jak má. Ale stejně se mi nepodařilo Atmegu vzbudit...(AS2 v ASSR mám nastavený, interrupty povolený taky) Musím zítra zkusit v přerušení zkusit hýbat hodnotou na pinu a kouknout na to osciloskopem... jinak nevím kde je chyba.
Ještě jak jsi psal o té předděličce- jestli jsem dobře pochopil datasheet tak ta se při asynchronním módu toho Timeru2 neuplatní....

Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 02:00

#4 Příspěvek od Andrea »

marli píše:Ještě jak jsi psal o té předděličce- jestli jsem dobře pochopil datasheet tak ta se při asynchronním módu toho Timeru2 neuplatní....
Ale uplatní, dá se generovat přerušení s periodou až 8s.

Uživatelský avatar
marli
Příspěvky: 173
Registrován: 15 bře 2007, 01:00

#5 Příspěvek od marli »

Opravdu? Tak to musím pročíst ještě jednou a zítra vyzkoušet... Docela by se mi to hodilo. Ale pořád nevím proč mi dnes nešla vzbudit z pover-safe-modu... jestli to nerozchodím zkusím sem zítra hodit kód který tam nahrávám. Děkuji za odpověď :)

Uživatelský avatar
caven
Příspěvky: 417
Registrován: 15 srp 2006, 02:00

#6 Příspěvek od caven »

ale jo jak píše Andrea

máš zroj 32768Hz to když vydělíš 1024 tak ti vyjde 32Hz a poté když 256 což je max hodnota timeru 2 vydělíš těmi 32 tak ti vyjde 8s

Uživatelský avatar
caven
Příspěvky: 417
Registrován: 15 srp 2006, 02:00

#7 Příspěvek od caven »

tak ho sem hoď teď

Uživatelský avatar
marli
Příspěvky: 173
Registrován: 15 bře 2007, 01:00

#8 Příspěvek od marli »

Tady je ten kód. Jak jsem říkal, mám nastaveno na 8 MHz interní oscilátor a na svorkách pro krystal mám hodinkovej krystal... mega se neprobudí...

Kód: Vybrat vše

#include <stdlib.h>
#include <avr/io.h>
#include <stdio.h>
#include <avr/interrupt.h> 
#include <avr/sleep.h>
#define F_CPU 8000000	//definovana rychlost taktu pro knihovnu "delay.h", interni RC
#include <util/delay.h> 
#define USART_BAUDRATE 9600 
#define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1) 


void main(void)

{




UCSRB |= (1 << RXEN) | (1 << TXEN);       
UCSRC |= (1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1);    

UBRRL = BAUD_PRESCALE;        
UBRRH = (BAUD_PRESCALE >> 8);      


ASSR = (1 << AS2);


//TCCR2 |= ((1 << CS22) | (1 << CS21) | (1 << CS20)); //zakomentovana preddelicka  1024
  
TIMSK |= (1 << TOIE2);  
TCCR2 |= (1 << CS10);
MCUCR |= (1<<SE)|(1<<SM1)|(1<<SM0); 	// Povoleni sleep modu (power safe mod
sei();

while(1)
{
    
        asm("sleep");                         
		_delay_ms(200);

}
}


ISR(TIMER2_OVF_vect) 
   {                
  
	_delay_ms(200);
	UDR = '0x55';
    
   }

Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 02:00

#9 Příspěvek od Andrea »

When entering Power-save mode after having written to TCNT2, OCR2, or TCCR2, the user must wait until the written register has been updated if Timer/Counter2 is used to wake up the device. Otherwise, the MCU will enter sleep mode before the changes are effective. This is particularly important if the Output Compare2 interrupt is used to wake up the device, since the Output Compare function is disabled during writing to OCR2 or TCNT2. If the write cycle is not finished, and the MCU enters sleep mode before the OCR2UB bit returns to zero, the device will never receive a Compare Match interrupt, and the MCU will not wake up.

Uživatelský avatar
marli
Příspěvky: 173
Registrován: 15 bře 2007, 01:00

#10 Příspěvek od marli »

Děkuju :oops:... nejspíš se mi tedy nezapíše žádná hodnota do TCCR2, což je dle datasheetu Timer/Counter stopped... Zítra zkusím v hardware... zatím Milan

Uživatelský avatar
marli
Příspěvky: 173
Registrován: 15 bře 2007, 01:00

#11 Příspěvek od marli »

Tak jsem to dnes odzkoušel a vše funguje jak má, stačilo doplnit do kódu patřičné zpoždění. Děkuji za rady;)

Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“