Witam,
próbowałem ostatnio przenieść mój program (wyłącznik czasowy) z Atmegi8 (działa idealnie) na Atmegę16 (gdyż ma więcej "nóżek"). Problem pojawił się przy pierwszym uruchomieniu - w miejscu, w którym uruchomione zostają przerwania program się resetuje. Zaznaczam od razu iż spędziłem wiele godzin szukając odpowiedzi w internecie, znalazłem nawet podobny problem opisany na forum elektrody, po skopiowaniu komend (niemal identycznych jak u mnie) nic się nie zmieniło. W pdf-ach dotyczących Atmegi8 i 16 znalazłem różnice tzw. wektorów przerwań, ale nie mam absolutnie żadnego pojęcia jak to sie ma do mojego problemu. Fusebity są ustawione poprawnie (tak samo jak w działającej atmedze8 - jedyna różnica to wyższa prędkość procesora). Obydwa układy mają ten sam kwarc zegarkowy 32768Hz. Oto powodujący problem fragment kodu z zaznaczoną komendą, której wykonanie skutkuje resetem:
Będę wdzięczny za wskazanie choćby kierunku, w którym kontynuować powinienem moje poszukiwania rozwiązania tego problemu. Pozdrawiam.
próbowałem ostatnio przenieść mój program (wyłącznik czasowy) z Atmegi8 (działa idealnie) na Atmegę16 (gdyż ma więcej "nóżek"). Problem pojawił się przy pierwszym uruchomieniu - w miejscu, w którym uruchomione zostają przerwania program się resetuje. Zaznaczam od razu iż spędziłem wiele godzin szukając odpowiedzi w internecie, znalazłem nawet podobny problem opisany na forum elektrody, po skopiowaniu komend (niemal identycznych jak u mnie) nic się nie zmieniło. W pdf-ach dotyczących Atmegi8 i 16 znalazłem różnice tzw. wektorów przerwań, ale nie mam absolutnie żadnego pojęcia jak to sie ma do mojego problemu. Fusebity są ustawione poprawnie (tak samo jak w działającej atmedze8 - jedyna różnica to wyższa prędkość procesora). Obydwa układy mają ten sam kwarc zegarkowy 32768Hz. Oto powodujący problem fragment kodu z zaznaczoną komendą, której wykonanie skutkuje resetem:
#define F_CPU 8000000
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include "funkcje.h"
volatile unsigned char sekundy;
SIGNAL(SIG_OVERFLOW2) // RTC, przerwanie co 1 sekunde
{
sekundy++; // zwieksz pomocniczy licznik sekund
}
int main (void)
{
mwait(1000); //odczekamy sekundę
TIMSK &=~((1<<TOIE2)|(1<<OCIE2)); // Disable TC2 interrupt
ASSR |= (1<<AS2); // set Timer/Counter2 to be asynchronous from the CPU clock with a 32,768kHz
TCNT2 = 0x00;
TCCR2 = 0x05; // prescale the timer to be clock source / 128 to make it
// exactly 1 second for every overflow to occur
while(ASSR&0x07); // Wait until TC2 is updated
TIMSK |= (1<<TOIE2); // set 8-bit Timer/Counter2 Overflow Interrupt Enable -- DO TEGO MIEJSCA PROGRAM DOCIERA< CZYLI KWARC DZIAŁA
asm volatile("SEI"); // <---- W TYM MIEJSCU PROGRAM SIĘ RESETUJE
Będę wdzięczny za wskazanie choćby kierunku, w którym kontynuować powinienem moje poszukiwania rozwiązania tego problemu. Pozdrawiam.