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

Identyfikator kolejności przewodów w wiązce na Atmega8

aaarek1 10 Mar 2011 09:45 2041 10
  • #1 9258112
    aaarek1

    Poziom 13  
    Witam wszystkich.

    Od razu uprzedzam, że jest to mój pierwszy projekt na procesor w ogóle.

    Potrzebne było urządzenie które zidentyfikuje numer przewodu w wiązce.
    Na razie wpinałem 100 ohmową drabinkę rezystorową między masę a poszczególne żyły i z drugiej strony mierzyłem rezystancję i tak 100 ohm to pierwsza żyła, 200 druga, itd.

    I tak postanowiłem zaprząc atmege8 do tego zadania.
    Założeniem było użyć wewnętrzny ADC tej samej drabince, którą używałem do tej pory i wysterować 7 segmentowy wyświetlacz LED.

    Tak by to miało wyglądać od strony hardware :
    Identyfikator kolejności przewodów w wiązce na Atmega8

    I listing do tego projektu:
    $regfile = "m8def.dat"
    $crystal = 800000
    $sim
    
    Config Adc = Single , Prescaler = Auto , Reference = Internal       'konfiguracja  adc
    Start Adc
    
    Config Portd = Output
    Portd = 0
    
    
    Dim Pom As Word
    Do
     Pom = Getadc(0)
     Pom = Getadc(0)                 'wyczytałem że lepiej 2 razy
    
    
                                ' wartości pom trzeba dobrać ekperymentalnie ,
          If Pom > 150 And Pom < 250 Then Portd = &B00001100    ' wyświetla 1
          If Pom > 290 And Pom < 350 Then Portd = &B01011011    ' wyświetla 2
          If Pom > 390 And Pom < 450 Then Portd = &B01001111    ' wyświetla 3
          If Pom > 490 And Pom < 550 Then Portd = &B01100110    ' wyświetla 4
          If Pom > 590 And Pom < 650 Then Portd = &B01101101    ' wyświetla 5
          If Pom > 690 And Pom < 750 Then Portd = &B01111101    ' wyświetla 6
          If Pom < 100 Then Portd = &B11111111                  ' zapala wszystkie segmenty = GND
          If Pom > 1000 Then Portd = &B01000000                 ' NC zapala -,segment g
    
      Wait 1
      
      Portd = 0                                     ' oszczędność baterii , wyświetlacz będzie migał a nie świecił bezprzerwy
     
    Loop
       End


    Zasada działania jest bardzo prosta: ADC(0) mierzy napięcie na dzielniku rezystorowym, porównuje z tym zdefiniowanym w programie i zapala odpowiednią cyfrę na wyświetlaczu.

    Listing się kompiluje i na symulatorze załącza dobrze porty, ale czy to ma szanse zadziałać w praktyce ?
    Może można zrobić to inaczej? Liczę na wasze pomysły.


    I mam nadzieję, że tym razem moderator nie wyrzuci tego do kosza.:D
  • #2 9258195
    tadzik85
    Poziom 38  
    Zły układ resetu. Zamień R z C. R14 w jakim celu?
  • #3 9258223
    aaarek1

    Poziom 13  
    Hej.
    R14 jest częścią dzielnika napięcia wraz z drabinką rezystorową , a poza tym ma pociągnąć wejście ACD tak, żeby nie wisiało w powietrzu kiedy sonda nie dotyka do żadnego z punktów pomiarowych.

    Jak ma wyglądać poprawny układ resetu? Można też z tej funkcji zrezygnować, tylko gdzie podciągnąć RST , do Vcc czy GND?
  • #4 9258236
    piotrva
    VIP Zasłużony dla elektroda
    1. oszczędź sobie tę oszczędność baterii bo w takim wykonaniu i tak niewiele to zmieni, a mniemam, że urządzenie po zakończeniu pracy będzie wyłączane z zasilania (najlepiej wyłącznikiem)
    2. źle zrobiony układ resetu - rezystor R2 powinien być do VCC, kondensator C4 do GND i wyłącznik zwierający do GND
    3. możesz pominąć kwarc - do takiego zastosowania wystarczy wewnętrzny oscylator 8 MHz w procesorze
    4. czy potrzeba Ci aż mega8? moim zdaniem wystarczyłby attiny26.
    5. dołóż sobie złączkę do programatora na płytce - przyda się jak zechcesz zmienić oprogramowanie
    6. te instrukcje if możesz zastąpić:
    
    Select Case Pom
    Case 150 To 250: Portd = &B********
    Case 251 To 350: ...
    '...
    'zacieśnij zakresy, bo co będzie jak trafisz na wartość między podanymi? tak być nie może
    Case Is < 150: Portb='zapalasz 0
    Case is > 750: Portb=' zapalasz NC
    End Select
    
  • #5 9258342
    aaarek1

    Poziom 13  
    Piotrva.
    Z tą oszczędnością baterii to faktycznie może trochę przesada.
    RST jak rozumiem jest wywoływany stanem niskim. Ok już poprawiam schemat.
    A z tym wewnętrznym oscylatorem, czy trzeba coś zmieniać w programie. I co zrobić z wejściami zewnętrznego oscylatora?
    Dlaczego Atmega8? Trywialnie, bo do takiej mam zestaw uruchomieniowy w którym też m8 będzie programowany.
    Wartości Pom będe dobierał później. Oczywiście zakresy będą ciaśniejsze. W tej chwili chodzi tylko o zasdę działania.

    Dodano po 1 [minuty]:

    Hej.
    R14 jest częścią dzielnika napięcia wraz z drabinką rezystorową , a poza tym ma pociągnąć wejście ACD tak, żeby nie wisiało w powietrzu kiedy sonda nie dotyka do żadnego z punktów pomiarowych.

    Jak ma wyglądać poprawny układ resetu? Można też z tej funkcji zrezygnować, tylko gdzie podciągnąć RST , do Vcc czy GND?
  • #6 9258373
    piotrva
    VIP Zasłużony dla elektroda
    Rozumiem, że będziesz brał nową atmegę (sklepową, nigdy nie programowaną), więc procesor będzie domyślnie ustawiony na wewnętrzny oscylator 1 MHz (co w zupełności Ci wystarczy), zmianę na ewentualne 8 MHz/zewnętrzny kwarc możesz dokonać we fusebitach. W przypadku wyboru tego wewnętrznego oscylatora piny te możesz wykorzystać tak jakby to były normalne PB6,7. A i tak zostanie Ci sporo pinów więc zostaw niepodłączone. Poprawny układ resetu to kondensator do masy i rezystor do vcc i opcjonalny przycisk do zewnętrznego resetu, który zwiera nogę do masy.
  • #7 9258394
    aaarek1

    Poziom 13  
    Tak mam zamiar użyć nowego m8.
    Więc mam ustawione 1MHz więc jak powinien wyglądać parametr

    Moderowany przez _Robak_:

    Proszę pilnować pisowni!

  • #8 9258411
    piotrva
    VIP Zasłużony dla elektroda
    1 MHz = 1000000 Hz, więc:
     
    $crystal = 1000000 'częstotliwość w Hz
    

    a skąd Ty wziąłeś w pierwszym programie kwarc 800 kHz?
  • #9 9258426
    aaarek1

    Poziom 13  
    Sorki. To 800 kilo to błąd. Po prostu za mało wklepałem zer.
  • #10 9258813
    Jerzy_W
    Poziom 14  
    Witam!

    Wyświetlacz siedmiosegmentowy to wspólna anoda? Jeżeli tak to podłacz do plusa, a nie do masy. Uwzglednij w programie, że segment zapalasz zerem, a gasisz jedynką.
  • #11 9258849
    aaarek1

    Poziom 13  
    Cytat:

    Wyświetlacz siedmiosegmentowy to wspólna anoda? Jeżeli tak to podłacz do plusa, a nie do masy. Uwzglednij w programie, że segment zapalasz zerem, a gasisz jedynką.


    Szczerze mówiąc nie wiem jaki mam wyświetlacz. Ale to nie jest problem, wystarczy zmienić 1 na 0 w kodzie, i tak prototyp jeszcze nie zmontowany mam nadzieję, że dam radę polutować to dziś wieczorkiem.Takie coś traktuje na razie jako kosmetykę.
    Ale dzięki za zainteresowanie.
REKLAMA