Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

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

18 Jan 2013 23:41 5046 11
  • Level 18  
    Witam
    W Atmega 644 mam:
    Code: basic4gl
    Log in, to see the code


    i procesor się się zawiesza po kilku minutach.

    Gdy zmienię na:
    Code: basic4gl
    Log in, to see the code


    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.
  • Level 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.

    Code: basic4gl
    Log in, to see the code
  • VIP Meritorious for electroda.pl
    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.
  • Level 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:
    Code: basic4gl
    Log in, to see the code


    przy kompilacji powoduje komunikat błędu "Unknown CONFIG parameter"
  • VIP Meritorious for electroda.pl
    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.
  • Level 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 ).
  • VIP Meritorious for electroda.pl
    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.
  • Level 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:
    Code: basic4gl
    Log in, to see the code


    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.

    Code: basic4gl
    Log in, to see the code


    Co prawda według konfiguracji ma robić za zwykły PORT ( parametr Noss =1 ):
    Code: basic4gl
    Log in, to see the code
  • Level 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:
    Quote:

    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
  • VIP Meritorious for electroda.pl
    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...
  • Level 18  
    Jeśli chodzi o odczyt ID DS18B20, zrobiłem coś takiego:


    Code: basic4gl
    Log in, to see the code

    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
pcbway logo