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

RS232 i Bascom: brak zapisu znaku z Waitkey() do EEPROM i tablicy bufor(5)

bartzaw 22 Wrz 2007 18:13 2544 8
REKLAMA
  • #1 4309906
    bartzaw
    Poziom 15  
    Posty: 190
    Ocena: 11
    Pozdrawiam wszystkich.

    Problem polega na tym, że po odebraniu znaku instrukcją Waitkey() z RS232 i zapisaniu do zmiennej tekstowej "nm" a następnie do EEprom i tablicy Bufor(kz) nic w tych zmiennych nie otrzymuję. A wydaje mi się że powinienem otrzymać w komórce EEprom jak i tablicy reprezentację liczbową zmiennej tekstowej.
    Poniżej przedstawiam fragment kodu.
    Jeśli Ktoś ma na to jakiś pomysł to za pomoc dziękuję.

    $regfile = "m32def.dat"
    $crystal = 11059200
    $baud = 2400
    
    Dim nm as string*1
    Dim bufor(5) as byte
    kz=1
    Do
      If Ischarwaiting() = 1 Then
          Nm = Waitkey()
          Bufor(kz) = Nm
          Writeeeprom Nm , Kz
          Incr Kz
       End If
    Loop Until Kz = 6
    
    End


    Poprawiłem temat - Regulamin. [c_p]
  • REKLAMA
  • Pomocny post
    #2 4313470
    Marczeli_P
    Poziom 20  
    Posty: 290
    Pomógł: 35
    Ocena: 12
    Nie wiem dokładnie czy bascom dokonuje konwersji typu string na byte w tym może być problem.
    Spróbuj zmienna nm zadeklarować jako 'byte' może pomoże.
  • REKLAMA
  • Pomocny post
    #3 4314671
    Kabuto15
    Poziom 19  
    Posty: 336
    Pomógł: 30
    Ocena: 5
    Konwersje byte->string otrzymuje się przy użyciu funkcji Str. W drugą stronę działa funkcja Val.
  • REKLAMA
  • #4 4316516
    bartzaw
    Poziom 15  
    Posty: 190
    Ocena: 11
    Właśnie z funkcją "Val" również nic nie wychodzi, ale zamieniłem "nm" na zmienną typu "byte" i problem rozwiązany. Nie wiem dlaczego tak czepiłem się tej zmiennej przyjmując ją za tekstową.
    Problem rozwiązany, dzięki za odpowiedź.
  • REKLAMA
  • #5 4316682
    Marczeli_P
    Poziom 20  
    Posty: 290
    Pomógł: 35
    Ocena: 12
    Jeżeli moja podpowiedź przyczyniła sie do rozwiązania problemu a nie stanowi to dużego problemu prosiłbym o naciśnięcie czarodziejskiego guziczka "pomógł" .
  • Pomocny post
    #6 4316990
    M. S.
    Poziom 34  
    Posty: 2107
    Pomógł: 259
    Ocena: 680
    Skąd wiesz, że w zmiennych i EEPROM nic nie ma jeśli nie skompilowałeś programu? (Program się nie kompiluje bo brak deklaracji kz.)

    Wprowadzasz coś do bufora z zewnątrz?
    Z czym się komunikujesz i czy połączenie jest odpowiednio zestawione? (parzystość, stop, rodzaj danych)


    Po doprowadzeniu programu do ładu w symulatorze działa.

    Uruchom poniższy zmodyfikowany program w symulatorze. Wciskaj literki z klawiatury PC, a zobaczysz jak sypie reprezentacją dziesiętną danej litery.

    $regfile = "m32def.dat"
    $crystal = 11059200
    $baud = 2400
    Dim Kz As Byte
    Dim Nm As String * 1
    Dim bufor(5) as byte
    kz=1
    Do
      If Ischarwaiting() = 1 Then
          Nm = Waitkey()
          Bufor(kz) = Nm
          Writeeeprom Nm , Kz
          Print Bufor(kz) ; " " ; Kz
          Incr Kz
       End If
    Loop Until Kz = 6
    
    End
  • #7 4322883
    bartzaw
    Poziom 15  
    Posty: 190
    Ocena: 11
    Jeśli chodzi o fragment kodu to zapomniałem dopisać deklarację zmiennej "kz"pisząc post, oczywiście fragment kodu się kompiluję a nawet więcej w symulacji działa poprawnie, czyli zapisuje reprezentację liczbową zmiennej tekstowej, w praktyce jednak po zaprogramowaniu uC nic z tego nie wychodzi. Kiedy dla próby użyłem konwersji hexval to w komórkach otrzymywałem C8.
  • Pomocny post
    #8 4323163
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    bartzaw napisał:
    ... Kiedy dla próby użyłem konwersji hexval to w komórkach otrzymywałem C8.

    U mnie Twój kod działa bezbłędnie.Natomiast 1 uwaga:
    
    'zamień 
    Dim Nm As String * 1
    'na
    Dim Nm As Byte
    

    Czy m32 na pewno chodzi na kwarcu ?
    Dobrze ustawiłeś opcje transmisji , w PC-towym terminalu ?

    Piotrek
  • #9 8392020
    bartzaw
    Poziom 15  
    Posty: 190
    Ocena: 11
    Witam i dziękuję za wszelką pomoc, wszystko działa jak należy. Z góry przepraszam że nie wyjaśniam sprawy do końca ale na obecną chwilę nie pamiętam w czym istniał problem.

Podsumowanie tematu

LABEL_AI_GENERATED
Problem dotyczył braku zapisu znaku odebranego z interfejsu RS232 za pomocą funkcji Waitkey() w Bascom do zmiennej tekstowej, EEPROM oraz tablicy bufor(5). Kod używał zmiennej typu string*1 do przechowywania pojedynczego znaku, co powodowało, że zapis do EEPROM i tablicy nie działał poprawnie. Rozwiązaniem było zastąpienie zmiennej "nm" typu string na typ byte, co umożliwiło poprawne przechowywanie i zapis wartości znaków jako reprezentacji liczbowej. Dyskusja podkreśliła konieczność odpowiedniej deklaracji zmiennych oraz poprawnej konfiguracji parametrów transmisji (baud rate, kwarc). Kod z poprawioną deklaracją zmiennej byte działał poprawnie zarówno w symulatorze, jak i na rzeczywistym mikrokontrolerze ATmega32. Użytkownik potwierdził działanie rozwiązania, choć nie pamiętał szczegółów pierwotnego problemu.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA