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.

atmega 644 / Bascom - Timer 0 i Timer 2 nie mogą działć jednocześnie ?

maximus22_kr 18 Sty 2013 23:41 4818 11
  • #1 18 Sty 2013 23:41
    maximus22_kr
    Poziom 18  

    Witam
    W Atmega 644 mam:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    i procesor się się zawiesza po kilku minutach.

    Gdy zmienię na:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    To wtedy nie mogę skompilować.
    Jest komunikat: EQU not found, probably using functions that are not supported by the selected chip [TIMSK]

    Według noty Timer0 i Timer2 są 8-bitowe, więc można je "zamieniać" i mają oddzielne preskalery.

    0 11
  • #3 19 Sty 2013 00:20
    maximus22_kr
    Poziom 18  

    Bascom - wersja 1.11.95

    Kod, no jest tego sporo:
    - zegar PCF8563
    - Zapis na SD
    - dwa czujniki DHT11
    - odczyt z PCF8574AP ( klawiatura )
    - RC5
    - ma być DS18B20
    - ma być DCF77, ale nie doszedłem do tego momentu ( tzn testowałem na innym procesorze i działało )

    Działa
    - zegar PCF8563
    - dwa czujniki DHT11
    - odczyt z PCF8574AP w przerwaniu ( klawiatura )
    - Zapis na SD

    Dołożenie RC5 powoduje, że po kilku/ kilkunastu minutach procesor się zawiesza i wyświetlanie LCD się zatrzymuje - mam wrażenie, że "zabawa" pilotem przyśpiesza zwiech. Dodatkowo "akcja" występuje dopiero po drugim naciśnięciu przycisku.

    Sprawdzałem też z innym kodem do obsługi DHT11, ale efekt taki sam, dlatego zacząłem podejrzewać Timer'y
    A nie mogę mieć inaczej, bo:
    Timer0 - liczniki/ustawianie flag ( lub Timer2 )
    Timer1 - DCF77
    Timer2 - RC5 ( lub Timer0 )

    Ech, wczoraj zdesperowany zacząłem przeglądać książkę do C - autorstwa Kolegi Mirka, podejrzewam, że część, albo wszystkie problemy dałoby się uniknąć pisząc w C.

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    0
  • #4 19 Sty 2013 10:51
    piotrva
    Moderator na urlopie...

    Aaaa, obsługa karty SD na AVR-DOS - jak wiadomo do poprawnej pracy ten system wymaga (niestety) skonfigurowanego programowego zegarka, który korzysta z trybu asynchronicznego timera2 - stąd zapewne biblioteka robi coś z tym zegarkiem lub sama nie działa poprawnie, gdyż nie konfigurujesz nigdy tego zegarka. A skonfigurowanie ręcznie tego timera w innym trybie może powodować zawieszanie się biblioteki.
    I masz rację - tego problemu uniknął byś w C, bo tam piszesz wszystko po swojemu i masz dostęp do źródeł bibliotek.
    Poza tym tak czy siak - zaktualizuj bascoma do najnowszej wersji - najnowszy AVR-DOS obsługuje już karty SDHC powyżej 2GB ;)
    Po drugie - po co marnujesz tyle ramu na przechowywanie statycznych ID czujników DS - zapisuj te dane w eeprom/flash i potem na czas weryfikacji przerzucaj do bufora odpowiedni ID.

    0
  • #5 19 Sty 2013 19:15
    maximus22_kr
    Poziom 18  

    Czyli pozostaje mi odbiór RC5 poprzez zewnętrzny układ ( UART programowy ), wtedy już bez użycia przerwania.
    Albo... mam układ Atmega 1284P i według noty ma:
    - dwa Timer'y 8-bit
    - dwa Timer'y 16-bit

    Tylko, że wpisanie:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    przy kompilacji powoduje komunikat błędu "Unknown CONFIG parameter"

    0
  • #6 19 Sty 2013 19:40
    piotrva
    Moderator na urlopie...

    Niestety wbudowana w bascoma funkcja do odbioru RC5 może działać tylko na timerze 0 lub 2 (koniecznie musi być to timer 8-bit) lub na timerze 1 (lub 3 - nie wiem czy działa) w trybie ICP.
    Przejrzyj helpa bascoma pod hasłem Config RC5.

    0
  • #7 19 Sty 2013 20:43
    maximus22_kr
    Poziom 18  

    W helpie jest napisane, że domyślnie Timer0, opcjonalnie Timer2.
    Czyli zostaje odbiór RC5 z dodatkowej płytki. A już myślałem, że Atmega644 jest jakaś trudniejsza w opanowaniu - są z nią większe problemy.

    Przyznam, że jeśli przy tej samej konfiguracji sprzętowej można uzyskać ten sam efekt a nawet "wyciągnąć" więcej to C staje się co raz bardziej kuszące.

    Co do obsługi DS18B20. Czy Kolega ma na myśli, aby nie ładować przed startem wszystkich ID układów DS, tylko ładować każdy z osobna przed odczytem z wewnętrznego/zewnętrznego EEPROM np. przy pomocy pętli For .. Next ? ( zmieniając tylko zmienna oznaczającą wartość komórki do odczytu ).

    0
  • #8 19 Sty 2013 22:36
    piotrva
    Moderator na urlopie...

    Co do dsów tak bym zrobił - przechowywał ich id w eeprom i ładował do ramu przed odczytem.
    A C polecam - tam nie ma problemów typu karta sd musi korzystać z timera2 - wszystko (nawet biblioteki) możesz sam dostosować do potrzeb.
    Swoją drogą zaktualizuj BASCOM'a - bo nowa wersja umożliwia korzystanie też z timera1 (w trochę innej konfiguracji sprzętowej) a skoro masz w procesorze jeszcze 16-bit timer3 to możesz go użyć zamiast timera1.

    0
  • #9 21 Sty 2013 00:17
    maximus22_kr
    Poziom 18  

    Zrobiłem aktualizacje do 2.0.7.6.
    Obsługuje bez problemu USBasp, no i biblioteki do SD faktycznie lepsze - obsługują SDHC i można np. sprawdzić rodzaj karty SD.
    Tylko zapisywany ciąg na karcie trochę inaczej jest. Zamiast spacji jest teraz "kropka" i cały tekst bardziej "zbity" w całość.

    Co do rC5 to nic się nie zmieniło, właściwie to gorzej bo pracuje tylko na Timer2

    Niestety dalej się zawiesza, po 30-40 minutach.

    Nie wiem czemu, ale usunięcie:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    powoduje, że na LCD robocza zawartość ekranu LCD miga na zmianę z pierwszą pozycją menu. Trochę dziwne, tym bardziej, że wyjścia PCF8574AP są podciągnięte przez rezystory do VCC.

    Może fusebity są źle ustawione.
    Mam takie dla kwarc = 14745600 Hz :
    Lockbit 65 : 11
    Lockbit 43 : 11
    Lockbit 21 : 11
    Fusebit C : wyłączony podział przez 8
    Fusebit B : zablokowane wyjście zegarowe
    Fusebit KLA987: 101111
    Fusebit High I : 1: OCDEM Fuse unprogrammed
    Fusebit High H : 1: JTAG Disabled
    Fusebit High Q : 0: Serial programming enabled
    Fusebit High P : 1: Watchdog timers always disabled
    Fusebit High G : 1: Erase EEPROM when chip erase
    Fusebit High FE : 00: 2048 word boot size
    Fusebit High D : 1: Reset vector is $0000

    Fusebit Extended TSR: 111: Brown-out disabled

    A czy to, że PORTB.4 jest wykorzystywany do aktywacji karty SD - nie ma znaczenia ? W Atmega644 jest to wyjście SS.

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Co prawda według konfiguracji ma robić za zwykły PORT ( parametr Noss =1 ):
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    0
  • #10 22 Sty 2013 23:38
    maximus22_kr
    Poziom 18  

    Wygląda na to, ze to obecność drugiego czujnika DHT11 ( mimo, że na osobnym pinie ) powoduje zawieszanie układu, lub druga możliwość, zbyt częste wywoływanie odczytu - w dokumentacji jest że czas odpowiedzi to nawet 30 sekund.

    Odnośnie tego:

    Cytat:

    Aaaa, obsługa karty SD na AVR-DOS - jak wiadomo do poprawnej pracy ten system wymaga (niestety) skonfigurowanego programowego zegarka, który korzysta z trybu asynchronicznego timera2 - stąd zapewne biblioteka robi coś z tym zegarkiem lub sama nie działa poprawnie, gdyż nie konfigurujesz nigdy tego zegarka. A skonfigurowanie ręcznie tego timera w innym trybie może powodować zawieszanie się biblioteki.


    nie da się tego jakoś obejść ? Mam przecież zegar na PCF8563

    0
  • #11 22 Sty 2013 23:45
    piotrva
    Moderator na urlopie...

    Jedyne co da się zrobić to odpowiednio operując bezpośrednio na rejestrach zwolnić piny PC0-PC1 jako normalne piny I/O. Timer2 tak czy inaczej nie nadaje się do użycia...

    0
  • #12 27 Sty 2013 22:00
    maximus22_kr
    Poziom 18  

    Jeśli chodzi o odczyt ID DS18B20, zrobiłem coś takiego:


    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    W sumie działa. co prawda nie wiem, jaki będzie mieć wpływ na pracę zegara PCF ( może lepiej użyć pamięci EEPROM procesora ).
    Zastanawia mnie tylko, dlaczego zaczyna wyświetlanie od drugiego DS'a - mimo, że odczytuje ID pierwszego

    0