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, zapamiętanie liczb z BCD.

lukashb 30 Gru 2008 21:35 2215 13
REKLAMA
  • #1 5925970
    lukashb
    Poziom 39  
    Witajcie, mam problem tego rodzaju, iż zbudowałem na MT8870 dekoder DTMF, przesyłam dane do Atmegi8 do odpowiednio skonfigurowanych portów, odczytuję ich stany za pomocą instrukcji IF...THEN i LCD "liczba" i to się sprawdza przy pojedyńczych liczbach, i tu się zaczyna problem.
    Potrzeba mi zapamiętać max. 4 liczby które będą następować po sobie dość szybko jednak Atmega potrafi je zdekodować bo jak dobrze się przypatrzę to liczby się zmieniają dobrze, i więc właśnie niech ktoś podpowie, co dopisać by procesor zapamiętał liczby i ustawił je kolejno po sobie?? czy jest to łatwe do zrobienia? moja wiedza o programowaniu kończy się na prostych operacjach, a szukaj nie działa aktualnie i nie moge nic wyszukać, niech ktoś podpowie. Język programowania to Bascom, Atmega8 na zewn. kwarcu 8MHz Pozdrawiam serdecznie i proszę nie krzyczec na mnie ;).
  • REKLAMA
  • Pomocny post
    #2 5926986
    leszek1550
    Poziom 15  
    Witam.
    http://www.elportal.pl/ea/arch/bascavr.zip
    To jest adres polskiego helpa. Poczytaj. Najlepiej odebrane liczby wrzucaj w pętli do tablicy. Odczytujesz z tablicy podając pozycję liczby. W helpie powinny być przykłady użycia poleceń.
  • REKLAMA
  • Pomocny post
    #3 5927052
    dawid512
    Poziom 32  
    Kiedyś robiłem coś podobnego i wykorzystałem taki sposób.
    Zrobiłem sobie flagę która informowała mnie że odebrałem liczbę. Potem prosty warunek typu:
    If odebrano = 1 then
    a=odebrana_liczba
    do
    If odebrano = 1 then
    b= odebrana_liczba
    gosub label1
    end if
    end if
    loop


    W podprogramie label1 miałem pętlę w której był sprawdzany warunek odbioru itd. aż do odebrania 4 liczb. Z tego co pamiętam to występowały jakieś opóźnienia pomiędzy zapisaniem jednej i drugiej liczby.
  • #4 5928717
    lukashb
    Poziom 39  
    Przeczytałem helpa, przeczytałem o instrukcji a także to co koledzy podpowiedzieli próbowałem przemyśleć, ale zgłupiałem doszczętnie. Mój program wygląda tak, daję tylko przykład dla liczby np. 3 ponieważ zbyt dużo było by dla każdej pisać
    
    Cursor off
    Config portd.5=input
    Config portd6=input
    Config portd.7=input
    Config portb.0=input
    portd.5=1
    portd.6=1
    portd.7=1
    portb.0=1
    Cls
    Do
    Waitms 5
    if pind.5=0 then
    if pind.6=0 then
    if pind.7=1 then
    if pinb.0=1 then
    Cls
    LCD "3"
    End if
    End if
    End if
    End if
    loop
    

    tak wygląda mój program rozbudpwany o kolejne liczby, i pojedyńcze wyłapuje ładnie, a jak poleci serią liczb to się zbyt szybko zmieniają ale są zauważalne. Gdzie wrzucic albo co przerobić, a moze źle podszedłem do tematu sprawdzając porty, może właśnie powinno być użyte .Proszę o odpowiedź ponieważ wymiękłem. Pozdrawiam ;)
  • Pomocny post
    #5 5929405
    zumek
    Poziom 39  
    lukashb napisał:
    Proszę o odpowiedź ponieważ wymiękłem.)

    A jak masz podłączone linie Q1-Q4 i StD - z kodu trudno wywnioskować :?:
  • Pomocny post
    #8 5933439
    K_o_n_r_a_d
    Poziom 23  
    Przeczytałem to co jest wyżej napisane i... nie rozumiem co chcesz zrobić :)
    Co to znaczy:
    Cytat:
    Potrzeba mi zapamiętać max. 4 liczby które będą następować po sobie dość szybko jednak Atmega potrafi je zdekodować bo jak dobrze się przypatrzę to liczby się zmieniają dobrze, i więc właśnie niech ktoś podpowie, co dopisać by procesor zapamiętał liczby i ustawił je kolejno po sobie??
    Patrząc na kod który podałeś dalej rozumiem, że chcesz je po prostu wyświetlić? Czy może chcesz 4 liczby zapisać do jakichś zmiennych a później coś dalej z nimi robic?
    lukashb napisał:
    Przeczytałem helpa, przeczytałem o instrukcji a także to co koledzy podpowiedzieli próbowałem przemyśleć, ale zgłupiałem doszczętnie. Mój program wygląda tak, daję tylko przykład dla liczby np. 3 ponieważ zbyt dużo było by dla każdej pisać
    
    Cursor off
    Config portd.5=input
    Config portd6=input
    Config portd.7=input
    Config portb.0=input
    portd.5=1
    portd.6=1
    portd.7=1
    portb.0=1
    Cls
    Do
    Waitms 5
    if pind.5=0 then
    if pind.6=0 then
    if pind.7=1 then
    if pinb.0=1 then
    Cls
    LCD "3"
    End if
    End if
    End if
    End if
    loop
    

    tak wygląda mój program rozbudpwany o kolejne liczby, i pojedyńcze wyłapuje ładnie, a jak poleci serią liczb to się zbyt szybko zmieniają ale są zauważalne. Gdzie wrzucic albo co przerobić, a moze źle podszedłem do tematu sprawdzając porty, może właśnie powinno być użyte .Proszę o odpowiedź ponieważ wymiękłem. Pozdrawiam ;)
    Zamiast wypisywać wszystkie możliwe liczby w ten sposób wystarczy zadeklarować zmienna typy BYTE i do niej wczytywać wartość, np:
    Dim Zmienna As Byte
    
    Cursor off
    Config Portd.5 = Input
    Config Portd.6 = Input
    Config Portd.7 = Input
    Config Portb.0 = Input
    Portd.5 = 1
    Portd.6 = 1
    Portd.7 = 1
    Portb.0 = 1
    Cls
    Do
       Zmienna = 0
       Zmienna.0 = Pinb.0
       Zmienna.1 = Pind.7
       Zmienna.2 = Pind.6
       Zmienna.3 = Pind.5
       Lcd Zmienna
    Loop
    End
    MAKEBCD służy do zamiany liczby zapisanej normalnie do zapisu w kodzie BCD, więc tu nie jest do niczego potrzebne.

    W ten sposób liczby na wyświetlaczu będą się ciągle zmieniać. Potrzebujesz jakiejś informacji mówiącej kiedy odczytywać. Nie znam układu MT8870, nigdy nie stosowałem. Na szybko, przeglądając notę zauważam, że przydałoby się podłączyć jeszcze pin ESt (stan wysoki podczas poprawnego odczytu kodu i stan niski podczas braku sygnału poprawnego) i do powyższy kod przerobić:
    Est Alias Pind.4
    Dim Zmienna As Byte
    
    Cursor off
    Config Portd.5 = Input
    Config Portd.6 = Input
    Config Portd.7 = Input
    Config Portb.0 = Input
    Portd.5 = 1
    Portd.6 = 1
    Portd.7 = 1
    Portb.0 = 1
    Cls
    Do
       Bitwait Est , Set
       Zmienna = 0
       Zmienna.0 = Pinb.0
       Zmienna.1 = Pind.7
       Zmienna.2 = Pind.6
       Zmienna.3 = Pind.5
       Lcd Zmienna
       Bitwait Est , Reset
    Loop
    End
    A tak w ogóle to przydałoby się to na przerwaniach zrobić, podłączając wyjście ESt do pinu przerwania zewnętrznego. No ale nie wiem czy w ogóle o to chodzi w Twoim problemie :)
  • REKLAMA
  • #9 5934474
    lukashb
    Poziom 39  
    Witaj! Dzięki za odpowiedź, już tłumacze o co chodzi, są urządzenia które wysyłają max. 4 liczby po DTMF-ie, mam je zdekodować, i to się udaje, pojedyńcze liczby się ukazują, ale zamiast otrzymania pojedyńczych cyfr chcę otrzymać liczbę całą wysłaną przez urządzenie czyli np. 1335, nic dalej niechcę robić z tymi liczbami, tylko wyświetlić. Zaraz przejżę przykłady co podałeś i ew. dalej będe pisał. Pozdrawiam i dzięki!
    --------dodano po kilku minutach

    wszystko działa!! Dzięki! tylko jak by się dało jeszcze dodać, by dało się wyświetlić max. 4 liczby, a jak przekroczy 4 pozycję na LCD to zaczyna od 1 chodzi mi o to że np.
    mam teraz tak:
    12345678
    a chcę tak:
    1234
    5678
    itp
    chyba jest to proste do dodania? ale dzięki za pomoc!

    Dodano po 34 [minuty]:

    Zauważyłem mały błąd, 0 jest wyświetlane jako 10 niebardzo wiem czemu, reszta poprawnie.

    ----- a więc jest tak jakoś dziwnie, że 0 widziane jest jako 10, A jako 11, B jako 12, C jako 13 a D jako 0, a 0 jest mi potrzebne i niewiem w czym leży problem niestety.
  • REKLAMA
  • Pomocny post
    #10 5934714
    leszek1550
    Poziom 15  
    Witam !
    To nie jest błąd. Chyba chodzi o zgodność na centralach. O ile się nie mylę to DTMF chodzi w telefonach. Kiedyś przy wybieraniu impulsowym 0 miało 10 impulsów, bo braku impulsów czyli 0 nie można było użyć. Sprawdź w nocie katalogowej czy nie jest to gdzieś zaznaczone.
  • #11 5934730
    lukashb
    Poziom 39  
    No niestety, ale coś w tym jest, tylko co teraz zmienić by dało się obejżeć liczbę np. 0934 a nie 10934, chyba, że niema takiej opcji?? może jakiś warunek, że gdy mamy stan 1010 (szesnastkowy) to wyświetl 0 coś na tej zasadzie?
  • Pomocny post
    #12 5935110
    K_o_n_r_a_d
    Poziom 23  
    Powinno działać tak jak chcesz:
    Est Alias Pind.4
    Dim Zmienna As Byte , Licznik As Byte
    
    Cursor Off
    Config Portd.5 = Input
    Config Portd.6 = Input
    Config Portd.7 = Input
    Config Portb.0 = Input
    Config Portd.4 = Input
    Portd.5 = 1
    Portd.6 = 1
    Portd.7 = 1
    Portb.0 = 1
    Portd.4 = 1
    Cls
    Do
       Bitwait Est , Set
       Zmienna.0 = Pinb.0
       Zmienna.1 = Pind.7
       Zmienna.2 = Pind.6
       Zmienna.3 = Pind.5
       If Zmienna = 10 Then
          Zmienna = 0
       Elseif Zmienna = 0 Then
          Zmienna = 10
       End If
       If Licznik = 4 Then
          Licznik = 0
          Cls
       End If
       Lcd Zmienna
       Incr Licznik
       Bitwait Est , Reset
    Loop
    End
    - zero wyświetlać jako zero (zamieniam 0 na 10 i 10 na 0),
    - wyświetlać po 4 cyfry.

    Dodano po 3 [minuty]:

    Nie wiem czy w końcu ten sygnał ESt działa tak jak mi się wydawało? Wykorzystujesz go?
  • #13 5935152
    lukashb
    Poziom 39  
    Tak, Est działa prawidłowo, wykorzystuję tylko na innym porcie w tym przypadku portd.0 ale to niema znaczenia jaki port i tak przerobię sobie sam. Jutro sprawdzę całośc w działaniu, choć jak narazie mimo tych nie dociągnięć chodzi jak malowane :) Do jutra i dzięki.
REKLAMA