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

[atmega8][Bascom]Wyświetlanie liczb multiplesowo na wyś. LED

Regan_3000 02 Maj 2010 14:08 2893 15
REKLAMA
  • #1 8026233
    Regan_3000
    Poziom 15  
    Witam. Robię czujnik temp. do auta i wykorzystuje do tego seryjny termistor NTC przykręcony do obudowy silnika, wynik ma być wyświetlany na wyświetlaczu LED. Układ jest już zmontowany tylko zostało napisać program. Odczyt i przekształcenie na wart. temp. nie jest problemem ale za to wyświetlenie tego na multipleksowanym wyświetlaczu led przez układ 74Ls47 już tak. Są to dwa wyś. 7-seg. ze wspólną anodą. Dwa segmenty wyś. są połączone równolegle z układem 7447. Jak wyświetlać na nich tak, żeby na jednym były dziesiątki na drugim jednostki?
  • REKLAMA
  • #2 8026296
    tadzik85
    Poziom 38  
    Przykładów w necie jest od groma. Z częstotliwością co najmniej 50Hz musisz przełączać wyświetlacz i wartość podawana na niego. Najlepiej wykorzystać do tego przerwanie timera.
  • #3 8034644
    Regan_3000
    Poziom 15  
    Tak myślałem że coś nie wyjdzie ale powiedzcie co zrobiłem źle.
    Układ ma za zadanie odczytywać spadek napięcia na dzielniku z termistorem i podawać na wyświetlaczu led odpowiednią temperaturę. Na razie zrobiłem skale co 5 żeby było prościej.

    $regfile = "m8def.dat"
    $crystal = 8000000
    Config Adc = Single , Prescaler = Auto , Reference = Avcc
    Config Timer0 = Timer , Prescale = 256
    
    Config Portd = Output
    Config Portb.0 = Output
    Config Portb.1 = Output
    Set Portb.1
    
    Declare Sub Wart_temp(temp As Byte)
    W1 Alias Portd.7
    W2 Alias Portb.0
    Dim Odczyt As Word , Temp As Byte , Nr_wys As Byte , L1 As Byte , L2 As Byte , I As Byte
    
    On Timer0 Wyswietlacze
    Start Adc
    Enable Interrupts
    Enable Timer0
    Load Timer0 , 125
    Do
    L1 = I
    L2 = I
    Incr I
    
    If I = 10 Then
    I = 0
    
    Waitms 500
    Loop
    End If
    
    
    
    
    Do
    Odczyt = Getadc(0)
    
    Loop
    End
    
    Do
    If Odczyt = 257 Then
    Temp = 85
    If Odczyt = 297 Then
    Temp = 80
    If Odczyt = 346 Then
    Temp = 75
    If Odczyt = 385 Then
    Temp = 70
    If Odczyt = 436 Then
    Temp = 65
    If Odczyt = 490 Then
    Temp = 60
    If Odczyt = 538 Then
    Temp = 55
    If Odczyt = 590 Then
    Temp = 50
    If Odczyt = 632 Then
    Temp = 45
    If Odczyt = 687 Then
    Temp = 40
    If Odczyt = 736 Then
    Temp = 35
    If Odczyt = 785 Then
    Temp = 30
    If Odczyt = 824 Then
    Temp = 25
    If Odczyt = 859 Then
    Temp = 20
    Loop
    End If
    End If
    End If
    End If
    End If
    End If
    End If
    End If
    End If
    End If
    End If
    End If
    End If
    End If
    
    
    
    Sub Wart_temp(temp As Byte)
    Temp = Temp And &B00001111
    Portd = Portd And &B11110000
    Portd = Portd Or Temp
    End Sub
    
    Wyswietlacze:
     Load Timer0 , 125
     Set W1
     Set W2
     Select Case Nr_wys
    
     Case 2:
     Call Wart_temp(l1)
     Reset W1
    
     Case 2:
     Call Wart_temp(l2)
     Reset W2
    
     End Select
     Incr Nr_wys
     If Nr_wys = 2 Then
     Nr_wys = 1
    
    End If
    Return
  • REKLAMA
  • #4 8034734
    tadzik85
    Poziom 38  
    Obsługa przerwania powinna być bez pętli a już na pewno bez czekania 500ms.

    Przerwaniu masz wystawić jedynie na wyświetlacz wartość i włączyć wyświetlacz 1. w kolejnym włączasz 2 wyświetlacz
  • #5 8034792
    rrytel
    Poziom 14  
    wg mnie błędny jest ten fragment ponieważ nie uwzględniasz wartości np pomiędzy 257-297.
    Regan_3000 napisał:


    ...
    Do
    If Odczyt = 257 Then
    Temp = 85
    If Odczyt = 297 Then
    Temp = 80
    If Odczyt = 346 Then
    Temp = 75
    
    ...

    ja bym napisał coś w tym stylu

    ...
    Do
    If Odczyt < 257 Then
    Temp = 85
    ELSE If Odczyt < 297 Then
    Temp = 80
    ELSE If Odczyt < 346 Then
    Temp = 75
    
    ...
  • REKLAMA
  • #7 8035574
    mpietras
    Poziom 17  
    nie rozumiem konstrukcji:

    
    Do 
    ...
    If I = 10 Then 
    I = 0 
    ....
    Loop 
    End If 
    
    
    
    Do 
    ...
    Loop 
    End 
    
    Do 
    If Odczyt = 257 Then 
    Temp = 85 
    If Odczyt = 297 Then 
    Temp = 80
    ... 
    Loop 
    End If 
    End If 
    ...
    


    To się da skompilować? Bo działać poprawnie raczej nie będzie

    Temperaturę obliczyłbym ze wzoru:

    temp=111-0,1*odczyt

    i nie bawił się w żadne kejsy i ify w tym miejscu.

    Kejsy dałbym przy wyborze zapalonych segmentów.
  • REKLAMA
  • #8 8036000
    Regan_3000
    Poziom 15  
    Pisząc ten program posiłkowałem się książką "BASCOM AVR" i fragment:
    Osobiście nie rozumiem procedury:
    Sub Wart_temp(temp As Byte)
    Temp = Temp And &B00001111
    Portd = Portd And &B11110000
    Portd = Portd Or Temp
    End Sub 
  • #9 8036081
    tadzik85
    Poziom 38  
    Sub Wart_temp(temp As Byte)
    Temp = Temp And &B00001111  // zerujesz starsza polowe bajtu temperatury
    Portd = Portd And &B11110000  //  zerujesz młodsze bity portu
    Portd = Portd Or Temp             // po powyższym młodsze bity portu = młodszym temperatury
    End Sub 
  • #10 8036114
    mpietras
    Poziom 17  
    Najpierw spróbuj wyświetlić jakiekolwiek liczby. Będziesz wiedział, że działa multiplexowanie. Potem popracujesz nad resztą.
  • #11 8036170
    Regan_3000
    Poziom 15  
    Wykryłem małe błędy i zmieniłem to co doradziliście w programie i wyświetlacz ruszył ale cały program nie...

    Zmieniłem:

    Do
    Select Case Odczyt
    
    Case 257 :
    Temp = 85
    Case 297 :
    Temp = 80
    Case 346 :
    Temp = 75
    Case 385 :
    Temp = 70
    Case 436 :
    Temp = 65
    Case 490 :
    Temp = 60
    Case 538 :
    Temp = 55
    Case 590 :
    Temp = 50
    Case 632 :
    Temp = 45
    Case 687 :
    Temp = 40
    Case 736 :
    Temp = 35
    Case 785 :
    Temp = 30
    Case 824 :
    Temp = 25
    Case 859 :
    Temp = 20
    End Select
    Loop
    


    Wyswietlacze:
     Load Timer0 , 125
     Set W1
     Set W2
     Select Case Nr_wys
    
     Case 1:
     Call Wart_temp(l1)
     Reset W1
    
     Case 2:
     Call Wart_temp(l2)
     Reset W2
    
     End Select
     Incr Nr_wys
     If Nr_wys = 3 Then
     Nr_wys = 1
    
    End If
    Return



    Przypisałem wartości liczbowe zmiennym L1 i L2 i cyfry były poprawnie wyświetlane więc multipleksowanie działa teraz problem jest chyba w podprogramie obsługi odczytania wartości z wejścia A/C.
  • #12 8036245
    mpietras
    Poziom 17  
    dołóż do kejsów

    
    case else:
    temp = 88
    


    i daj znać co widać.

    Zajrzyj też do pomocy od bascom'a to Ci się trochę rozjaśni. Znajdziesz tam odpowiednie przykłady.
  • #13 8036321
    Regan_3000
    Poziom 15  
    Już się udało zrobiłem to tak:

    Do
    Odczyt = Getadc(0)
    
    Select Case Odczyt
    
    Case 0 :
    L1 = 1 : L2 = 1
    
    Case 257 To 296 :
    L1 = 5 : L2 = 8
    Case 297 To 345 :
    L1 = 0 : L2 = 8
    Case 346 To 384 :
    L1 = 5 : L2 = 7
    Case 385 To 435 :
    L1 = 0 : L2 = 7
    Case 436 To 489 :
    L1 = 5 : L2 = 6
    Case 490 To 537 :
    L1 = 0 : L2 = 6
    Case 538 To 589 :
    L1 = 5 : L2 = 5
    Case 590 To 631 :
    L1 = 0 : L2 = 5
    Case 632 To 686 :
    L1 = 5 : L2 = 4
    Case 687 To 735 :
    L1 = 0 : L2 = 4
    Case 736 To 784 :
    L1 = 5 : L2 = 3
    Case 785 To 823 :
    L1 = 0 : L2 = 3
    Case 824 To 858 :
    L1 = 5 : L2 = 2
    Case 859 To 1000 :
    L1 = 0 : L2 = 2
    End Select
    Loop
    End
    


    Teraz tylko musze wyskalować z tymi pomiarami bo pokazuje mi temperature o 10 stopni za dużo.
  • #14 8036967
    mpietras
    Poziom 17  
    ja bym temeraturę obliczył tak:

    
    Dim L1 As Byte , L2 As Byte , Temp As Single
    Dim Odczyt As Word , Wynik As Single
    
    Wynik = 0.1 * Odczyt
    Temp = 100 - Wynik
    Wynik = Temp / 10
    L2 = Fix(wynik)
    Wynik = L2 * 10
    Wynik = Temp - Wynik
    L1 = Fix(wynik)
    


    masz co stopień
  • #15 8038432
    Regan_3000
    Poziom 15  
    mpietras Twój pomysł nie jest zły. Problem jest taki, że pozostałe segmenty migają ale liczba się świeci tylko reszta miga. Trzeba się wpatrzyć ale widać cyfre wśród migających kreseczek:P
  • #16 8040384
    Regan_3000
    Poziom 15  
    Program skończony:) Pozmieniałem co nieco w twoim pomyśle mpietras i układ ładnie pokazuje temp z dokładnością do jednego stopnia bo tyle ino potrzebuje.
    Zrobiłem to tak:
    Do
    
    
    Odczyt = Getadc(0)
    
    Wynik = 0.1 * Odczyt
    Temp = 98 - Wynik
    Wynik3 = Temp / 10
    L2 = Int(wynik3)
    Wynik1 = Wynik3 - L2
    L1 = Wynik1 * 10
    
    Loop


    Temat można zamknąć i dzięki za pomoc pozdrawiam.
REKLAMA