Stránka 1 z 1

Sleep módy Atmegy8

Napsal: 12 kvě 2010, 07:56
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

Napsal: 12 kvě 2010, 13:14
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.

Napsal: 12 kvě 2010, 19:45
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í....

Napsal: 12 kvě 2010, 19:51
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.

Napsal: 12 kvě 2010, 20:09
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ěď :)

Napsal: 12 kvě 2010, 20:11
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

Napsal: 12 kvě 2010, 20:15
od caven
tak ho sem hoď teď

Napsal: 12 kvě 2010, 20:39
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';
   
   }

Napsal: 12 kvě 2010, 20:48
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.

Napsal: 12 kvě 2010, 20:58
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

Napsal: 13 kvě 2010, 22:39
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;)