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 1.11.9.5 - przeliczanie napięcia z ADC

neo_84 06 Paź 2009 18:18 4786 33
  • #1 06 Paź 2009 18:18
    neo_84
    Poziom 14  

    Witam mam problem z bascomem 1.11.9.5 i nie wiem czy to wina kompa czy programu no i niestety niedziała tak jak powinien jest to woltomierz jeśli by ktoś nie wiedział ;) po podłączeniu +5 V do wejścia adc0 ma wskazywać 29,9 a jeśli zamiast +5 będzie masa to na wyświetlaczu powinno wyskoczyć 0,0 jeśli ma ktoś dobre chęci i płytkę testowa był bym wdzięczny za sprawdzenie czy u niego hula ;)

    Code:
    $regfile = "m8def.dat"
    
    $crystal = 8000000

    Config Portd = Output                                       ' segment a,b,c,d,e,f,g,h
    Config Pinb.1 = Output                                      'Tranzystor 1 pierwszy wyswietlacz
    Config Pinb.2 = Output                                      ' Tr2 Drugiego Wyswietlacza
    Config Pinb.3 = Output                                      'Tr3 trzeciego wyswietlacza

    Config Timer0 = Timer , Prescale = 256
    Config Adc = Single , Prescaler = Auto , Reference = Avcc

    Declare Sub Pobr_znak(cyfra As Word)
    On Timer0 Multi

    Dim A As Word                                               'zmienna setek
    Dim B As Word                                               'zmienna dziesiatek
    Dim C As Word                                               'zmienna jednosci

    Dim Z As Word
    Dim D As Byte
    Dim V As Single
    Dim Wart_ac As Word
    Dim Nr_wys As Byte
    Dim Kr1 As Bit
    Dim Kr2 As Bit
    Dim Kr3 As Bit

    W1 Alias Portb.1
    W2 Alias Portb.2
    W3 Alias Portb.3

    Gosub Demo                                                  'demo wyswietlacza

    Enable Interrupts
    Enable Timer0
    Load Timer0 , 210

    Start Adc

    Set Kr1
    Set Kr3

    Do
    Wart_ac = Getadc(0)                                         'pomiar napiecia
    V = Wart_ac * 0.2929
    Waitms 100
    Z = V
    A = Z \ 100
    B = Z Mod 100
    B = B \ 10
    C = Z Mod 10

    Loop
    End

    Sub Pobr_znak(cyfra As Word)
    If A = 0 Then A = 10
    If Cyfra < 10 Then
    Portd = Lookup(cyfra , Kod7)
    Else
    Portd = &B11111111                                          'wygaszenie wyswietlacza gdy a =0
    End If
    End Sub

    Multi:
    Load Timer0 , 210
    Set W1
    Set W2
    Set W3
    Select Case Nr_wys
    Case 0:
    Call Pobr_znak(a)
    Portd.7 = Kr1
    Reset W1
    Case 1:
    Call Pobr_znak(b)
    Portd.7 = Kr2
    Reset W2
    Case 2:
    Call Pobr_znak(c)
    Portd.7 = Kr3
    Reset W3
    End Select

    Incr Nr_wys
    If Nr_wys = 3 Then
    Nr_wys = 0
    End If
    Return

    Demo:
    Reset W1
    Reset W2
    Reset W3
    Portd = &B11111110
    For D = 1 To 8
    Waitms 100
    Rotate Portd , Left
    Next D
    Return

    Kod7:
    Data &B11000000 , &B11111001 , &B10100100 , &B10110000 , &B10011001,
    Data &B10010010 , &B10000010 , &B11111000 , &B10000000 , &B10010000

    0 29
  • #2 06 Paź 2009 18:38
    alien_audio
    Poziom 21  

    Witam.
    Nie opisałeś jakie jest napięcie referencyjne. Maksymalna wartość z przetwornika to oczywiście będzie 1023 i jak podstawimy to do obliczania napięcia jak jakby nie patrzeć nie będzie wartości 29,9. Za dużo dzielisz.

    0
  • #3 07 Paź 2009 13:13
    marco47
    Poziom 41  

    Witam kolegów!
    Kolego neo_84
    Po co dajesz waitms 100 po sprawdzeniu napięcia na wejściu ADC
    Kolego alien_audio Przecież ma w konfiguracji ADC podany poziom napięcia referencyjnego
    Moje pytanie dotyczy czy masz jakiś wyświetlany wynik na wyświetlaczu czy nic

    Pozdrawiam

    0
  • #4 07 Paź 2009 16:22
    neo_84
    Poziom 14  

    falien_audio dokladnie niebedzie 29,9 tylko bedzie 299 ale po to jest set kr1 i set kr2 zeby wygasic pierwsza i 3 kropke i w tedy efekt wizualny jest 29,9 ;)

    marco47 dałem waitms 100 żeby napięcie było mierzone co 100ms a jeśli chodzi o wyświetlanie to 00.0 a w programie niema o tym mowy ponieważ jeśli a=0 to wygasza pierwszy wyświetlacz ! sprawdzałem kilka wersji bascoma działa mi ten program na wersji 1.11.7.4 a na 1.11.8.x niezbardzo i na 1.11.9.5 tez niezabardzo i właśnie nie wiem czego ??? dla tego właśnie proszę kogoś o sprawdzenie na płydce testowej czy u niego działa. Dodam jeszcze ze używam 2 programatorów stk 200/300 i stk 500 v2 i tak samo wgrywa program wiec to na pewno nie wina programatora

    0
  • #5 08 Paź 2009 10:46
    marco47
    Poziom 41  

    Kolego neo_84
    Sprawdziłem Twój program , jest zagmatwany jakiś taki nieczytelny.
    Powinieneś maksymalnie opisywać kod ,a poszczególne odrębne funkcje umieszczać osobno aby jak najbardziej program był czytelny nie tylko dla Ciebie , ale i dla innych elektroników (to bardzo pomaga!)
    Podam Ci szkielet kodu jaki ja stosuję przy multipleksowaniu i odczycie wartości z ADC. Jest to kod bardzo prosty i przejrzysty . Wersja bez Rem'u działa bez przerwy, w zaremowanych liniach kodu masz aktywne przerwanie , zresztą chyba sie domyślasz.

    Code:
      'Woltomierz LED   czterocyfrowy wyświetlacz        ver.01    8.10.2009
    


    '*************************** marco47(malpa)onet.eu  **********************************
    '
    '**************************   konfiguracja procesora  **************************

    $regfile = "m8def.dat"
    $crystal = 8000000

    Config Portb = &B11111111                         'wszystkie jako wyjścia
           Portb = &B11111111                        'stan spoczynkowy wyjścia wygaszone
    Config Portc = &B00000000                         'wszystkie jako wejścia
           Portc = &B00000000                        'ustawianie portu bez rezystorów podciągających
    Config Portd = &B11111111                         'wszystkie jako wyjścia - kropka.g,f,e,d,c,b,a
           Portd = &B11111111                        'stan spoczynkowy wyjścia wygaszone



    Config Adc = Single , Prescaler = Auto , Reference = Avcc       'ustawianie przetwornika AC

    'Config Timer0 = Timer , Prescale = 64             'ustawienie licznika dla przerwań co 2ms
    'Enable Interrupts                                 'odblokowanie przerwań
    'Enable Timer0                                     'odblokowanie przerwania od Timer0
    'On Timer0 Petla Nosave                            'po przepełnieniu licznika skocz do etykiety o nazwie Petla

    '*************************    deklaracja zmiennych  ****************************
    Dim A(1) As Word                                     'zmienne konwersji pomiaru




    Dim B(1) As Single                                    'zmienne konwersji pomiaru
    Dim C(1) As Word                                     'zmienne konwersji wyświetlania
    Dim D(4) As Word                                     'zmienne konwersji wyświetlania
    Dim Wyswietlacz As Byte                           'zmienna licznika wyświetlacza LED

    'Dim Flaga As Bit

    Start Adc                                         'start przetwornika A/C


    Do

    '***************************  program główny   *********************************
    'If Flaga = 1 Then                                 'po kazdym zgłoszeniu przerwania i ustawieniu flagi
    '  Timer0 = 128                                    'skracanie licznika,aby wyświetlać 62Hz na jeden wyświetlacz
    '    Flaga = 0                                     'zeruj obsługę przerwania

    '**************************  Przetwornik ADC  **********************************

      A(1) = Getadc(0)                                'przepisanie konwersji pomiaru do zmiennej Pomiar
       B(1) = A(1) - 28                               'od wyniku konwersji odjęto 28 aby wyświetlać 000,0
       C(1) = B(1) * 0.1                              'wynik konwersji * współczynnik Vcc/1023
          D(4) = C(1) / 1000                          'wyświetlanie tysięcy
          C(1) = C(1) Mod 1000
             D(3) = C(1) / 100                        'wyświetlanie setek
             C(1) = C(1) Mod 100
                D(2) = C(1) / 10                      'wyświetlanie dziesiątych
                C(1) = C(1) Mod 10
                   D(1) = C(1)                        'wyświetlanie jedności

    '************************   multiplekser wyświetlacza   ************************

    Incr wyswietlacz                                    'następny wyświetlacz co około 2ms
       If Wyswietlacz = 4 Then                        'jesli dojdzie do to
          Wyswietlacz = 0                             'zeruj
      End If

    Portb = &B11111111                                'najpierw gasimy  wyświetlacze

    Select Case Wyswietlacz

     Case 0:                                          'wyświetl zawartość licznika jednostek
       Portd = Lookup(d(1) , Tabela)                  'najpierw przepisz do PortD kody
       Portb.1 = 0                                    'potem włącz T1 - wyświetlacz jednostek
     Case 1:                                          'wyświetl zawartość licznika dziesiątek
       Portd = Lookup(d(2) , Tabela) : Portd.7 = 0    'najpierw przepisz do PortD kody
       Portb.2 = 0                                    'potem włącz T2 - wyświetlacz dziesiątek
     Case 2:                                          'wyświetl zawartość licznika setek
       Portd = Lookup(d(3) , Tabela)                  'przepisz do PortD kody
       Portb.3 = 0                                    'włącz T3 - wyświetlacz setek
     Case 3:                                          'wyświetl zawartość licznika tysięcy
       Portd = Lookup(d(4) , Tabela)                  'przepisz do PortD kody
       Portb.4 = 0                                    'włącz T4 - wyświetlacz tysięcy

       End Select
     '  End If                                          'koniec bloku decyzyjnego If Flaga
     Loop                                             'koniec pętli
    End                                               'koniec programu

    '*****************************   koniec programu   *********************************

    'Petla:                                            'procedura obsługi przerwania od Timer0 Petla
    ' Set Flaga
    'Return


    Tabela:
    Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144       'tabela cyfr 0...9


    Pozdrawiam

    0
  • #6 08 Paź 2009 16:29
    neo_84
    Poziom 14  

    wszystko ładnie i fanie ;) tylko ze ja prosiłem o sprawdzenie mojego programu na żywym przykładzie czyli skompilowaniu w bascom 1.11.9.5 i uruchomienie na płytce testowej, i w tedy jak ktoś mi powie ze niedziała u niego to znaczy ze nowa wersja bascoma tak ma ... a jeśli będzie chodzić to będę szukał przyczyn gdzie indziej np system, wirusy itp...

    0
  • #7 09 Paź 2009 11:00
    marco47
    Poziom 41  

    Dlaczego mamy sprawdzać czy działa( kompiluje? ) na tej wersji bascoma? ( O.K kompiluje się na tej wersji)
    Dlaczego mamy testować Twój program na naszych płytach testowych.
    Przecież cała zabawa z elektroniką polega na ciągłym sprawdzaniu , testowaniu , budowaniu coraz doskonalszego produktu . Jak chcesz gotowca to ponieś jakieś koszty .
    Zaremuj wszystkie linie kodu oprócz wyświetlacza, a na początku ustaw jakąś liczbę którą będziesz wyświetlał Wart_ac =123. Póżniej dodaj kod przetwornika ADC , i tak dalej , i tak dalej. Nigdy nie pisz kodu od razu w całości jeśli nie jesteś w 100% pewny jego poprawności. Twórz osobne bloki kodu dla osobnych funkcji , tak jak pokazałem Tobie na moim przykładowym programie. To bardzo ułatwia poruszanie się po kodzie. Dla sprawdzenia uruchom podany wyżej kod (w pełni sprawdzony i działający na każdej wersji bascoma).
    Pozdrawiam

    0
  • #8 09 Paź 2009 16:24
    neo_84
    Poziom 14  

    tak tez robiłem ;) spedzilem przy tym jakies 25 godzin i stwierdzilem ze niema sensu i trzeba kogoś poprosic zeby mi to sprawdzil ale niestety niema przyjaznej duszy i tylko jeden wniosek albo bascom albo windows nawala
    w bascom 1.11.9.5 niedziałala mi instrukcja waitms zawiesza program,
    jesli nazwalem zmienna np A działy sie niestworzone rzeczy samo przypisywanie wartosci a jesli jej nazwalem np F to juz działało wiec chyba wiadomo ze cos nie tak z kompilatorem bo chyba niema znaczenia nazwa zmiennych czy bedzie sie a czy b czy c czy d wogule w skrocie ujme jednym slowem poprostu program "chodził" jak chciał ... dalem ten sam program do bascom 1.11.7.4 i wszystko gra ...

    0
  • #9 10 Paź 2009 21:15
    astony
    Poziom 14  

    Zamiast czekać na waitms .. daj na początku $sim.
    Twój program dziala tylko czeka na :):) "waitms"

    0
  • #11 11 Paź 2009 21:31
    astony
    Poziom 14  

    Masz symulator

    Cytat:

    w bascom 1.11.9.5 niedziałala mi instrukcja waitms zawiesza program,

    Program ma działac na uP, a nie tylko w Bascom'ie :)

    -1
  • #12 11 Paź 2009 21:58
    neo_84
    Poziom 14  

    astony wszystko dziala prawidlowo w wersji 1.11.7.4 bez najmniejszego bledu nie zawiesza sie ani nic dobrze wskazuje odczyt itp itd a czego ten sam program niedziala w 1.11.9.5 ? to niewiem i dla tego chce udowodnic czy cos umnie nie tak czy poprostu ta wersja programu jest niedopracowana a tak jak bedziemy gdybac ... zamiast sprawdzic na zywym przykladzie to nas swieta zastana :D

    0
  • #13 11 Paź 2009 22:00
    atom1477
    Poziom 43  

    Usuń waitmsy, sprawdź w BASCOMie czy zwraca dobre liczby, przywróć waitmsy, sprawdź czy działa na procesorze.
    Nie wiem z czym masz problem.

    EDIT.
    Skoro działa w starszej wersji BASCOMa, to jaki masz problem? Nikt nie będzie Ci tego sprawdzał tylko po to żebyś się mógł czegoś upewnić.
    Chcesz sprawdzić na innym kompie, to sam musisz go sobie załatwić.
    Pójdź do kolegi czy coś i sprawdź.

    1
  • #14 11 Paź 2009 22:27
    neo_84
    Poziom 14  

    Mam 3 kompy.
    Na kazdym to samo, ale na wszystkich ten sam Windows z jednej płyty.
    atom1477 masz rację nikt mi tego nie sprawdzi ;)
    Z tego co widzę, więc dla tego uważam temat za zakończony!

    P.S.
    Chyba się trzeba uczyc C :/

    0
  • #15 12 Paź 2009 11:08
    marco47
    Poziom 41  

    Kolego neo_84
    Przez ten czas to jest od piątku jak tu byłem, dalej masz problem?
    Czytając Twoje posty doszedłem , dlaczego nie potrafisz uruchomić swojego programu.
    Jeżeli tak niedbale , z błedami , brakiem porządku piszesz posty , to dlatego nie potrafisz ( nie chcesz) uruchomić programu. Przecież napisałem Tobie abyś pisał program partiami (czytaj blokami funkcyjnymi) i wpisywał kod od razu do procka . Jeżeli dany blok działa dobrze , dopisuj następny , wpisuj kod do procka i tak dalej...
    Przecież nawet gdybym na płycie testowej połączył Twój układ , zaprogramował procka , a układ nie działałby , to chcąc się dowiedzieć dlaczego , musiałbym postąpić dokładnie tak jak napisałem Tobie wyżej.
    To żadna filozofia tylko powolny proces doskonalenia programu , urządzenia , produktu.
    Przez te dwa dni gdybyś nie czekał na gotowca układ testowy powinieneś uruchomić z dobrym programem z dzięsięć razy.
    Pozdrawiam

    0
  • #17 13 Paź 2009 11:13
    marco47
    Poziom 41  

    Kolego neo_84
    Nie rozumiem dlaczego piszesz że programy napisane w wersji 1.11.7.4 nie są kompilowane w wersji 1.11.9.0 do 5
    Tak jak pisałem wyżej Twój program kompiluje się w wersji 1.11.9.5 , jest zapisywany poprawnie do procka , ale czy będzie działał na płycie testowej z podłączonymi paściami (czytaj wyświetlaczami , tranzystorami itp) to już inna bajka. Jak wyżej napisałeś

    Cytat:
    marco47 tak robiłem jak mówiłeś ... a teraz pisze programy w wersji 1.11.7.4 i juz nie mam żadnych nawet najmniejszych problemów


    to znaczy że po zaprogramowaniu procka wszystko hula , a jak ten sam kod napiszesz w wersji 1.11.9.5 i zaprogramujesz procka to nic nie działa?
    Dziwne!
    Wszystkie programy które pisałem na wcześniejszych wersjach są kompilowane , testowane na wersji ostatniej i bez problemu zapisywane do procka.
    Pozdrawiam

    0
  • #18 13 Paź 2009 11:30
    atom1477
    Poziom 43  

    Może masz inne delkaracje HWStack, SWStack i Framezise w tych dwóch kompilatorach.
    Dodaj je do programu głównego najlepiej, wtedy zmiana kompilatora nie wpłynie na te parametry.

    0
  • Pomocny post
    #19 13 Paź 2009 11:37
    Wojtek75
    Poziom 23  

    neo_84 sprawdziłem ci to na ZL2AVR no i mogę potwierdzić że kod z pierwszego posta kompilowany 11174 działa, natomiast kompilowany wersjami 1119->2->3->5 nie działa poprawnie. Generalnie pomaga usunięcie opóźnienia z pętli (jest odczyt z ADC), ale pojawiają się problemy z multipleksowaniem wyświetlaczy.

    0
  • #20 13 Paź 2009 12:24
    neo_84
    Poziom 14  

    Wojtek75 i właśnie o taka odpowiedz mi chodziło ! :D tez miałem problemy z multipleksowaniem jak dawałem waitms w podprogramie to coś pomagało ale znów gdzie indziej problemy wnikały itp ... dzięki za odpowiedz teraz już wiem ze wersja 1.11.9.5 jest niedopracowana ;)

    0
  • #23 14 Paź 2009 01:04
    atom1477
    Poziom 43  

    Najwidoczniej. Dwa minusy dają plus.
    Zły kod + zły kompilator = działający program.

    A tak na poważnie to program jest trochę dziwacznie napisany i pewnie działa tylko na fuksa.
    Czas wykonywania niektórych rzeczy po skompilowaniu w nowym kompilatorze mógł się zmienić i to mogło spowodować że teraz program nie działa.

    0
  • #24 14 Paź 2009 10:02
    Wojtek75
    Poziom 23  

    neo_84 mam jeszcze do ciebie pytanie. Jak zasilasz układ, w którym testujesz ten kod?

    0
  • #25 14 Paź 2009 13:19
    neo_84
    Poziom 14  

    atom1477 kod mam z książki Marcin Wiązania i tak samo jak autor uważam ze ten kod jest dobry i przejrzysty a jeśli widzisz gdzieś błąd bardzo był bym wdzięczny wskazanie w którym miejscu i co mam zmienić żeby to zaczęło normalnie działać.
    Wojtek75 układ zasilam zasilacz stabilizowany + stabilizator 5V+ kondensatory 4700 uF i 100nF

    0
  • #26 14 Paź 2009 13:25
    atom1477
    Poziom 43  

    Może napisz jakie są objawy tego niedziałania najpierw.

    0
  • #27 14 Paź 2009 14:10
    Wojtek75
    Poziom 23  

    Nie podałeś jednej istotnej rzeczy jakie napięcie podajesz na wejście stabilizatora?
    Wg. mnie masz problem z zasilaniem. Wczoraj jak testowałem to u siebie nie zauważyłem że podaje na wejście stabilizatora zaledwie 7,5V i jak się okazało stąd właśnie te problemy z multipleksowaniem dzisiaj zwiększyłem napięcie na wejściu stabilizatora do 12V i problemy zniknęły jak ręką odjął. Oczywiście opóźnienie z pętli należy usunąć. W funkcji Getadc() na pewno od wersji 11174 do aktualnej 11195 wprowadzano jakieś zmiany i raczej należy się spodziewać tego, że czasami trzeba, co nieco w kodzie skorygować. I jeszcze jedno wyświetlaczami steruje u siebie przez ULN2803 a nie bezpośrednio z portów uC co też może mieć znaczenie.

    0
  • #28 15 Paź 2009 00:11
    neo_84
    Poziom 14  

    napięcie 10V na wyjściu mierzyłem jest 5 V do wyświetlacza sa podleczone rezystory 500 om bezpośredni nie przez uln
    Wojtek75 jak w pętli głównej wpiszesz waitms to występują problemy ? bo napisałeś ze opóźnienie trzeba osunąć

    0
  • #29 15 Paź 2009 11:43
    marco47
    Poziom 41  

    Kolego neo_84
    Czy rozumiesz ten kod o którym piszesz ? Bo jeżeli potrafisz go rozbić na poszczególne segmenty odpowiedzialne za osobne funkcje , to już dawno powinieneś sobie z nim poradzić. Chyba że go ściągnąłeś z książki Marcina Wiązania , nie bardzo rozumiejąc kodu. W takim razie napisz to wyrażnie .
    Przecież na samym początku napisałem Tobie abyś pokolei uruchamiał program a nie od razu w całości. Wtedy napewno znajdziesz błąd o którym pisałem wyżej .
    Nie od razu Kraków zbudowano. Małymi kroczkami a napewno dojdziesz do celu podrózy (czytaj dobrego i działającego kodu ).
    Tego Ci życzę!
    Pozdrowienia

    0
  • #30 15 Paź 2009 12:03
    Wojtek75
    Poziom 23  

    Tak opóźnienie trzeba usunąć, dlatego że z pozostawionym opóźnieniem objaw jest taki, że pali się tylko zero na drugim segmencie wyświetlacza a na pierwszym i trzecim jakaś cyfra od czasu do czasu sobie mignie przez ułamek sekundy. Z tym że tak jak już pisałem może to wynikać ze zmian wprowadzonych w funkcji Getadc() dlatego umieszczanie tego opóźnienia w pętli w nowszych wersjach kompilatora powoduje problemy. A problemy z multipleksowaniem, które pojawiły się u mnie po usunięciu opóźnienia wyparowały po zwiększeniu napięcia na wejściu stabilizatora. Stąd moje podejrzenia, że masz problem z zasilaniem.

    0