Stworzyłem coś takiego:
Kod: Zaznacz cały
#include <avr/io.h> // dostęp do rejestrów
#include <avr/wdt.h> // obsługa układu Watchdog
#include <avr/sleep.h>
// Define baud rate
#define USART_BAUD 1200
#define USART_UBBR_VALUE (((F_CPU / (USART_BAUD * 16UL))) - 1)
void USART_Init(unsigned int baud)
{
/* Set baud rate */
UBRRH=(unsigned char)(baud>>8);
UBRRL=(unsigned char)baud;
/* Enable receiver and transmitter */
UCSRB=(1<<RXEN)|(1<<TXEN);
/* Set frame format: 8data, 2stop bit */
UCSRC=(1<<USBS)|(3<<UCSZ0);
}
void USART_Transmit(unsigned char data)
{
/* Wait for empty transmit buffer */
while (!( UCSRA & (1<<UDRE)));
/* Put data into buffer, sends the data */
UDR = data;
}
unsigned char USART_Receive(void)
{
/* Wait for data to be received */
while (!(UCSRA & (1<<RXC)));
/* Get and return received data from buffer */
return UDR;
}
void USART_TxString(const char StringPtr[])
{
while (*StringPtr != 0x00)
{
USART_Transmit(*StringPtr);
StringPtr++;
}
}
int main(void)
{
USART_Init(USART_UBBR_VALUE); // inicjalizacja portu szeregowego
USART_TxString("Start programu !!!\r");
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
wdt_enable(WDTO_2S); // watchdog na czas ok 2s
// wdt_enable(WDTO_1S); // watchdog na czas ok 1s
// wdt_enable(WDTO_500MS); // watchdog na czas ok 0,5s
// wdt_enable(WDTO_250MS); // watchdog na czas ok 0,25s
// wdt_enable(WDTO_120MS); // watchdog na czas ok 0,12s
// wdt_enable(WDTO_60MS); // watchdog na czas ok 0,06s
// wdt_enable(WDTO_30MS); // watchdog na czas ok 0,03s
// wdt_enable(WDTO_15MS); // watchdog na czas ok 0,015s
sleep_enable();
sleep_mode();
return 0;
}