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

[Attiny2313][Bascom]Licznik rowerowy/motocyklowy wyswietlacz led

MatBas07 20 Lip 2011 21:04 2317 8
REKLAMA
  • #1 9740050
    MatBas07
    Poziom 14  
    Witam. Założenie jest proste czyli zwykły licznik w zakresie 0 - 99 km/h. Czujnikiem ma być powiedzmy kontaktron. Niestety mam problem z napisaniem programu.
    Wg mojej koncepcji przerwanie od timera ma zwiekszać stan zmiennej co 1ms. Po wykryciu sygnału od czujnika wartość czasu ma być przepisana do kolejnej zmiennej i dalej liczona dopiero predkość znając stała drogę s, tj 2,05m.
    Oto kod:
    
    $crystal = 4000000
    
    Config Portb = &B11111111
            Portb = &B11111111
    Config Portd = &B1111100
            Portd = &B1111111
    
    Config Timer0 = Timer , Prescale = 64
    Enable Timer0
    Enable Interrupts
    On Timer0 Co1ms
    Dim Liczba As Single
    Dim Ktorywysw As Bit
    Dim Lol As Byte
    Dim Jednostki As Byte
    Dim Dziesiatki As Byte
    Dim Pomoc As Bit
    Dim Aaa As Word
    Dim Bbb As Word
    Dim Ddd As Byte
    Dim Ccc As Byte
    Pomoc = 1
    Ktorywysw = 1
    
    Co1ms:
    Timer0 = 193                                                'co 1ms przerwanie od timera0
    Incr Aaa
    If Aaa = 60000 Then Aaa = 0                                 'co 1ms zwiekszenie stanu licznika
    Portd = 0000011
    If Ktorywysw = 1 Then                                       'obsluga wyswietlaczy led
    Ktorywysw = 0
    Portd.5 = 1
    Portb = Lookup(ddd , Tabela)
    Else:
    Portd.3 = 1
    Portb = Lookup(ccc , Tabela)
    End If
    Return
    
    Do
    If Pind.0 = 0 Then                                          'jesli pin zwarty do masy zmienna BBB przyjmuje wartosc zmiennej AAA
    If Pomoc = 1 Then
    Bbb = Aaa
    Pomoc = 0
    Else
    Pomoc = 1
    End If
    End If
    Liczba = 2050 \ Bbb                                         'obliczanie predkosci tj V=s/t poniewaz czas w ms wiec droga 1000 razy większa
    Liczba = Liczba * 3.6                                       'zamiana jednostek tj z m/s na km/h
    Liczba = Liczba \ 1                                         'dzielenie przez 1 z uzyciem"\" zamiast / w celu przyblizenia do jednosci
    Lol = Liczba                                                'przepisanie do zmiennej byte
    Dziesiatki = Makebcd(lol)                                   'przygotowanie do wyswietlenia na led
    Jednostki = Dziesiatki And 15
    Shift Dziesiatki , Right , 4
    Ccc = Dziesiatki
    Ddd = Jednostki
    Aaa = 0
    Loop
    End
    
    Tabela:
    Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144
    

    Niestety przy zwieraniu pinu do masy na wyswietlaczach ciągle widnieje 00.
    Widzi ktoś błąd? Próbowałem prędzej zaokrąglać za pomocą polecenia Round i bez rezultatu.
  • REKLAMA
  • #2 9740118
    snnaap
    Poziom 25  
    Kod: text
    Zaloguj się, aby zobaczyć kod



    w pętli głównej programu cały czas do zmiennej Aaa wpisujesz 0,
    co znaczy zmienna pomoc?

    Moim zdaniem pętla główna powinna wyglądać tak:

    Kod: text
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #3 9740174
    MatBas07
    Poziom 14  
    Zmienna pomoc jest po to aby aby wykrycie sygnału wystąpiło tylko raz a nie np. przez 100 cykli procesora, czyli po prostru zwarcie do masy przez czujnik trwa dłużej niż cykl zegarowy. Zaraz zobacze twoją wersje.
  • REKLAMA
  • #4 9740203
    snnaap
    Poziom 25  
    Cytat:
    Zmienna pomoc jest po to aby aby wykrycie sygnału wystąpiło tylko raz a nie np. przez 100 cykli procesora, czyli po prostru zwarcie do masy przez czujnik trwa dłużej niż cykl zegarowy. Zaraz zobacze twoją wersje.


    Po wykryciu sygnału od czujnika odczekaj 10ms i sprawdź jeszcze raz czy Pind.0 = 0, jeżeli dalej będzie zero rozpocznij procedurę przeliczania wyniku.
  • #5 9740224
    MatBas07
    Poziom 14  
    Wiem że tak można ale to nie w tym problem raczej.
  • REKLAMA
  • #7 9740306
    MatBas07
    Poziom 14  
    Tak nic to nie dało. Problem leży raczej w obliczeniach.
  • #9 9741712
    MatBas07
    Poziom 14  
    Dzięki kologo naprowadziłeś mnie na dobrą drogę. Po co procek ma ciągle liczyć predkość skoro wystarczy raz podczas odebrania sygnału ;)
    Twój kod niestety dalej nie działał ale dziś troche się pomęczyłem i chyba osiągnęłem swój cel.
    Wklejam dzałający program, może komuś się przyda :
    
    $regfile = "attiny2313.dat"
    $crystal = 4000000
    
    Config Portb = &B11111111
            Portb = &B11111111
    Config Portd = &B1111100
            Portd = &B1111111
    
    Config Timer0 = Timer , Prescale = 64
    Enable Timer0
    Enable Interrupts
    On Timer0 Co1ms
    Dim Liczba As Single
    Dim Ktorywysw As Bit
    Dim Lol As Byte
    Dim Jednostki As Byte
    Dim Dziesiatki As Byte
    Dim Pomoc As Bit
    Dim Aaa As Word
    Dim Bbb As Word
    Dim Ddd As Byte
    Dim Ccc As Byte
    Pomoc = 1
    Ktorywysw = 1
    Ddd = 0
    Ccc = 0
    
    Do
    If Pind.0 = 0 And Pomoc = 1 Then                            'jesli pin zwarty do masy zmienna BBB przyjmuje wartosc zmiennej AAA
    Pomoc = 0
    Bbb = Aaa
    Aaa = 0
    Pomoc = 0
    Liczba = 2050 \ Bbb                                         'obliczanie predkosci tj V=s/t poniewaz czas w ms wiec droga 1000 razy większa
    Liczba = Liczba * 3.6                                       'zamiana jednostek tj z m/s na km/h
    Liczba = Liczba \ 1                                         'dzielenie przez 1 z uzyciem"\" zamiast / w celu przyblizenia do jednosci
    Lol = Liczba                                                'przepisanie do zmiennej byte
    Dziesiatki = Makebcd(lol)                                   'przygotowanie do wyswietlenia na led
    Jednostki = Dziesiatki And 15
    Shift Dziesiatki , Right , 4
    Ccc = Dziesiatki
    Ddd = Jednostki
    End If
    If Pind.0 = 1 Then
    Pomoc = 1
    End If
    Loop
    End
    
    Co1ms:
    Timer0 = 193                                                'co 1ms przerwanie od timera0
    Incr Aaa
    If Aaa = 60000 Then Aaa = 0
    Portd = &B1111111
    Toggle Ktorywysw                                            'co 1ms zwiekszenie stanu licznika
    If Ktorywysw = 1 Then                                       'obsluga wyswietlaczy led
    Portd.5 = 0
    Portb = Lookup(ddd , Tabela)
    End If
    If Ktorywysw = 0 Then:
    Portd.4 = 0
    Portb = Lookup(ccc , Tabela)
    End If
    Return
    
    Tabela:
    Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144
    
REKLAMA