logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[ATMEGA][C] Program z atm8 nie działa na atm16 - przerwania

timtheenchanter 28 Cze 2010 21:35 1631 6
REKLAMA
  • #1 8241496
    timtheenchanter
    Poziom 10  
    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:
    #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.
  • REKLAMA
  • #2 8241533
    gaskoin
    Poziom 38  
    a pokaż cały kod
  • REKLAMA
  • #3 8241649
    timtheenchanter
    Poziom 10  
    Nie ma na razie tego wiele więcej. Program do skomplikowanych nie należy.
    
    #define F_CPU 8000000
    #include <avr/io.h>
    #include <util/delay.h>
    #include <avr/interrupt.h>
    #include <avr/pgmspace.h>
    #include "funkcje.h"
    #include "LCD.h"
    
    volatile unsigned char sekundy;
    
    SIGNAL(SIG_OVERFLOW2)				// RTC, przerwanie co 1 sekunde
    {
    	sekundy++;						// zwieksz pomocniczy licznik sekund
    	if (sekundy==60)				//liczymy do 60 i zerujemy licznik
    		skeundy=0;
    }
    
    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     
                      
    asm volatile("SEI");	//  <---- W TYM MIEJSCU PROGRAM SIĘ RESETUJE
    	
    
    
    char text[3];
    for (;;)				//petla glowna
    {
    
    clear();
    itoa(sekundy,text,10);	//zamień liczbę sekund na string
    LCD_WriteText(text);	//wyświetl liczbę sekund na LCD
    mwait(100);				//odczekajmy 0.1 s
    
    
    }
        return (0);
    };
    
  • REKLAMA
  • #4 8241744
    tmf
    VIP Zasłużony dla elektroda
    A jesteś pewien, że właściwie ustawiłeś typ procesora?
    A BTW, czego się spodziewasz po "asm volatile("SEI");"?
    Powinno być "__asm__ __volatile__ ("sei" ::: "memory")". To oczyewiście nie jest przyczyna zawieszania się programu, ale na przysżłość pozwoli ci uniknąć paru problemów.
  • REKLAMA
  • #6 8243262
    timtheenchanter
    Poziom 10  
    tmf napisał:
    A jesteś pewien, że właściwie ustawiłeś typ procesora?


    Bingo!
    Wraz z programem dla Atmega8 przeniosłem plik makefile (używam avr-gcc pod ilnuksem),
    w którym wpisany był procesor atmega8 a nie atmega16.
    Wszystko działa tak jak chciałem, do pozostałych uwag również się zastosuję.
    Dziękuję za pomoc.
REKLAMA