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

[Bascom][ATmega1281] Jak obsłużyć Timer4

LiutenetMaria 12 Lip 2012 13:40 1684 18
  • #1 12 Lip 2012 13:40
    LiutenetMaria
    Poziom 28  

    Witam,
    przeszedłem z ze 128 na 1281 (oba pod bascomem) i mam dwa problemy:
    1) Używam Ekranu Dotykowego, 4 przewodowego podłączonego do portu ADC.
    I ekran dotykowy działa do kilku dotknięć a później przestaje. Czy należy w Programie jeszcze coś zmienić?
    2) Zmieniłem Timer2 ze 128 na Timer4 w 1281.

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Czy dobrze obsługuje Timer4? Jest to zdaje się tryb CTC, ale gdzieś wyczytałem, że w Bascomie nie da się ustawić tryby CTC za pomocą wbudowanych "słów" typu config..

    0 18
  • #2 13 Lip 2012 21:01
    LiutenetMaria
    Poziom 28  

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Zrobiłem taki program i w symulacji nie chodzi. Nie zwiększa się wartość rejestru TCNT4. Gdy zrobiłem to dla Timera1 działa tak jak chce.

    Dodano po 2 [godziny] 54 [minuty]:

    Nie wiem czy ja popełniam błąd czy to Bascom...
    Choć symuluję to na najnowszej wersji, ale kompiluje na starszej wersji, bo nowa ma ograniczenie do 4kb.

    0
  • #3 14 Lip 2012 07:20
    MArSTER_1
    Poziom 18  

    Możesz zamieścić ten fragment kodu, który działa z Timerem1? I dlaczego stosujesz tryb Timer4 Compare Match A?

    0
  • #4 16 Lip 2012 08:12
    LiutenetMaria
    Poziom 28  

    MArSTER_1 napisał:
    Możesz zamieścić ten fragment kodu, który działa z Timerem1? I dlaczego stosujesz tryb Timer4 Compare Match A?

    Timera1 w 128 używam do PWM-u.

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Zaś dla testu napisałem na 1281 to i działa świetnie. Zaś z Timer1 i Timer4 mi nie wychodzi..

    0
  • #5 16 Lip 2012 12:40
    MArSTER_1
    Poziom 18  

    W podprogramie obsługi przerwania Timer4 brak ci instrukcji end if.

    0
  • #6 16 Lip 2012 13:35
    LiutenetMaria
    Poziom 28  

    Bajki opowiadasz...

    Już powoli łape, ale jeszcze nie do końca.
    Błędem jest zapisanie Timer4=XXX, bo to nie zmienia wartości TOP w trybie CTC a wartość licznika.

    Należy zmienić wartość OCR2A, ale tej nie rozpoznaje mój kompilator, najnowsza wersja zaś rozpoznaje, ale ma ograniczenie.

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    Teraz w tym programiku testowy dziele 16 bitów na 2x po 8bitów. Ale w docelowym programie niezbyt to działa.

    Co najdziwniejsze w jednej maszynie chodzi mój kod docelowy, wiec jakimś cudem skompilowało przypisanie ocr2A=XXX.

    0
  • #7 16 Lip 2012 13:44
    MArSTER_1
    Poziom 18  

    Timer4_int:
    Rejestr = Rejestr + 1
    If Rejestr > 255 Then Rejestr = 0
    Timer2 = Rejestr
    Toggle Sm_clk
    Return

    Dodano po 7 [minuty]:

    Z najnowszej wersji przekopiuj plik m1281.dat (jest w katalogu w którym masz zainstalowana najnowszą wersję bascoma) do twojego Bascoma i problemy powinny zniknąć.
    No i wykasuj te niezbyt miłe : "Bajki opowiadasz..." bo twój kod pomimo edycji posta pozostał a tam widać jak zaprogramowałeś.

    0
  • #9 16 Lip 2012 13:56
    MArSTER_1
    Poziom 18  

    Zamieniłeś pliki m1281.dat?

    0
  • #11 16 Lip 2012 17:12
    MArSTER_1
    Poziom 18  

    Z tym zawsze zdążysz. próbuję zrozumieć intencję użycia Timer4. Napisz może po co ci ten Timer i jaki tryb ma być działania?
    PWM? CTC? Timer?
    Jaką funkcję ma realizować?

    0
  • #12 16 Lip 2012 17:25
    LiutenetMaria
    Poziom 28  

    Przecież pisze to wyżej:) Ma być CTC, i czy to ważne dlaczego?

    Ma być użyty dlatego, że Timer 1 to PWM, Timer 3 liczy czas między przerwaniami zewnętrznymi i wpisuje ten czas do wartości TOP Timera 2. Ale timer 2 jest 8 bitowy, wiec ucieka mi pewna wartość bo Timer3 jest 16bit. Timer4 jest również 16bit wiec powinno grac..

    Teraz działa to tak, że wartość z Timera3 jest przetwarzana i w obsłudze przerwania oc2 Timera2 jest przypisywana do wartości OCR2.

    0
  • #13 16 Lip 2012 18:15
    MArSTER_1
    Poziom 18  

    Pisałeś: "Jest to zdaje się tryb CTC, ale gdzieś wyczytałem, że w Bascomie nie da się ustawić tryby CTC za pomocą wbudowanych "słów" typu config.."

    Z tego "zdaje się" trudno wywnioskować, że tak ma być. Teraz już wiem.
    W Bascomie można bez wielkiego problemu konfigurowac Timery przez wpisy do rejestrów. Zaraz sprawdzę co wpisać aby otrzymać tryb CTC.

    Dodano po 40 [minuty]:

    Wiesz co? Zanim zacznę konfigurować rejestry spójrz na stronę 136 PDF ATmegi 1281. Jest tam wymienionych kilka źródeł przerwań Timera4 ale nie ma takiego jak ty używasz czyli :"On Oc4a Timer4_int". Może najpierw wybierzesz sobie właściwą nazwę przerwania? Może potrzebujesz przerwania : "On OcF4a Timer4_int"?

    0
  • #14 16 Lip 2012 23:24
    LiutenetMaria
    Poziom 28  

    MArSTER_1 napisał:
    Wiesz co? Zanim zacznę konfigurować rejestry spójrz na stronę 136 PDF ATmegi 1281. Jest tam wymienionych kilka źródeł przerwań Timera4 ale nie ma takiego jak ty używasz czyli :"On Oc4a Timer4_int". Może najpierw wybierzesz sobie właściwą nazwę przerwania? Może potrzebujesz przerwania : "On OcF4a Timer4_int"?


    NIe wiem jakich pdf-ów TY używasz, ale ja na stronie 106 Datasheetu mam przerwanie $0054 Timer4 Compare A i w pliku m1281def mam OC4A= $054 ; Timer/Counter4 Compare Match A. Zresztą przerwanie mi chodzi i nie w tym sęk..

    0
  • #15 17 Lip 2012 00:16
    Fredy
    Poziom 27  

    Ale Bascom przecież łyka instrukcje asm.
    Napisz mu np coś takiego:

    OCR4AH=00
    OCR4AL=12

    Sprawdź może też z małymi literami. Jeśli to nie zadziała to można podać mu to jako wstawkę asm. Być może nie opisali jeszcze tych rejestrów w tym kompilatorze.

    0
  • #17 17 Lip 2012 07:27
    LiutenetMaria
    Poziom 28  

    Fredy napisał:

    Ale Bascom przecież łyka instrukcje asm.
    Napisz mu np coś takiego:

    OCR4AH=00
    OCR4AL=12

    Sprawdź może też z małymi literami. Jeśli to nie zadziała to można podać mu to jako wstawkę asm. Być może nie opisali jeszcze tych rejestrów w tym kompilatorze.


    Też tak zrobiłem, ale mam problem z podziałem 16 bitowej liczby na dwie 8bitowe.
    Nie wiem czy robię to poprawnie.
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    I w tym przykładowym programie niby to działa, ale w docelowym już nie bardzo.

    Dodano po 19 [minuty]:

    A ten kod już nie działa (zmiana wartości w obsłudze przerwania):
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Dodano po 25 [minuty]:

    Rejestr = 1
    Ocr4al = Low(rejestr) 'zapisanie 8 najmłodszyuch bitów
    Ocr4ah = High(rejestr)

    teraz testuję taki zapis.

    0
  • #18 17 Lip 2012 22:11
    Fredy
    Poziom 27  

    Dla świętego spokoju ten wpis w rejestr 16 bitowy bym zrobił przy wyłączonych przerwaniach. Zwróć uwagę że nie jest to operacja atomowa.

    0
  • #19 18 Lip 2012 06:54
    LiutenetMaria
    Poziom 28  

    Fredy napisał:
    Dla świętego spokoju ten wpis w rejestr 16 bitowy bym zrobił przy wyłączonych przerwaniach.

    Też tak robiłem, ale i tak nie było efektu.

    Na razie zaopatrzyłem się w najnowszą wersję BASCOMA i program testowy działa perfekcyjnie.
    Niedługo wgram go w maszynę i zobaczę efekty.

    EDIT:
    Wszystko działa pod najnowszą wersją bascoma.

    0