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.

Termometr, woltomierz, zegar, zasilacz USB. Algorytmy.

Dar.El 23 Maj 2009 22:21 3496 4
  • #1 23 Maj 2009 22:21
    Dar.El
    Poziom 40  

    Witam
    Piszę program do urządzenia, które będzie w samochodzie: mierzyć napięcie, temperaturę w kilku punktach za pomocą DS18B20, pokazywać czas z obsługą PCF8583 i dodatkowo są dwa gniazda USB, do ładowarek różnej maści. Sterowanie będzie za pomocą impulsatora z przyciskiem, będzie też dźwięk z buzerka i regulacja jasności 6 wyświetlaczy LED za pomocą fotorezystora. Sercem układu jest ATMega8, która tym wszystkim będzie zarządzać a program piszę w asemblerze. Ciekawe czy pisząc w C, zmieściłby się program w 8kB ?.
    Program nie jest jeszcze skończony, jeszcze daleka droga przede mną, ale już działa wyświetlacz, pomiar napięcia i oświetlenia zewnętrznego, komunikuje się z PCF8583, obsługuje impulsator i przycisk. Napisanie programu głównego nie jest trudne a raczej pracochłonne. Czeka mnie napisanie obsługi 1W, korzystając z UARTa i opisu jak to zrobić przez Atmela i tu pewnie powyrywam sobie resztę włosów z głowy :D . Co prawda, napisanie sterownika I²C na przerwaniach, okazało się łatwiejszym zadaniem od pomiaru naprzemiennego napięcia zasilania i napięcia z fotorezystora. Program korzysta aktualnie z 4 przerwań i dojdą 3, przy pisaniu sterownika 1W. Jak na razie zajął 1300 bajtów, więc chyba się zmieszczę ze wszystkim. Postaram się opisać problemy, jakie się pojawiają w czasie pisania programu i nie chodzi o asembler a o algorytmy działania różnych urządzeń. Schemat w załączniku.
    Cdn.

    p.s.
    Dodałem małą prowizję z czystej ciekawości, tylko wtedy działa licznik pobrań.

    0 4
    Załączniki:
  • #2 23 Maj 2009 22:37
    crazy_phisic
    VIP Zasłużony dla elektroda

    Dar.El napisał:
    ... Sercem układu jest ATMega8, która tym wszystkim będzie zarządzać a program piszę w asemblerze. Ciekawe czy pisząc w C, zmieściłby się program w 8kB ?.
    ...


    Nie przesadzaj ;) taki program nawet w Bascomie to grubo poniżej 4kB.
    Dla przykładu układ na tiny26 sterujący dwoma przetwornicami+pomiar napięcia w dwóch punktach analogowo + obsługa 9 przycisków + PCA9555+TCN75+DS1338 to 90% pamięci.

    0
  • #3 23 Maj 2009 23:19
    Dar.El
    Poziom 40  

    Obawiam się że Baskom by nie podołał. Jednoczesny pomiar z kilku termometrów DS18B20 + wyświetlanie multipleksowe + regulacja jasności wyświetlaczy + obsługa impulsatora + pomiar napięcia o podwyższonej rozdzielczości z możliwością kalibracji skali i zera + obsługa zegarka po I2C + alarmy od temperatury i napięcia mierzonego + obsługa buzerka, który nie będzie robił tylko bip. Pewnie o paru sprawach zapomniałem. Trzeba też wziąć pod uwagę szybkość reakcji, która ma być natychmiastowa, przełączając się z pomiaru napięcia na pomiar temperatury albo na zegarek, lub wchodzić do setupa.

    Algorytm pomiaru napięcia i oświetlenia zewnętrznego, dla tych co by chcieli zrobić dobry woltomierz:
    Co 1ms startuje pomiar napięcia ADC. Sumuję 255 kolejnych pomiarów a na koniec odrzucam 2 najmłodsze bity z 18 bitowego wyniku i zapamiętuję wartość 2 bajtową. Aby osiągnąć prawidłową wartość zmierzonego napięcia, dokładam do tych 2 bajtów, 1 zerowy bajt na miejsce najmniej znaczące, czyli dokonałem mnożenia: 2B x 256 w czasie 1 cyklu zegarowego :D . Wynik 3 bajtowy dzielę przez około 3000 (wartość skalowania, zależna od dzielnika wejściowego i napięcia referencyjnego) i otrzymuję prawidłową wartość binarną. Zmieniając tą wartość, można skalować pomiar a zerowanie pomiaru uzyskuje się przez dodanie lub odjęcie potrzebnej wartości do wyniku, w opisywanym przypadku musiałem dodać 8. Końcowa szybkość pomiaru, to 3,9 na sekundę.
    Pomiar ADC o numerze 0 wykorzystuję do pomiaru napięcia z fotorezystora. Miałem duży problem z uzyskanie prawidłowego pomiaru napięcia, które było przełączane na wejściach przetwornika. Okazało się że trzeba poczekać 100µs, dla ustalenia napięcia wewnątrz uP. Próbowałem wykorzystać do tego przerwanie od ADC, ale niestety, nie udało się. Dzięki temu uprościłem program, rozwiązaniem było wyłączenie ADC za każdym razem i za chwilę włączenie, wtedy przetwornik potrzebuje dodatkowych 12 cykli ADC, które wystarczyły do ustabilizowania napięcia na MUX. Napięcie zmierzone jest porównywane z aktualną wartością sterującą jasnością wyświetlacza i gdy jest co najmniej większa o 3, to jasność zwiększam o 1 a gdy wartość zmierzona jest mniejsza o co najmniej 3, to jasność zmniejszana jest o 1. W ten sposób uzyskałem odporność układu na różne nieprzewidziane efekty zakłócające, kosztem spowolnienia zmian szybkości.

    0
  • #4 23 Maj 2009 23:46
    crazy_phisic
    VIP Zasłużony dla elektroda

    Ten pomiar "jednoczesny" z kilku DS18B20 jest do przedyskutowania ;) o ile możesz wysłać rozkaz konwersji do wszystkich układów jednocześnie to odbiór i tak jest "adresowany" więc od strony programu nie ma znaczenia czy masz 1 czy 250 termometrów.

    Korzystasz z wewnętrznego Vref czy linii AVCC?

    PS na schemacie masz odwróconą baterię przy PCF'ie.

    0
  • #5 23 Maj 2009 23:59
    Dar.El
    Poziom 40  

    Rysunek baterii kojarzy mi się z baterią np. paluszkiem, dlatego zawsze myli mi się ten symbol, na PCB wszystko jest OK. Korzystam z Vref. Gotowe biblioteki obsługujące 1W, nadużywają funkcji PAUSE, w moim przypadku absolutnie nieakceptowalną. Transmisja będzie wykorzystywać UARTA i jego przerwania, praktycznie postaram się nie marnować czasu uP na bezużyteczne czekanie.

    0
  Szukaj w 5mln produktów