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

Problem z programem do uC(Terminal Emulator, Bascom)

treker 28 Mar 2006 19:52 1928 13
  • #1 2468319
    treker
    Poziom 25  
    Posty: 969
    Pomógł: 31
    Ocena: 250
    Witam !!
    Mam taki problem chciałbym napisać program(programóje w Bascom właściwie to się ucze), który zliczałby ilość załączenia przycisku1 i przycisku2
    (czujnik lewy, czujnik prawy)
    i zliczanie ile czsu na
    Portb.0 = 1 'lewy silnik przód
    Portb.1 = 0
    Portb.2 = 1 'prawy silnik przód
    Portb.3 = 0

    i ile czasu

    Portb.0 = 0 'lewy silnik tył
    Portb.1 = 1
    Portb.2 = 0 'prawy silnik przód
    Portb.3 = 1

    I chodzi o to żeby wyświetlało to na "Terminal Emulator"
    Procesor który używam to Attiny2313 (2kb flash)
    Może to być tak, że nie dopisuje tego do pamięci flash tylko do RAM (nie jestem pewien czy to możliwe)
    i wtedy ta pamięć trzymała by te informacje do wyłączenia zasilania, ale mi to nie przeszkadza
    Miało by to na Terminal Emulator wyglądac mniej więcej tak:
    *******Robot***********
    Czujnik Lewy ....(i tu ilość załączenia)
    Czujnik Prawy ....(i tu ilość załączenia)
    -------------------------------------------
    Czas jazdy do przodu ....(i tu czas jazdy w przód)
    Czas jazdy do tyłu ....(i tu czas jazdy w przód)
    **************************************************
    I to koniec nie wiem czy jest to możliwe z tym czasem jeśli nei to dobrze by było gdyby chociarz czas
    włączenia pokazywało.
    Nazrazie mój program wygląda tak(ale to tylko jazda w przód, tył, lewo i prawo, bez Terminal Emulator):
    Config Portb = &B11111111 'Wszystkie jako wyjścia
    Portb = &B11111111 'Wszędzie stan spoczynkowy 1
    Config Portd = &B11111000 'Trzy najmłodsze jako wejścia
    Portd = &B11111111
    Do
    Portb.0 = 1 'Silnik lewy na przód ON
    Portb.1 = 0
    Portb.2 = 1 'Silnik prawy na przód ON
    Portb.3 = 0



    If Portd.0 = 0 Then 'Jeśli czujnik lewy wykryje przeszkode
    Portb.0 = 0 'silnik lewy OFF
    Portb.1 = 0
    Portb.2 = 0 'silnik prawy OFF
    Portb.3 = 0
    Wait 1 'Stój 1 sekunde
    Portb.0 = 0 'silnik lewy do tyłu ON
    Portb.1 = 1
    Portb.2 = 0 'silnik prawy do tyłu ON
    Portb.3 = 1
    Wait 2 'jedź w tył 2 sekundy
    Portb.0 = 1 'silnik lewy na przód ON
    Portb.1 = 0
    Portb.2 = 0 'silnik prawy w tył ON
    Portb.3 = 1
    Wait 2
    End If


    If Portd.1 = 0 Then 'Jeśli czujnik prawy wykryje przeszkode
    Portb.0 = 0 'silnik lewy OFF
    Portb.1 = 0
    Portb.2 = 0 'silnik prawy OFF
    Portb.3 = 0
    Wait 1 'Stój 1 sekunde
    Portb.0 = 0 'silnik lewy do tyłu ON
    Portb.1 = 1
    Portb.2 = 0 'silnik prawy do tyłu ON
    Portb.3 = 1
    Wait 2 'jedź w tył 2 sekundy
    Portb.0 = 0 'silnik lewy w tył ON
    Portb.1 = 1
    Portb.2 = 1 'silnik prawy na przód ON
    Portb.3 = 0
    Wait 2

    End If

    If Portd.1 = 0 And Portd.0 = 0 Then 'Jeśli oby dwa czujniki wykryja przeszkode
    Portb.0 = 0 'silnik lewy OFF
    Portb.1 = 0
    Portb.2 = 0 'silnik prawy OFF
    Portb.3 = 0
    Wait 1 'Stój 1 sekunde
    Portb.0 = 0 'silnik lewy do tyłu ON
    Portb.1 = 1
    Portb.2 = 0 'silnik prawy do tyłu ON
    Portb.3 = 1
    Wait 2 'jedź w tył 2 sekundy
    Portb.0 = 0 'silnik lewy w tył ON
    Portb.1 = 1
    Portb.2 = 1 'silnik prawy na przód ON
    Portb.3 = 0
    Wait 4

    End If



    Loop 'Koniec pętli nie skończonej

    End 'koniec programu

    Moderowany przez McRancor:

    Przeniesiono do właściwego działu

  • #2 2468356
    wlamywacz2004
    Poziom 17  
    Posty: 279
    Pomógł: 10
    Ocena: 1
    W helpie BASCOMU masz to ładnie opisane poszukaj uart
  • #3 2471131
    treker
    Poziom 25  
    Posty: 969
    Pomógł: 31
    Ocena: 250
    Dobra czytałem ale nie wiem jak to zrobić z ejeś li czujnik jeden załączony to zeby to zwiększłao o jeden tą wartość i zapisywało to apotem wyświetlało
  • #4 2471517
    M. S.
    Poziom 34  
    Posty: 2107
    Pomógł: 259
    Ocena: 680
    Najpierw trzeba poprawić program, bo jeśli jest to napęd do robota omijającego przeszkody to raczej wyjdzie z tego taran! Powód jest taki, że żaden z warunków ominięcia przeszkody nie będzie nigdy spełniony. Portd.0 i Portd.1 będą = 1 bo tak zostało to ustalone na początku programu i żadne zwieranie końcówek PD0 i PD1 do masy nie pomoże. Stan końcówek AVR'ów odczytuje się w rejestrze Pind.x (w tym przypadku Pind.0 i Pind.1). Po pierwsze zatem trzeba zmienić w instrukcjach If - Then Portd.0 na Pind.0, a Portd.1 na Pind.1. Teraz już są jakieś szanse na poprawne zachowanie się bestii. Niestety o terminalu można narazie zapomnieć. Powód jest taki, że czujniki przeszkody podłączyliśmy do wejścia i wyjścia UART. Trzeba zatem zwolnić końcówki PD0 i PD1, bo właśnie tu trzeba będzie podłączyć konwerter napięć (np. MAX 232), poprzez który podłączymy się do PC'ta. Czujniki zatem trzeba podłączyć do innych końcówek. Jeżeli będą przełącznikami normalnie rozwartymi to można wykorzystać końcówki MOSI i MISO, bo przełączniki nie będą przeszkadzać w programowaniu. Do komputera będziemy wysyłać dane za pomocą instrukcji PRINT (zobacz help) - najlepiej po spełnieniu warunku zwarcia wyłącznika czyli po If - inaczej dane zasypią ekran. Po If trzeba wstawić także instrukcję Incr zmienna. Zmienną zmienna trzeba wcześniej zadeklarować. Zmiennych może być więcej np osobne do każdego czujnika. W ten sposób można zliczać i wyświetlać ilość zadziałań poszczególnych czujników. A jak zmienne te się doda to także ich sumę.
    Póki co wystarczy. Uff.
  • #5 2471839
    treker
    Poziom 25  
    Posty: 969
    Pomógł: 31
    Ocena: 250
    No tak to z Port i Pin to głupi błąd czuniki są podłączone do tych Pinów bo tos tary projekt bez UART. Tyklo nie wiem czy tak mnie zrozumieliści ale chodiz mi oto ze by komputer i robot NIE był połączony ciągle z PC tylko po skończeniu trasy
  • #6 2472267
    M. S.
    Poziom 34  
    Posty: 2107
    Pomógł: 259
    Ocena: 680
    uC ma swój autonomiczy program. Jeśli będzie wysyłał dane przez UART w próżnię to nic się nie stanie. Można jeszcze pokusić się o wysłanie danych do PC po wciśnięciu przycisku lub lepiej zaprogramować komputer PC aby wysłał do uC sygnał "chęci" odebrania danych (transmisja jest dwukierunkowa). Być może ktoś wymyśli coś lepszego bo ja UART'u bardzo dokładnie nie znam. Jak coś wymyślę to dam znać.
  • #7 2473674
    treker
    Poziom 25  
    Posty: 969
    Pomógł: 31
    Ocena: 250
    Dobra widze że napoczatek sobie ztym nie dam rady więc prosze o rade jaka zrobic taki program
    ,że PC i Robot jest ciągle ze soba połączony kabel około 5-10m i teraz tak jeśli na (na przykałd)
    Pind.4 = 0 Then
    i co dalej na terminal emulator ma sie wyświtelic "Czujnik Prawy" i potem ilość załączenie tego czujnika a problem mam z tym że nie
    wiem jak zrobić to zeby doliczało ilość włączeń
  • Pomocny post
    #8 2480156
    M. S.
    Poziom 34  
    Posty: 2107
    Pomógł: 259
    Ocena: 680
    Jeśli masz warunek:
    If Portd.0 = 0 Then 'Jeśli czujnik lewy wykryje przeszkode
    Portb.0 = 0 'silnik lewy OFF
    Portb.1 = 0
    Portb.2 = 0 'silnik prawy OFF 
    .......

    To po If Then wstaw Incr Lewy
    czyli tak:
    If Portd.0 = 0 Then 'Jeśli czujnik lewy wykryje przeszkode
    Incr Lewy 'Zmienna Lewy będzie powiększana jeżeli zadziała czujnik lewy
    Portb.0 = 0 'silnik lewy OFF
    Portb.1 = 0
    Portb.2 = 0 'silnik prawy OFF 
    ......


    Dla prawego czujnika zastosuj zmienną np. Prawy w identyczny sposób. Możesz w obu przypadkach użyć zmiennej np. Czujnik. Wtedy każde zadziałanie czujnika będzie ją zwiększało o 1 (Incr - zwiększ o 1, Decr - zmniejsz o 1)
    Po Incr możesz wstawić Print "Zadziałał czujnik ";Czujnik;" razy"
    lub Print "Zadziałał czujnik lewy ";Lewy;" razy" Tak samo z prawym.
    Print wysyła dane poprzez UART. Dane będą aktualizowane po każdym zadziałaniu czujnika.

    Ostatecznie:
    If Portd.0 = 0 Then 'Jeśli czujnik lewy wykryje przeszkode
    Incr Lewy 'Zmienna Lewy będzie powiększana jeżeli zadziała czujnik lewy
    Print "Zadziałał czujnik lewy ";Lewy;" razy"
    Portb.0 = 0 'silnik lewy OFF
    Portb.1 = 0
    Portb.2 = 0 'silnik prawy OFF 
    ......


    Nie zapomnij zadeklarować nowych zmiennych! Poczytaj help'a!
  • #9 2480846
    treker
    Poziom 25  
    Posty: 969
    Pomógł: 31
    Ocena: 250
    Dzięki teraz już wszystko jasne

    Dodano po 1 [minuty]:

    TYlko teraz robi etego robotka i niewiem co jet lepsze może mi doradzicie LCD 2x16zanków czy RS232
  • #10 2485036
    M. S.
    Poziom 34  
    Posty: 2107
    Pomógł: 259
    Ocena: 680
    Gdyby napisać program na PC to byłoby to ciekawe. Program do komunikacji z uC napisałem kiedyś w Visual Basicu. Był to panel sterowania CB radiem. Komunikacja była bardzo dobra, brakło tylko czasu na część radiową.
  • #11 2488058
    treker
    Poziom 25  
    Posty: 969
    Pomógł: 31
    Ocena: 250
    Już sobie troche poradziłem nei miałem zbyt czsu więc mam tylko 1/2 programu oto ona czy wszytko ejst dobrze??
    Config Portb = &B11111111 'Wszystkie jako wyjścia
    Portb = &B11111111 'Wszędzie stan spoczynkowy 1
    Config Portd = &B11111100 'Dwa najmłodsze jako wejścia
    Portd = &B11111111
    Dim Lewy As Byte , Prawy As Byte , Oba As Byte
    Cls
    Print " Welcom to"
    Waitms 50
    Print "****L.E.M.I*****"
    Wait 1
    Print "Power by Treker"
    Cls
    Wait 1
    Cls
    Print "Ilość wykrytych przeszkud przez czujnik lewy to " ; Lewy ; ""
    Print "Ilość wykrytych przeszkud przez czujnik prawy to " ; Prawy ; ""
    Print "Ilość wykrytych przeszkud przez obydwa czujniki to " ; Oba ; ""
    Print ""
    Print " START PROGRAMU GŁÓWNEGO"
    Print ""
    Wait 1
    Cls
    Gosub Silnikip 'Silnkip = Silniki na Przód

    Do 'Pętla nieskończona

    If Pind.4 = 0 Then 'jeśli lewy czujnik wykryje przeszkode
    Gosub Obrotp
    End If


    Loop 'Koniec petli nieskończonej
    End 'koniec programu


    Silnikip:
    Cls
    Print "Jade do przodu"
    Wait 1
    Portd.0 = 0 'Prawy silnik na przód
    Portd.1 = 1
    Portd.2 = 0 'Lewy silnik na przód
    Portd.3 = 1
    Cls
    Return

    Obrotp:

    Cls
    Incr Lewy
    Print " Czujnik lewy wykrył przeszkode"
    Print "Zatrzymuje silniki"
    Portd.0 = 0 'Prawy silnik stop
    Portd.1 = 0
    Portd.2 = 0 'Lewy silnik stop
    Portd.3 = 0
    Wait 1
    Cls
    Print "Cofam.."
    Portd.0 = 1 'Prawy silnik w tył
    Portd.1 = 0
    Portd.2 = 1 'Lewy silnik w tył
    Portd.3 = 0
    Wait 2
    Cls
    Print "Obracam sie o 90 stopni"
    Wait 2

    Return
  • #12 2488874
    M. S.
    Poziom 34  
    Posty: 2107
    Pomógł: 259
    Ocena: 680
    Print "Ilość wykrytych przeszkód przez czujnik lewy to " ; Lewy ; ""
    Print "Ilość wykrytych przeszkód przez czujnik prawy to " ; Prawy ; ""
    Print "Ilość wykrytych przeszkód przez obydwa czujniki to " ; Oba ; ""


    Ten fragment nie ma sensu bo będzie raz wykonany po włączeniu układu kiedy zmienne i tak będą równe 0.
    Proponuję podawać ilość wykryć przeszkód w obsługujących je podprogramach.
  • #13 2489742
    treker
    Poziom 25  
    Posty: 969
    Pomógł: 31
    Ocena: 250
    Upss sorry to nie ten program bo w tym właściwym mam to żeby dodawało <upss> a to była taka wersja robocza:/
  • #14 2503871
    treker
    Poziom 25  
    Posty: 969
    Pomógł: 31
    Ocena: 250
    :/ kupiłem ten MAX232 ale to cieżka sprawa dużo roboty z tym i tu moje pytanie czy jak na początek to jest sens w zastosowaniu na początek zamiast MAX232 na tranzystorach bc516 bc548B i 2 rezystorach 10k schemat taki znalazłem w ksiażce Piotra Góreckiego "Mikrokontrolery dla początkujących"

Podsumowanie tematu

✨ Dyskusja dotyczy problemu z napisaniem programu w Bascom dla mikrokontrolera Attiny2313, który miałby zliczać ilość załączeń dwóch przycisków (czujników lewy i prawy) oraz mierzyć czas pracy silników sterowanych sygnałami na portach Portb.0-3. Użytkownik chce wyświetlać te dane na Terminal Emulator, jednak napotyka trudności z implementacją zliczania i transmisji danych przez UART. Wskazano, że do odczytu stanów wejść należy używać rejestru Pind, a nie Portd, oraz że piny PD0 i PD1 są wykorzystywane przez UART i nie powinny być zajęte przez czujniki. Zaproponowano, aby robot i komputer były połączone kablem RS232 na stałe, a transmisję danych realizować dwukierunkowo, np. na żądanie PC. Podano przykład użycia instrukcji Incr do zliczania załączeń czujników i Print do wysyłania danych przez UART. Poruszono też kwestię wyboru wyświetlacza LCD 2x16 znaków lub komunikacji RS232 do prezentacji danych. Na koniec pojawiło się pytanie o możliwość zastąpienia układu MAX232 prostszym układem z tranzystorami BC516 i BC548B oraz rezystorami, co jest rozważane jako rozwiązanie dla początkujących.
Wygenerowane przez model językowy.
REKLAMA