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

Atmega128A-AU[C] nie wykonuje przerwania od timera1

Papillon11 19 Kwi 2012 22:21 2030 24
REKLAMA
  • #1 10813336
    Papillon11
    Poziom 10  
    Witam, męczę się już któryś dzień nad nową Atmegą128 i gdy nic nie znalazłem na forum co by mi pomogło postanowiłem zadać pytanie.

    Czemu ten uC nie wchodzi mi w przerwanie?

    Napisałem prosty program testowy, steruje on silnikiem krokowym, po określonej liczbie impulsów ma zmienić ICR1 co powoduje wzrost częstotliwości a zarazem prędkość obrotową, na atmega128 nie działa natomiast na atmega8 działa bez problemu.

    Dodam że kompatybilność z Atmega103 jest wyłączona.

    Zamieszczam kod:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    #include <avr/io.h>
    #include <stdbool.h>
    #include <stdio.h>
    #include <stdint.h>
    #include <math.h>
    #define F_CPU 8000000
    #include <util/delay.h>
    #include <avr/interrupt.h>

    volatile uint32_t a;

    ISR (TIMER1_COMPA_vect)
    {
    ++a;
    }
    ISR (BADISR_vect){}

    int main()
    {
    //------------------------------ Ustawienia I/O

    DDRB = 0xff; //Port B jako wyjście
    PORTB = 0x00;
    DDRC = 0x00; //Port C jako wejście
    PORTC = 0xff;

    //----------------------------- Ustawienia PWM

    TCCR1A |= (1<<COM1A1) | (1<<WGM11); //FastPWM, preskaler 1
    TCCR1B |= (1<<WGM13) | (1<<CS10) | (1<<WGM12);
    TIMSK |= (1<<OCIE1A);

    TCNT1 = 0x00;
    OCR1A=50;
    ICR1=800;

    sei();

    for(;;)
    {
    if(a>=150000)
    {
    ICR1=300;
    }
    }
    return 0;
    }
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #2 10813658
    Konto nie istnieje
    Poziom 1  
  • #3 10813694
    gaskoin
    Poziom 38  
    Jest taka sama

    A kompilując program zmieniłeś typ układu ?
  • #4 10815275
    Papillon11
    Poziom 10  
    Dzięki za zainteresowanie tematem.

    Nazwa przerwania jest prawidłowa sprawdzałem w dokumentacji a przy kompilacji i wgraniu programu do uC jest ustawiony właśnie ten uC.

    Nie mam już pomysłów na niego może faktycznie jest uszkodzony, tylko że dałem za niego 64zł bo wlutowany na płytkę, nie widzi mi się kupować następnego. Poza tym słyszałem że w ogóle praca z Atmega128 zmienia wszelkie dotychczasowe przyzwyczajenia.
  • REKLAMA
  • #6 10815520
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #7 10815734
    Papillon11
    Poziom 10  
    To że nie wchodzi w przerwanie stwierdzam po tym ja procek wykonuje testowy program. Ustawiłem mu odpowiednią wartość TOP dla licznika co odpowiada jakiejś tam częstotliwości, to zaś się przekłada na prędkość mojego silnika krokowego.
    Przy uruchomionym przerwaniu od tego właśnie licznika zmienna "a" się inkrementuje co każde wejście w przerwanie, odpowiada to ilości impulsów co się przekłada na dystans pokonany przez wózek napędzany wspomnianym silnikiem. Po osiągnięciu pewnej wartości przez zmienną "a" w if-ie zmieniamy prędkość obrotową na wyższą przez zmianę ICR1 - to zaś się nie dzieje. Zaś w ATmega8 działa i nie tylko to ale płyny rozruch i hamowanie tym silnikiem.
  • #8 10815800
    JarekC
    Poziom 32  
    OK. Przeoczyłem ta uwagę.

    Kod wydaje się byś poprawny.
    Jedynie dodałbym inicjalizację wartości początkowej zmiennej a.

    W symulatorze pod AVR Studio4 poprawnie wchodzi w przerwania.
    Spełnienie warunku
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    następuje po ok 15sek co jest zgodne z równaniem (150000*800) /8000000).

    Tylko czy chodziło o aż tak długi czas?

    Niestety teraz nie mam pod ręką ATMEGA128 aby sprawdzić to w rzeczywistym układzie.

    Pozdrawiam
    JarekC
  • REKLAMA
  • #9 10815965
    Papillon11
    Poziom 10  
    Ok sprawdzę z inicjalizacją zmiennej "a".

    A o czas mi nie chodzi, tylko dystans.

    (150000/6400)*2 = 46.875mm, oczywiście to tylko przykład
    6400-rozdzielczość silnika
    2-skok śruby napędowej

    Pozdrawiam
  • #11 10816151
    Papillon11
    Poziom 10  
    Już pisałem jak, 4 posty wyżej.

    Sprawdziłem z inicjalizacją zmiennej "a" - nic z tego, nie działa
  • #12 10816163
    gaskoin
    Poziom 38  
    Przecież napisał.

    Czy nadasz jej wartość czy nie program będzie działał tak samo. Zgodnie ze specyfikacją gcc wszystkie zmienne globalne i statyczne są inicjalizowane na 0 (wskażniki na null)
  • #13 10816241
    JarekC
    Poziom 32  
    Napisał, że program nie działa tak jak chce, ale nie napisał czy w jakikolwiek sposób sprawdził czy układ wykonuje obsługę przerwania. Choćby przez zapalenie LEDa.

    W podanym przykładzie zmiana częstotliwości nastąpi dopiero po 15 sekundach.
    Czy autor czeka tyle?
    A może fusa ma ustawionego na 1Mhz i zmiana nastąpi za 120 sekund?

    JarekC
  • #14 10816253
    Papillon11
    Poziom 10  
    Mikrokontroler był kupowany nowy wlutowany na płytkę. Na tej stronce było podane że był on wlutowywany ręcznie przez jakiegoś doświadczonego elektronika, chociaż nie widać żeby to człowiek lutował. Możliwe że mógł go przegrzać albo coś w tym rodzaju?
  • #15 10816261
    sulfur
    Poziom 24  
    A ja obstawiam, że program siedzi w przerwaniu i nie wykonuje w ogóle pętli głównej.
    Spróbuj zamienić miejscami, czyli zrób tak.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #16 10816336
    JarekC
    Poziom 32  
    Nic to nie zmieni.
    Przerwania są odblokowywane (sei) dopiero po pełnej inicjalizacji.
    Miałoby to znaczenie gdyby były odblokowane wcześniej.

    Wg. mnie autor szuka nie tam gdzie trzeba (lutowanie, przegrzewanie układu itp.)
    Natomiast nie odpowiada na postawione pytania więc nie jestem w stanie pomóc więcej.

    JarekC
  • #17 10816358
    sulfur
    Poziom 24  
    Zauważyłem to, jak już kliknąłem wyślij. Z tego co widzę, działamy na "sztucznym kodzie". Pozostały mi jednak dwie teorie. Mniej prawdopodobna mówi, że JTAG nie jest wyłączony. Bardziej prawdopodobna mówi, że to przerwanie nie jest wywoływane w trybie FastPWM. Polecam autorowi spróbować z przerwaniem od przepełnienia. Formalnie będzie to prawie to samo (małe przesunięcie momentu wywołania, interwał czasowy identyczny). Ja szukam potwierdzenia tej teorii w DS.
  • #18 10816635
    Papillon11
    Poziom 10  
    A więc:
    JarkaC obliczenia się zgadzają tyle trzeba było czekać 15s - tyle aż nie czekałem,
    faktycznie jednoznacznie nie można było stwierdzić czy wchodzi czy nie w przerwanie, więc powstawiałem instrukcje do zapalania LED przed if-em w if-ie i w przerwaniu, zmniejszyłem czas oczekiwania do 6.5s i zapala się tylko dioda przed if-em tzn że nie wchodzi w przerwanie ani w if-a.

    JTAG był faktycznie włączony, co on ma w ogóle do tego? Wyłączyłem go ale to nic nie zmieniło i co masz na myśli mówiąc "sztuczny kod"?

    Wgrałem ten kod przed chwilą do atmega8 i ładnie wszystko chodzi, zapalają się diody przed if-em i w przerwaniu i po ok7s w if-ie
  • #19 10816679
    Konto nie istnieje
    Poziom 1  
  • #20 10818060
    Slawek_K
    Poziom 12  
    Witam,

    Sprawdziłem program na rzeczywistym układzie, wszystko działa poprawnie. Program wchodzi w przerwanie. Testowałem z Atmega128 poprzez JTAG. Program miałem ustawiony na ATmega128 i ATmega128A. W obydwu przypadkach działa prawidłowo. Sprawdziłem również na oscyloskopie i na wyjściu PB5 jest generowany przebieg (najpierw około 10 kHz po około 15 sek około 27 kHz, zmienia się też wypełnienie). Problemu należy szukać w układzie, a nie w programie.

    pozdrawiam
  • #22 10819352
    Papillon11
    Poziom 10  
    Witam,

    Kupiłem dzisiaj Atmega16 i i dzieje się dokładnie to samo...
  • #23 10819420
    janbernat
    Poziom 38  
    To zrób "undo".
    Wgraj to na ATMega8.
    ATmega16 też ma JTAG-a i trzeba go wyłączyć jeśli z tego portu korzystasz.
  • #25 10841372
    Papillon11
    Poziom 10  
    Witam,

    Problem rozwiązany, przyczyną był nieskonfigurowany "Makefile", używam Programmers Notepad gdzie trzeba tam ręcznie wpisać jaki uC używamy...teraz już wiem.

    Dziękuję wszystkim za udział w dyskusji i za zainteresowanie!!!
    Pozdrawiam

    Temat zamknięty.
REKLAMA