Elektroda.pl
Elektroda.pl
X
Arrow Multisolution Day
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Atmega8 Bascom - Nie działa obsługa timera gfdzie jest błąd

mleczarz 04 Lis 2013 17:53 2190 16
  • #1 04 Lis 2013 17:53
    mleczarz
    Poziom 15  

    Jak w temacie nie mogę poradzić sobie z obsługą timer0 ciągle coś nie tak a kontrola składni nie wyrzuca mi żadnych błędów i na ile sprawdzam kod wszystko powinno być ok. Program załączony to prosty zegar gdzie dodatkowo generuje sygnał 125kHz dalej do obsługi PWM (ta procedura jeszcze nie dopisana).

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    0 16
  • Arrow Multisolution Day
  • #2 04 Lis 2013 19:55
    Mateusz@
    Poziom 17  

    A co jest nie tak? Możesz opisać dokładniej problem.

    Load Timer0 , 1

    Po tej komendzie licznik przepełni się po jednym cyklu. Czy na pewno to ma Tylko jeden cykl?

    Ciągle jest wykonywane przerwanie i dlatego procesor nie ma czasu na resztę operacji.

    0
  • Arrow Multisolution Day
  • #3 04 Lis 2013 20:13
    mleczarz
    Poziom 15  

    Tak co jeden cykl. Prescale jest 64 wiec nie tu chyba problem. Nic sie nie dzieje na wyswietlaczu a w symulatorze tez nie pokazuje zmian zmiennych.

    0
  • #4 04 Lis 2013 20:34
    Mateusz@
    Poziom 17  

    To zobacz w symulatorze ile czasu jest w przerwaniu a ile w pętli głównej. Podaj w procentach (tak mniej więcej) ile czasu program jest w pętli głównej. Po prostu nie ma czasu coś innego robić. Myślisz że przez 64 cykli jest coś wstanie zrobić (jest ale bardzo niewiele) dodaj jeszcze cykle na wyjście z przerwania.

    Np. ta linia
    Lcd "0" ; G ; ":"
    trwa 3642 cykle zegara (według symulatora)

    0
  • Pomocny post
    #5 05 Lis 2013 08:13
    emarcus
    Poziom 35  

    mleczarz napisał:
    Tak co jeden cykl. Prescale jest 64 wiec nie tu chyba problem. Nic sie nie dzieje na wyswietlaczu a w symulatorze tez nie pokazuje zmian zmiennych.

    To nie jest jeden cykl, ani też 64 jakby wynikało z podziału prescalera.
    Wszystko można odczytac w symulatorze, tylko musisz potrafic posługiwac się jego ustawieniami i funkcjami.
    Poniżej masz przykład jego możliwości dla twojego programu.

    Atmega8 Bascom - Nie działa obsługa timera gfdzie jest błąd

    Skonfiguruj swój symulator podobnie jak na obrazku; to znaczy w żółtym polu 'Variables' możesz wybrac dowolne zmienne lub rejestry, które chcesz obserwowac.
    W tym momencie interesuje nas Timer0 i TIFR, oraz ewentualnie możesz dodac SREG (Status Register) i opcjonalnie jakąś dowolnie wybraną zmienną/zmienne, które w perwszej kolejności mogą byc zmieniane przez program.
    Uruchomienie symulatora:
    Zamiast naciskac na pierwszy przycisk Run(F5) naciskaj raczej na F8-> przycisk zaznaczony strzałką 1 i obserwuj za każdym razem zmiany w polach zaznaczonych strzłkami z numerami. Za każdym naciśnięciem F8; turqusowa strzałka symulatora winna przesuwac się do następnej aktywnej linii/instrukcji programu.
    Rób to dopóki w rejestrze TIFR pokaże się wartośc 1 (strzałka 2) oznacza to że został wywołany interrupt "ovf0" (bit zerowy w tym rejestrze). Zwróc uwagę że jednocześnie zmienił się bit 7 (-na 0) w rejestrze SREG co oznacza że wszystkie interrupty zostały tymczasowo 'zawieszone' (disabled), -strzałka 2a.
    Odszukaj w dolnym pasku (strzałka 3), pole "Cycl=xxxxx"- jest to ilośc cykli (taktów) zegara od czasu startu symulacji. Prawym przyciskiem myszy możesz go w każdej chwili wyzerowac. Zrób top teraz. Klikając F8 dalej możesz obserwowac ile cykli zegarowych "kosztuje" każda instrukcja. Zwróc uwagę także że w momencie wywołania interruptu nie następuje natychmiastowy skok do instrukcji :
    "Load Timer0 , 1", ale zabiera to dośc dużo czasu - obserwuj licznik "Cycl=xx" (potrenuj z zerowaniem jego stanu). Czas ten jest zużyty na obsługę stosu.
    Obserwuj zmiany wpisów w oknie "Memory" - jego dolna częśc (loc. 0440, 0450) zawiera obszar stosu.
    Wyzeruj licznik cykli przy linii/instrukcji "Load Timer0 , 1" , która wpisuje 255 do timera0. W tej sytuacji kolejny interrupt spodziewany jest po 64 cyklach.(?)
    Czy tak faktycznie to nastąpi....? To nie jest błąd symulatora!!!!!
    Sprawdź co processor jest w stanie wykonac w ramach "wolnego czasu" przed wywołaniem następnego interruptu. Klikaj F8 (strzałka 1).
    Również zwróc uwagę że przy wyjściu z interruptu "Return" następują odpowiednie zmiany bitów w Rejestrach TIFR i SREG.
    Wnioski wyciągniesz sam.

    e marcus

    0
  • #6 05 Lis 2013 12:36
    mleczarz
    Poziom 15  

    Zmieniłem wartość Load Timer na 100 i dalej program idzie w "krzaki" chyba zacznę generować sygnał dla samego zegara a ten PWM daruje.

    0
  • #7 05 Lis 2013 12:51
    Mateusz@
    Poziom 17  

    Co to znaczy idzie w "krzaki"? Co jest nie tak? Dlaczego nie korzystasz ze sprzętowego PWMa?

    0
  • #8 05 Lis 2013 13:31
    mleczarz
    Poziom 15  

    Mimo moich usilnych prób dalej nie wyświetla nic na LCD, zupełnie nic. Jak będzie tak dalej szło to dam zewnętrzny generator 1kHz na sygnał przerwania i zobaczę co się stanie dalej. Liczyłem na to że uda mi się wycisnąć przy zegarze 8MHz ten sygnał 125khz do generowania PWM 1,25khz. Połowy procedur jeszcze nie ma w programie a tu już za mało ma czasu mikrokontroler.

    0
  • Pomocny post
    #9 05 Lis 2013 13:52
    Mateusz@
    Poziom 17  

    Program wyświetla to co chcesz ale w symulatorze to trwa bardzo bardzo długo. i Teraz ja licznik odlicza 100 impulsów to musisz pozmieniać obliczenia. Podczas symulacji w warunkach wpisz mniejsze wartości to się szybciej doczekasz tego wyświetlenia na lcd albo zwiększ zmienne ręcznie podczas symulacji.

    mleczarz napisał:
    sygnał 125khz do generowania PWM 1,25khz.

    Nie rozumiem? To jaką częstotliwość chcesz uzyskać?

    Dlaczego nie korzystasz ze sprzętowego PWMa?

    0
  • #10 05 Lis 2013 13:58
    emarcus
    Poziom 35  

    mleczarz napisał:
    Mimo moich usilnych prób dalej nie wyświetla nic na LCD, zupełnie nic.


    Nawet go nie ma wcale, (!) - to jak chcesasz coś na nim widzec?

    e marcus

    0
  • #11 05 Lis 2013 14:09
    Mateusz@
    Poziom 17  

    Kolego e marcus chodzi Ci o to że nie jest skonfigurowany LCD?
    W ustawieniach bascoma może być skonfigurowany. Mam nadzieje że autor tematu o tym wie.

    0
  • #12 05 Lis 2013 14:10
    mleczarz
    Poziom 15  

    Zmieniłem ustawienie Timer0 na Load 100, wywaliłem 1 zmienną Pwm_main bo liczyła do 100, LCD i jego obsługa jest w programie: podprogram zegar wywoływany co 1s po "przepełnieniu" zmiennej 5Hz. Programowałem Atmegę i dlatego wiem że program idzie "w krzaki" na samym symulatorze się nie opieram.

    0
  • #13 05 Lis 2013 14:17
    Mateusz@
    Poziom 17  

    Czy program w symulatorze działa tak samo jak na atmedze?
    A Ty znowu z tymi "krzakami", powiedz co dokładnie Ci nie zgadza się w działaniu programu.

    Wstaw cały kod.

    0
  • #14 05 Lis 2013 22:23
    emarcus
    Poziom 35  

    Mateusz@ napisał:
    Kolego e marcus chodzi Ci o to że nie jest skonfigurowany LCD?
    W ustawieniach bascoma może być skonfigurowany. Mam nadzieje że autor tematu o tym wie.


    To nie wystarcza !!!
    Jeszcze dodatkowo należy w programie sprecyzowac "CO i KIEDY" ma byc wyswietlone; czy to ma byc text czy jakaś wartośc zmiennej lub ich kombinacja, tak aby ta informacja była komunikatywna zgodnie z przewidywaniami i wymogami programisty.
    Jeżeli w programie brakuje jakiejkolwiek instrukcji dla wyswietlacza to defaultowe ustawienia LCD w IDE nie znaczą nic(!); są zwyczajnie pomijane podczas kompilacji.
    Finałowy kode nie zawiera obsługi LCD.

    e marcus

    0
  • #15 05 Lis 2013 22:49
    Mateusz@
    Poziom 17  

    O tym nie wspominałem bo przecież jest to oczywiste. Autor tematu miał przecież w kodzie co chce wyświetlać i kiedy.

    0
  • #16 06 Lis 2013 01:15
    emarcus
    Poziom 35  

    Mateusz@ napisał:

    Autor tematu miał przecież w kodzie co chce wyświetlać i kiedy.

    Tak, to prawda...
    Akurat w mojej kopji listingu podczas 'Copy -> Paste' zaginęła ostatnia etykieta "Zegar" - z tego powodu były moje uwagi,

    0
  • #17 06 Lis 2013 07:50
    mleczarz
    Poziom 15  

    Problem rozwiązałem już w inny sposób. Generuje z Timer0 przerwanie co 4ms (prescale 256 i load timer),150). Zegar działa po zaprogramowaniu procesora a symulator jak to symulator (ja go nie ogarniam lub mnie po prostu nie lubi). Co do wyświetlania na LCD musiałem poprawić jego obsługę gdyż same nie wyświetlał powyżej 10 pomogło dopisanie procedury else do instrukcji warunkowych. Temat zamykam.

    0