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

pytanie o transmisje 2x avr

scal12 05 Lip 2009 16:09 1530 10
REKLAMA
  • #1 6741677
    scal12
    Poziom 19  
    Witam wszystkich,Panowie mam do Was takie pytanie, walczę od jakiegoś czasu z transmisją między dwoma atmegami8,jedna atmega mierzy temperaturę na piecu Co i wyświetla ją na wyświetlaczu lcd ,druga atmege też z wyświetlaczem mam po drugiej stronie ściany, i chce wynik temperatury z tej w kotłowni przesłać za pomocą UART-u do tej drugiej,używam polecenia
    print temp, natomiast do odbioru polecenia a=Inkey(),przy próbie wyświetlenia wychodzą bzdury.Odczyt na terminalu jest ok, a nie wiem jak uporać się z odebraniem wyniku.Próbowałem polecenia input i wynik sie wyświetla ale jest pomieszany z innymi danymi z bufora i dodatkowo blokuje program w oczekiwaniu na dane,jak to wszystko opanować? szukajka nie na wiele się zdała,faktem jest że w bascomie jestem początkującym może ktoś z większym doświadczeniem mi pomoże za co z góry dziękuje
  • REKLAMA
  • Pomocny post
    #2 6741701
    wicy
    Poziom 22  
    Spróbuj przykładu podanego w tym wątku.
    Nadawanie przez PRINT. Odbiór w przerwaniu URXC i flagą ustawianą i testowaną w pętli głównej programu.
  • #3 6742873
    scal12
    Poziom 19  
    No niestety z tą funkcją też mam problemy,może ktoś z Was mógłby coś takiego napisać tylko tyle że pod bascomem oczywiście nie za darmo bo wiedza kosztuje,a na tej funkcji zależy mi szczególnie.
  • REKLAMA
  • Pomocny post
    #4 6743004
    wicy
    Poziom 22  
    
    $crystal = 8000000
    $regfile = "M16def.dat"
    $hwstack = 128
    

    Tu zmieniasz wg wlasnych parametrow
    
    '- deklaracja zmiennych dla usart ----------------------------------------
    Dim Index As Byte        'kolejny znak w buforze odbioru
    Dim Odebrano As Bit     'flaga ustawiona po odebraniu znaku
    Dim Buf(10) As Byte     'bufor wejsciowy - 10bajtow
    '- konfiguracja usart -------------------------------------------------------
    On Urxc Odbierz
    Ubrr = 51                                                   '19200 bps przy U2X=0
    Ucsra = &B00100000
    Ucsrb = &B10010000
    Ucsrc = &B10000110
    
    Enable Urxc
    Enable Interrupts
    

    Transmisja ustawiona na 19200 przy kwarcu 8MHz. Dla innych wartości kwarcu i żądanych prędkości - patrz nota katalogowa, przykłady ustawień, str. 159
    
    petla_glowna_nieskonczona:
    
    'tu mozna przeslac dane np. po wcisnieciu guzika
    ' dane do wyslania w postaci binarnej
    'np. Printbin 1;2;3;4;5;6;7;8;9;10
    
    If Odebrano=1 Then
       Odebrano = 0   'zerujemy flagę
       ' tu obsługujemy odebrane dane, np. na lcd
    End If
    
    goto petla_glowna_nieskonczona
    
    Odbierz:
       Buf(index) = Udr
       Incr Index                                               'zwiększamy licznik o jeden
       If Index = 11 Then   'jesli przyszedl 11 znak, zaczynamy od nowa
          Index = 1
          Odebrano = 1        'flaga ustawiona po odebraniu 10bajtow
       End If
    Return
    
    End
    


    W drugim uP ustawiasz to samo, krosujesz linie TX-RX i musi działać :)
  • REKLAMA
  • #5 6743087
    scal12
    Poziom 19  
    Piękne dzięki za pomoc(mało takich ludzi na świecie) jutro będę walczył dalej:)

    Dodano po 4 [minuty]:

    A jeszcze co do tych lini to u mnie one idą przez max232 oba procki nie mają problemu jeśli idzie o komunikacje z komputerem i miedzy sobą też sie komunikują moge np sterować diodą w drugim procku i odwrotnie tylko problem mi stwarza przesył temperatury i jej odczyt(a zwłaszcza odczyt) ale powalczę z Twoim przykładem
  • Pomocny post
    #6 6747555
    mirley
    Poziom 17  
    Witam

    Gdyby dalej były problemy z uruchomieniem transmisji to mogę podesłać kod źródłowy do takiego urządzenia, bo sam coś takiego zrobiłem z tym że wynik podawany jest na 3 wyświetlacze LED. Transmisję zrealizowałem bardzo podobnie tylko za pomocą bascomowego polecenia Inkey(), odbierane są zawsze dwa bajty i na podstawie ich zawartości określane jest co przyszło i na którym z wyświetlaczy ma zostać pokazane. Drugi mikrokontroler wysyła dane za pomocą printbin tak jak kolega wcześniej proponuje
  • REKLAMA
  • #7 6750485
    scal12
    Poziom 19  
    Jeśli to nie problem to chętnie skorzystam, tyle że działanie sprawdzę dopiero w sobotę i niedziele
  • Pomocny post
    #8 6807014
    chifchif
    Poziom 12  
    Witam
    Inkey odbiera tylko jeden znak (bajt) przesłanej informacji. Użyj lepiej funkcji – input /zapoznaj się z pomocą Bascoma.
    Do przesyłania informacji na duże odległości używaj jak najmniejszej szybkości.
  • #10 6811861
    rdt
    Poziom 25  
    spróbuj buforować ewentualnie dane
  • #11 6813832
    scal12
    Poziom 19  
    Po małym urlopie, powracam do tematu,problem częściowo rozwiązałem, użyłem jednak polecenia input dane ładnie przelatują ,jednak jak nastąpi z jakiś przyczyn przerwa program wstrzymuje swoje działanie i czeka na wszystkie dane ale już nie jest źle:)
    od strony 1 procka leci komenda:
    
    dim te as byte
    dim tx as byte
    dim tmp as byte
    print te
    print tx
    print tmp
    
    po stronie 2 procka (strona odbiorcza):
    
    dim nn as byte
    Odczyttemp:
    Print Chr(39)
    Cls
    Input Nn Noecho
    
    
    Lcd "TPiec:" ; Nn
    Waitms 100
    
    Input Nn Noecho
    Locate 1 , 10
     Lcd "Ter:" ; Nn
    Waitms 100
    Znaka = Inkey()
    Print Chr(40)
    Input Nn Noecho
    Locate 2 , 1
     Lcd "TRur:" ; Nn
    Waitms 500
    
    Call Czas


    Tak na razie wyglądają moje wypociny:)
REKLAMA