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

wysłanie zmiennej dwubajtowej jednym pinem w bascomie?

marcin-k 03 Lut 2009 12:56 1755 18
REKLAMA
  • #1 6096062
    marcin-k
    Poziom 15  
    Jak mogę wysłać dwa bajty ale za pomocą tylko jednego wyprowadzenia w Procku i to w bascomie avr kombinowałem za pomocą Shift out ale to nie to co chcę buduję nadajnik radiowy z własnym algorytmem niestety utknąłem na tym problemie tym wyprowadzeniem mam kluczować nadajnik 432MHz
  • REKLAMA
  • #2 6100785
    anomelif
    Poziom 12  
    Najprościej będzie użyć SPI albo USI - sprzęt załatwi za Ciebie prawie całą robotę.
  • REKLAMA
  • #3 6100851
    marek_Łódź
    Poziom 36  
    SPI ma w nadajniku 2 druty (dane i zegar). Najprościej użyć sprzętowy lub emulowany programowo UART (oba rozwiązania dostępne z BASCOMa - instrukcja PRINT)
  • #5 6114544
    marek_Łódź
    Poziom 36  
    marcin-k napisał:
    a czy instrukcja print nie wykorzystuje dwóch pinów?
    W przypadku uniwersalnego interfejsu szeregowego w trybie asynchronicznym nadawanie odbywa się po jednym przewodzie, podobnie jak odbiór.

    Bascom HELP --> Config com1, baud, open , close, print, printbin itp
  • #6 6132877
    marcin-k
    Poziom 15  
    Nie wychodzi mi to używam tych komend i nie mam żadnego rezultatu pozytywnego brak jakiejkolwiek komunikacji dałem nawet najmniejszą prędkość i nic posiłkowałem się przykładami z książki bascom avr Piotra Góreckiego i nic może coś robię nie tak zaznaczę że mam podpiętą jedną nóżkę procka jako tx w nadajniku , która wchodzi do drugiego procka na rx masy są połączone razem wysyłam jeden bajt , który ma odebrać odbiornik i wyświetlić ma mi na wyświetlaczu LCD niestety nie mam żadnej reakcji wydaje mi się że w symulacji wyjście procka jak próbuję coś wysłać to powinno sobie migać czy coś takiego ale nic się nie dzieje tak samo jeśli uruchomię w symulacji odbiornik i próbuję sztucznie wymusić transmisje też nic się nie dzieje zależy mi aby transmisja była tylko za pomocą jednego przewodu bo inaczej nadajnik mi nie wyjdzie chciałem przetestować ideę czy uda mi się coś wysłać , odczytać i wyświetlić potwierdzenie na wyświetlaczu lcd ale jakoś nie wychodzi
  • #7 6134142
    marek_Łódź
    Poziom 36  
    Możesz pokazać listingi (jak konfigurujesz nadajnik i odbiornik?)

    przykładowo - w transmisji przez sprzętowy UART

    $crystal = 8000000
    Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8
    $baud = 38400
    do
     for i=1 to 1000
      print chr(255);
     next
     for i=1 to 1000
      print chr(0);
     next
    loop


    Woltomierz na linii sprzętowego uarta tx powinien pokazać oscylacje

    Analogicznie w przypadku emulacji programowej np tak:

    Open "comb.0:38400,8,n,1" For Output As #1
    do
     for i=1 to 1000
      print #1,chr(255);
     next
     for i=1 to 1000
      print  #1,chr(0);
     next
    loop


    Jak to sprawdzisz, możesz podłączyć odbiornik i spróbować toto odebrać, ewentualnie podłączyć układ do peceta i sprawdzić w jakimś programie terminalowym.
  • #8 6137362
    marcin-k
    Poziom 15  
    Nadajnik chyba już rozgryzłem coś zaczął wysyłać w symulacji pokazuje i faktycznie coś wysyła ale mam dalej problem z odbiornikiem przypominam, że mają gadać dwa procki w jedną stronę odbiorczy procek na razie ma pokazywać na wyświetlaczu LCD co odebrał i na razie nie pokazuje nic prócz czołówki powitalnej załączam krótki listing jeśli chodzi o prędkość transmisji to w nadajniku i odbiorniku mam ustawioną taką samą połączenie między prockami to w nadajniku tx połączony jest do rx w odbiorniku masy są spięte razem na razie bez modułów radiowych tylko gołe procki spięte razem kablem kilka centymetrów procesorki to Mega8
    
    $crystal = 4000000
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portc.1 , Rs = Portc.0
    
    
    Dim A As Word
    
    Config Pind.2 = Input
    Set Pind.2
    Config Pind.0 = Output : Set Pind.0 : Set Portd.0       'led
    Config Pind.1 = Output : Set Pind.1 : Set Portd.1       'led
    
     Cls
     Lcd "WITAM"
    
     Open "comd.2:2400,8,n,1,inverted"for Input As#1       'rx
     Open "comd.3:2400,8,n,1,inverted"for Output As#2       'tx
    
     Do
    
      A = Inkey(#1)               'odczytujemy znak
     If A > 0 Then                'czy był jakiś (> 0)?
        Cls
        Lcd A
      End If
    
      Waitms 100
    Loop
  • #9 6138069
    marek_Łódź
    Poziom 36  
    A dlaczego "invered? Masz jakiś driver odwracający w torze transmisji?...fakt, że jak po obu stronach dasz inverted, to jest bez znaczenia...

    Oba procesory taktowane prawidłowo (kwarc)?
    Prędkości uzgodnione?

    Co do programu, to jeśli dane nie są buforowane, nadajnik powinien pilnować prędkości tak, aby odbiornik dał radę odebrać. A trzeba pamiętać o tym, że operacje na wyświetlaczu są czasochłonne, tak więc opóźnienie WAIT powinno się pojawić w nadajniku, a nie w odbiorniku, a docelowo odbiornik powinien pracować w trybie zbuforowanym.
  • REKLAMA
  • #10 6138208
    shadow0013
    Poziom 34  
    Żeby nie powielać tematu - podobne pytanie:
    Jak wysłać na jednym pinie ściśle określoną liczbę impulsów z zakresu 0-250000 (Impulsy) w jak najkrótszym czasie (ATmega8 wewnętrzny rezonator 8MHz - Bascom), w pętli:
    Do
     If Impulsy = 0 Then
      Exit Do
     End If
      Decr Impulsy
     Portb.0 = 1                                             
     Portb.0 = 0
    Loop

    trwa ponad 20 sekund.
  • REKLAMA
  • #11 6142507
    marcin-k
    Poziom 15  
    W nadajniku mam także po wysłaniu zmiennej instrukcje wait i to znacznie dłuższą ale nie oto chodzi kwarce w nadajniku i odbiorniku są takie same 4MHz szybkość transmisji taka sama 2400 może jakaś pomoc ? w postaci fragmentu kodu z resztą już sobie poradzę powtórzę transmisja jednym przewodem jednostronna procek nadajnika to atmega8 i taki sam w odbiorniku napisałem wcześniej sobie program do odbiornika samouczącego ale pracuje w rc5 a teraz chcę zrobić to samo z własnym algorytmem i nie wiem jak przeskoczyć ten fragment z komunikacją bardzo proszę o jakąś radę
  • #12 6143094
    zumek
    Poziom 39  
    shadow0013 napisał:
    ...trwa ponad 20 sekund.

    Policzmy.
    1 obieg pętli, to 63 takty * 250000 / 8MHz = 1.96875 S
    A skąd u Ciebie się wzięło 20 :?:
    Dalibóg ... wiem - zmienna Impulsy , to u Ciebie DOUBLE , a przecież wystarczy LONG lub inne rozwiązanie :-P
  • #13 6143592
    marek_Łódź
    Poziom 36  
    zumek napisał:
    shadow0013 napisał:
    ...trwa ponad 20 sekund.

    Policzmy.
    1 obieg pętli, to 63 takty * 250000 / 8MHz = 1.96875 S
    A skąd u Ciebie się wzięło 20 :?:
    Dalibóg ... wiem - zmienna Impulsy , to u Ciebie DOUBLE , a przecież wystarczy LONG lub inne rozwiązanie :-P
    Wystarczy word albo integer.

    $crystal = 8000000
    Dim Impulsy As Word
    
    Impulsy = 25000
    Do
     If Impulsy = 0 Then
      Exit Do
     End If
     Portb.0 = 1
     Decr Impulsy
     Portb.0 = 0
    Loop


    875793 cykle = 109,47 ms (jedna dziesiąta sekundy)

    $crystal = 8000000
    Dim Impulsy As Word , I As Word
    
    Impulsy = 25000
    For I = 1 To Impulsy
     Set Portb.0
     Reset Portb.0
    Next

    975805 cykle = 121,97 ms

    $crystal = 8000000
    Dim Impulsy As Word
    
    Impulsy = 25000
    Do
     Portb.0 = 1
     Decr Impulsy
     Portb.0 = 0
    Loop Until Impulsy = 0
     Portb.0 = 1

    825780 cykli = 103,22 ms
  • #14 6144083
    shadow0013
    Poziom 34  
    Dzięki Zumek miałeś rację.
    marek_Łódź 10x25000 (250 000) czy inna kombinacja przy zmiennej typu Word niestety nie skróciło czasu, ale spróbuję jeszcze pokombinować (inaczej zrobić pętle).
  • #15 6144102
    marek_Łódź
    Poziom 36  
    Sorry, zgubiłem zero
  • #17 6153794
    marek_Łódź
    Poziom 36  
    Można spróbować podłączyć odbiornik pod RS w pececie i wysterować np. z hypherterminala. Przy pracy w trybie "inverted" jako interfejs wystarczy kawałek opornika i dioda Zenera.
  • #19 6178625
    marcin-k
    Poziom 15  
    sprawa się wyjaśniła wszystko działa temat można uznać za zamknięty a odpowieć to miałem źle skonfigurowane fusbity zamiast na zewnętrznym kwarcu miałem ustawione wewnętrzny generator rc 4MHz i dlatego mi to nie chciało poprawnie pracować teraz spokojnie mogę zabrać się za dalszą część programu
REKLAMA