Elektroda.pl
Elektroda.pl
X
Sklep HeluKabel
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[atmega162][bascom] problem z rs232 i komendą inkey

tol2di 21 Cze 2009 17:25 2781 10
  • #1 21 Cze 2009 17:25
    tol2di
    Poziom 11  

    Problem polega na tym, że gdy mam ustawione 9600, data bits 8, stop bits 1, parity none jest wszystko w porządku.Ale jeśli ustawie np 4800 lub coś innego np data bits 7 już nie działa i nie wiem co jest grane. Jak używałem komendy input() wszystko pięknie działało a z inkey() nie chce.


    Code:
    $regfile = "m162def.dat"
    
    'Kwarc 14,7456MHz
    $crystal = 14745600
    $baud = 9600
    '$sim
    '-----------------------------------------------
    .
    .instrukcje
    .
    '-----------------------------------------------
    'komendy ustawiajĻce transmisje na 9600
    Ubrr = 95
    Ucsrc = &B10000110
    '-----------------------------------------------
    .
    .instrukcje
    .
    '-----------------------------------------------
    'pobieranie danych
    Enable Interrupts
          Echo Off
          'Input Odbierz
          Bufor = Ischarwaiting()
          If Bufor = 1 Then
             Znak = Inkey()
             If Znak = "n" Then
                Odbierz = ""
                Do
                   Znak = Inkey()
                   Odbierz = Odbierz + Znak
                Loop Until Znak = Chr(13)
                Nr_ster = Odbierz
                Print Nr_ster
                Waitms 1
             End If
             If Znak = "k" Then
                Odbierz = ""
                Do
                   Znak = Inkey()
                   Odbierz = Odbierz + Znak
                Loop Until Znak = Chr(13)
                Polecenie = Odbierz
                Print Polecenie
                Waitms 1
             End If
             If Znak = "i" Then
                Odbierz = ""
                Do
                   Znak = Inkey()
                   Odbierz = Odbierz + Znak
                Loop Until Znak = Chr(13)
                Czas = Odbierz
                Print Czas
                Waitms 1
             End If
             If Znak = "x" Then
             Do
             Znak = Inkey()
             Loop Until Znak = Chr(13)
             P2 = 1
             Exit Sub
             End If
          End If


    wygląd ramki to n5chr(13)kochr(13)i20chr(13)xchr(13)
    co oznacza
    n - numer urządzenia
    k - komenda
    i - interwał w sekundach
    x - koniec ramki

    0 10
  • Sklep HeluKabel
  • #2 23 Cze 2009 00:07
    rpal
    Poziom 27  

    Można nieco więcej informacji z czym i za pomocą czego to coś się komunikuje ? W jaki sposób stwierdzasz że "nie działa" ? Nee ukrywam bascomem nigdy sie nie interesowałem i musiałbym zacząć przypominać sobie składnię ale jakos może pomogę jeśli podasz więcej szczegółów o nie działaniu :)

    0
  • #3 23 Cze 2009 06:41
    tol2di
    Poziom 11  

    Komunikuje sie z poziomu terminala lub własnej aplikacji na PC z własnej konstrukcji sterowniczkiem załączającym przekaźniki na Atmedze 126.
    Jeśli wpisze do Ubrr i Ucsrc wartości ustawiające np 9600 bitów na sekundę to transmisja po rs232 działa, ale jeśli wprowadzę np. dla 2400 i innych czy nawet zmienię data bits 8 na nap 7 przy 9600 bitów na sekundę sterowniczek nie odpowiada na przesyłaną ramkę. Jak odbierałem dane w sterowniku komendą input() wszystko działało, a przy odbieraniu znak po znaku komenda inkey() juz działa tylko 9600

    0
  • Sklep HeluKabel
  • #4 23 Cze 2009 16:30
    rpal
    Poziom 27  

    Czy prędkości transmisji oraz jej rodzaj nie powinny być takie same po obydwu stronach kabla ? Czyli w PC i Atmega ?

    0
  • #5 23 Cze 2009 17:05
    tol2di
    Poziom 11  

    Może trochę nie jasno napisałem w obydwu przypadkach są takie same ale jak zmieńie w pc i atmedze np na 4800 to lipa pecet wysyła atmega sie nie odzywa

    0
  • #6 23 Cze 2009 19:44
    rpal
    Poziom 27  

    Sprawdzałeś jak się ta transmisja zachowuje kiedy Twoje inkey() w ogóle nie jest używane ? Nie wiem co sobie wkompilowuje Bascom w procesor ale może używa jakiegoś przerwania które z kolei w ten czy inny sposób oddziaływuje na transmisje RS232. Dajmy na to jeśłi RS232 używa przerwań do odbioru lub wysyłania a jakaś inna procedura czy funkcja po wyjściu zmiena stan znacznika globalnego przerwania tym samym może trwale wyłączyć. To są moje przypuszczenia ale tak dla sportu wywal w ogóle inkey i zobacz jak zachowuje się transmisja w te i we wte . Myślę że możesz wtedy zawężyć krąg możliwych błędów.

    0
  • #7 24 Cze 2009 20:41
    tol2di
    Poziom 11  

    sam już nie wiem pogubiłem sie totalnie teraz nawet 9600 przestało reagować, chyba zacznę pisać w c od nowa wszystko

    0
  • #8 24 Cze 2009 21:28
    rpal
    Poziom 27  

    Moim zdaniem taka zasada jest jak najbardziej słuszna i to nie tylko w tej dziedzinie, gdy coś nie wychodzi albo się rozsypuje trzeba zrobić rachunek sumienia i wrócić do punktu A. A na seri to gdy coś idzie nie tak to napisałbym kod do testów który zajmuje się krytyczną częścią programu a potem wzbogacał ją o inne składniki. Ponadto obstawiałbym względy sprzętowe. Czasem "słaba" masa potrafi wprowadzać wiele zamieszania.

    0
  • #9 24 Cze 2009 22:13
    tol2di
    Poziom 11  

    dodatkowy problem w tym że sterownik do którego pisze program musi posiadać możliwość konfiguracji portu rs i chyba bascom nie był najlepszym wyborem do tego typu aplikacji

    0
  • #10 25 Cze 2009 00:17
    rpal
    Poziom 27  

    tol2di napisał:
    dodatkowy problem w tym że sterownik do którego pisze program musi posiadać możliwość konfiguracji portu rs i chyba bascom nie był najlepszym wyborem do tego typu aplikacji

    Co masz na myśli pisząc sterownik ? Czy chodzi o jakiś program na PC-ta czy też twój układ na uP ma mieć możliwość z zmiany swoich praramterów transmisji po RS232. Jeśli ma to byc to drugie załozenie to musisz sobie wykombinować jakiś sposób na wprowadzenie tych nowych ustawień. W każdym razie wydaje mi się że łatwiej założyć sobie prędkość transmisji jako stałą wartość po stronie uP i dopasowywać się do tego po stronie PC-ta bo PC jest tu bardziej elastyczny natomiast w uP wielkość ta zależy od zastosowanego kwarcu i nie można jej sobie dowolnie określać bez uwzględnienia niedopasowania taktowania tej transmisji przez wewnętrzne dzielniki częstotliwości uP. W swoim czasi enapisałem sobie w Visual Basic taki mały programik do testowania połączenia z uP i jak kolega chce to mogę mu to przesłać. Prostackie to bo z jednej strony odbiera dane z uP a drugie pozwala na wklepywanie z ręki kodów w HEX i wysyłania tego w drugą stronę. Można powiedzieć inny rodzaj terminala z Windows. W sporym zakresie mi to pomagało kiedy miałem jakieś problemy z RS232 ale z powodzeniem można używać terminala ktory jest w Windows.
    W ogóle na początek to bym sprawdził poprawność połączeń. NIe wiem jak masz zrobione dopasowanie do RS232 ale podejżewam że na MAX232 więc proponuję zewrzeć jego wyjścia na uP czyli TXD i RDX i w terminalu posłać coś w jego stronę. Jeśli to tego miejsca kontrukcji wszystko będzie OK dostaniesz echo na ekranie komputera i możesz szukać błędów dalej. A błędy w połączeniach są dość częste. Kiedyś użyłem gotowego projektu na płytkę uniwersalną dla ATMEGA64 niejakiego Ulricha Radiga no i na koniec okazało się autor zrobił lustrzane odbicie gniazdka DSUB szkoda pisać ile czasu głowiłem się czemu nie mam poprawnej transmisji a skończyło się tym że w kablu null modemowym musiałem przelutowywać kable czyli w sumie drobiazg :)

    0
  • #11 25 Cze 2009 06:29
    tol2di
    Poziom 11  

    nie no tarnsmisja działa jeśli chodzi o stronę sprzętu gorzej z oprogramowaniem dla atmegi (sterownika) które też działało i w miarę rozwijania jego możliwości umarła mu komunikacja po rs 232 który z czasem miał być zastąpiony na rs 485

    a zmiane konfiguracji rs - a wykonywałem poprzez zmiane wpisów w rejestrach ubrr i ucsrc

    Code:
    'komendy ustawiajĻce transmisje na 9600 
    
    Ubrr = 95
    Ucsrc = &B10000110

    0
  Szukaj w 5mln produktów