logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Bascom 1.11.9.5 - przeliczanie napięcia z ADC

neo_84 06 Paź 2009 18:18 5371 33
  • #1 7097376
    neo_84
    Poziom 15  
    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 ;)

    $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
  • #2 7097449
    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.
  • #3 7100124
    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
  • #4 7100732
    neo_84
    Poziom 15  
    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
  • #5 7103423
    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.

      'Woltomierz LED   czterocyfrowy wyświetlacz        ver.01    8.10.2009
    
    
    '*************************** marco47@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
  • #6 7104423
    neo_84
    Poziom 15  
    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...
  • #7 7107070
    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
  • #8 7108019
    neo_84
    Poziom 15  
    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 ...
  • #12 7117436
    neo_84
    Poziom 15  
    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
  • #13 7117456
    Konto nie istnieje
    Poziom 1  
  • #14 7117592
    neo_84
    Poziom 15  
    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 :/
  • #15 7118537
    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
  • #17 7122530
    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
  • #18 7122573
    Konto nie istnieje
    Poziom 1  
  • Pomocny post
    #19 7122596
    Wojtek75
    Poziom 24  
    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.
  • #20 7122725
    neo_84
    Poziom 15  
    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 ;)
  • #21 7122845
    marco47
    Poziom 41  
    Nie jest niedopracowana , tylko Twój program jest wadliwie skonstruowany. Zresztą już na początku to zaznaczyłem.
    Zmień go. Napisz go inaczej.
  • #23 7126077
    Konto nie istnieje
    Poziom 1  
  • #24 7126570
    Wojtek75
    Poziom 24  
    neo_84 mam jeszcze do ciebie pytanie. Jak zasilasz układ, w którym testujesz ten kod?
  • #25 7127275
    neo_84
    Poziom 15  
    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
  • #26 7127298
    Konto nie istnieje
    Poziom 1  
  • #27 7127430
    Wojtek75
    Poziom 24  
    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.
  • #28 7130090
    neo_84
    Poziom 15  
    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ąć
  • #29 7130853
    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
  • #30 7130911
    Wojtek75
    Poziom 24  
    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.
REKLAMA