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.

Atmega8/ Bascom - Multipleksowanie LED + termometr

Elektronik_Kraków 05 Jul 2014 01:16 3174 18
  • #1
    Elektronik_Kraków
    Level 13  
    Witam
    Mam taki kod nie jest to całość tylko to z czym mam problem:
    Code: basic4gl
    Log in, to see the code


    problem jest z wyświetlaniem wartości temperatury na LED. Jeśli wartość zmierzona jest mniejsza niż 25,6 stopnia, to jest ok, ale dla większych wychodzi coś takiego:
    Ds_i1 = 256
    Stopnie_d = 0
    Stopnie_j = 0
    Stopnie_p = 0

    dla
    Ds_i1 = 305
    Stopnie_d = 0
    Stopnie_j = 4
    Stopnie_p = 9

    dla
    Ds_i1 = 320
    Stopnie_d = 0
    Stopnie_j = 6
    Stopnie_p = 6

    dla wartości 255, czyli 25,5 stopnia
    Ds_i1 = 255
    Stopnie_d = 2
    Stopnie_j = 5
    Stopnie_p = 5

    liczyłem to na kalkulatorze i powinny wychodzić inne wartości.

    Dodatkowo jest problem w momencie odczytu temperatury z czujnika DS18B20. Na 1 sekundę przygasa wyświetlacz. Jest to zapewne związane z blokowaniem przerwań na czas odczytu. Czy jest możliwość, żeby to "przygaszanie" zlikwidować lub przynajmniej zmniejszyć ?
    Kamery 3D Time of Flight - zastosowania w przemyśle. Darmowe szkolenie 16.12.2021r. g. 10.00 Zarejestruj się
  • #2
    piotrva
    VIP Meritorious for electroda.pl
    Po pierwsze problemem jest 255, więc zapewne przepełnienie typu itp. - niestety w Bascom rzutowanie typów jest niejawne i pewnie całe operacje trzeba zrobić na intigerze a potem dopiero wrzucić do Byte.
    Co do przygasania - nie pokazujesz pełnego kodu programu, ale rzeczywiście na dosyć długi wyłączasz przerwania
  • #3
    M. S.
    Level 34  
    Pomiędzy zainicjowaniem pomiaru a odczytem danych z DS'a powinien upłynąć czas 750ms lub więcej.
    Wczytaj dane z DS do tablicy dwuelementowej Byte, a później oba bajty wtłocz do zmiennej integer albo word np. przez Makeinit.
    Zsynchronizuj obsługę DS'a z multipleksowaniem wyświetlacza to nie będzie migał. Dla skrócenia czasu komunikacji z DS wysyłaj lub odbieraj jednorazowo jak najmniejszą ilość danych. Np osobno:
    Code: basic4gl
    Log in, to see the code

    osobno
    Code: basic4gl
    Log in, to see the code
  • #4
    emarcus
    Level 38  
    M. S. wrote:


    Wczytaj dane z DS do tablicy dwuelementowej Byte, a później oba bajty wtłocz do zmiennej integer albo word np. przez Makeinit.


    Dla temperatur tylko dodatnich można użyc zmiennej word, natomiast jeżeli wystąpią temperatury ujemne bezwzględnie trzeba zastosowac tu zmienną interger; inaczej wystąpią absurdalne interpretacje odczytów temperatury.
    Dla przykładu:
    Temperatura "-25.1" i konvertowany odczyt do zmiennej integer
    wyświetla:
    Atmega8/ Bascom - Multipleksowanie LED + termometr

    natomiast ta sama temperatura ("-25.1") [przy tejsamej konversji 'makeint' do zmiennej typu word - otrzymujemy:
    Atmega8/ Bascom - Multipleksowanie LED + termometr

    Niezależnie od metody wyświtlania; LED, LCD, terminal.

    e markus
  • #5
    atom1477
    Level 43  
    No niestety BASCOM tak ma. Zdaje mi się że takie obliczenia kiedyś działały (operacje na integer a zwracanie wyniku do Byte). Widocznie od którejś nowej wersji już nie działają.
    No to będziesz musiał zrobić tak:
    Code: basic4gl
    Log in, to see the code
  • #6
    Elektronik_Kraków
    Level 13  
    Kolega piotrva i atom1477 mieli oczywiście rację, teraz jest OK.

    Natomiast w kwestii migania przy odczycie temperatury, to może to rozbić na takie części
    Code: basic4gl
    Log in, to see the code


    Jeśli chodzi o zakres temperatur, to tylko dodatnie, więc makeint powinno się sprawdzić, termometr ma być dodatkiem do budzika
  • #8
    M. S.
    Level 34  
    Quote:
    bezwzględnie trzeba zastosowac tu zmienną interger


    ... albo prostą obróbkę zmiennej Word poprzez uzupełnienie do dwóch.

    P. S. Mam właśnie na stole taki termometr. Wyświetlacz jest multipleksowany timerem w przerwaniach co 8ms. Każde przerwanie powoduje jednokrotne uruchomienie innego fragmentu programu w pętli głównej, w tym innego fragmentu obsługi DS'a. Komunikacja z DS'em się wyrabia.
  • #9
    Elektronik_Kraków
    Level 13  
    [quote="M. S."]
    Quote:

    P. S. Mam właśnie na stole taki termometr. Wyświetlacz jest multipleksowany timerem w przerwaniach co 8ms. Każde przerwanie powoduje jednokrotne uruchomienie innego fragmentu programu w pętli głównej, w tym innego fragmentu obsługi DS'a. Komunikacja z DS'em się wyrabia.


    Ale wprowadza Kolega jakieś opóźnienie pomiędzy tymi uruchomieniami ?
    Np. zliczanie przepełnień licznika
    Czyli jedna flaga zezwala w ogóle na pomiar, a druga zmienna wyznacza, który fragment ma się uruchomić.
  • Helpful post
    #10
    M. S.
    Level 34  
    Timer w przerwaniu obsługuje wyświetlacz LED i inkrementuje zmienną byte, która w pętli głównej w instrukcji Case wybiera konkretne funkcjonalne fragmenty programu do wykonania, których wykonanie czasowo mieści się pomiędzy przerwaniami od timera.
    W przerwaniu od timera ustawia się także flaga przerwania, która uruchamia za pomocą If Then instrukcję Case. Pętla główna po pierwszym przebiegu kasuje tą flagę.
  • #11
    Elektronik_Kraków
    Level 13  
    Witam ponownie
    Sugestia Kolegi M. S. była pomocna.
    Całość wygląda tak

    Code: basic4gl
    Log in, to see the code


    Na razie mierzy dwa razy na minute, przy 20 i 40-tej sekundzie.

    Natomiast dodałem obsługę pilota NEC i tutaj mam problem. Kody odbiera prawidłowo. Mogę zmieniać co ma być wyświetlane na LED. Ale nie mogę zmienić ustawień czasu, tzn. resetuję wartość sekund, widzę to na LED, a program po odczycie PCF8563 przez przerwanie od PCF i tak pokazuje starą wartość, tak, jakby nic nie zapisał do PCF8563.
    Zakładam, że jak zmienię jedną wartość i zapiszę to pozostałe są takie jak były tuż przed zapisem.
  • #13
    Elektronik_Kraków
    Level 13  
    Usunąłem dwie linie:
    Code: basic4gl
    Log in, to see the code

    ale brak różnicy

    Ten kod zapisu podają również w samplach Bascoma ( co prawda tam zapis i odczyt jest w pętli FOR .. NEXT). I generalnie się sprawdza. Podobnie jak w przypadku Atmega8 + LED na MAX7219 - tutaj działa jak trzeba.

    Nawet dla testu dołożyłem zmienną, dla sekund - sekundy_ustaw i na niej operowałem przy otrzymaniu danych z pilota.
  • #14
    Elektronik_Kraków
    Level 13  
    No i przedobrzyłem
    Dokonałem optymalizacji kodu, oszczędzając kilkanaście procent pamięci FLASH, ale... sygnał z pilota NEC ( takie małe płaskie na baterie pastylkową ) przestał być odbierany - brak jakiejkolwiek reakcji na naciśnięcie przycisku w pilocie.

    Poniżej kod:
    Code: basic4gl
    Log in, to see the code


    Kod do odbioru z pilota NEC sprawdzony w innym projekcie, odbiór w przerwaniu INT1 z wykorzystaniem Timer2. Dodałem Print Command w przerwaniu Infrared, żeby sprawdzić, czy coś odbiera - reakcji brak, jakby w ogóle nie był włączony odbiornik.
  • #15
    atom1477
    Level 43  
    Napisz co konkretnie zmieniłeś w momencie jak przestało działać.
    A jak nie wiesz to powoli wracaj do wersji kiedy działało.
    Np. zacznij od kodu który tylko odbiera kody od pilota a potem dodawaj po kawałku obsługę I2C, wyświetlacza, 1Wire, itd.
  • #16
    Elektronik_Kraków
    Level 13  
    Witam
    Zmieniłem sposób obsługi wyświetlania.
    Początkowo miałem tak :
    Code: basic4gl
    Log in, to see the code


    czyli w przerwaniu ustawiałem tylko flagę dla wyświetlacza i zwiększałem jego numer, samo wyświetlanie było w podprogramach razem z obliczeniami, wywoływanych warunkiem określającym co ma być wyświetlane.

    ----------------------
    W drugiej wersji, kod poniżej, przeniosłem obsługę wyświeltania do przerwania, natomiast obliczenia są w pętli głównej z warunkiem określającym, które obliczenia mają być wykonywane i ich wyniki przekazywane do wyświeltania. W tej wersji jest spora oszczędność kodu, ale "zamilkł" odbiór pilot NEC w przerwaniu


    Code: basic4gl
    Log in, to see the code
  • #18
    Elektronik_Kraków
    Level 13  
    Czyli zostaje mi korzystanie z pilota RC5 zamiast NEC ( używam takiego w projekcie z multipleksowaniem bez 74HC595 i działa pięknie i to bez przerwania ), bo ciężko będzie wrzucić obsługę pilota NEC bez przerwania - myślałem, że może by sprawdzać stan portu wejściowego odbiornika, ale to raczej nie zadziała. Szkoda, bo piloty NEC tanie i poręczne, a te RC5, które mam do telewizorów to masakra, trzeba naściskać, żeby zadziałały.