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

UART:dziwne zachowanie ATMega8 po stronie odbiorczej[BASCOM]

sułek 28 Paź 2009 23:20 1775 9
  • #1 7187863
    sułek
    Poziom 14  
    Witajcie,

    Mam zamiar zbudować prosty system radiowego zamykania/ otwierania drzwi.
    Nadajnikiem będzie UART/Mega8L zamknięta w obudowie pilota+ nadajniczek na 833MHz
    µC ten po naciśnięciu jednego z dwóch przycisków wysyła w odstępach 1 sekundowych komendę do otwarcia lub zamknięcia. Mechanizm wykonawczy: serwo modelarskie.
    Po stronie odbiorczej UART/Mega8L+ odbiorniczek 833MHz obsługująca serwo.
    W czym problem?
    Procek po stronie odbiorczej dość często (nie zauważyłem żadnej regularności: czasem wariuje raz za razem, czasem godzine-dwie, nic się nie dzieje...)zachowuje się dziwnie, to znaczy:

    -przestaje reagować na jedną z komend np. OTWÓRZ, za to druga komenda np. ZAMKNIJ podawana cyklicznie, powoduje otwieranie i naprzemiennie zamykanie. Po niezdefiniowanym czasie nagle potrafi zacząć działać prawidłowo lub "wyłączyć" sobie dotychczas aktywną komendę (ZAMKNIJ) i reagować "podwójnie" na OTWÓRZ.

    Ponieważ kod po stronie odbiorczej wygląda banalnie prosto, wykonałem zmiany hardwarowe:

    -wywaliłem modem radiowy i połączyłem na próbę kablem z kondkiem ceramicznym: nic nie dało
    -zmieniłem taktowanie obu µC z kwarców na generator wewnetrzny fusami (dopóty, dopóki oba procki są w temp pokojowej, niczemu to nie zaszkodzi): nic nie dało
    -zmieniłem zasilanie "zasilaczowe" na docelowe, bateryjne (ATMega 8L)
    -zamieniłem oba µC w podstawkach na zupełnie inne sztuki: nic nie dało
    -zmieniałem Baud Rate na 4800, 2400, 1200 i 19200: nic nie dało
    -napisałem na Elektrodzie i mam gorącą nadzieję, że to pomoże....

    oto kod odbiornika:


    
    
    $crystal= 8000000
    $baud= 9600
    
    Config Portc.3 = Output			'wyjście na serwo
    Config Portc.2 = Output			'wyjście LED
    
    Config Serialin = Buffered , Size = 20
    
    Dim Znak As String * 7
    Dim I As Byte
    
    Enable Interrupts
    
    For I= 1 to 5				'sygnalizacja, że procek 
    Portc.2 = 1				'startuje
    waitms 300
    Portc.2 = 0
    waitms 300
    next
    
    '#####################################################
    
    Do
    Clear Serialin
    
    For I = 1 to 6				'debugger dla ubogich: 
    Toggle Portc.2				'sygnał rozpoczęcia pętli
    waitms100
    Next
    
    Input Znak
    
    If Znak = "zamknij" Then
    
    	Portc.2 = 1			'LED ON
    	For I = 1 to 100		             'serwo w prawo
    	Portc.3 = 1
    	waitus 900
    	Portc.3 = 0
    	Waitms 20
    	Next
    
    Elseif Znak = "otworzo" Then
    	
    	
    	Portc.2 = 0			'LED OFF
    	For I = 1 to 100		             'serwo w lewo
    	Portc.3 = 1
    	waitus 2100
    	Portc.3 = 0
    	Waitms 20
    	Next
    
    End If
    
    Loop
    
    End
    
    


    Mega8L po stronie nadawczej wysyła co sekundę pojedyncze słowo komendą
    
    Print "zamknij"; chr(13);
    lub
    Print "otworzo"; chr(13);
    


    Inne słowa, zgodnie z założeniami, nie powodują jakiejkolwiek reakcji po stronie odbiorczej, wykonywana jest tylko na pusto pętla i rozpoczyna się oczekiwanie na natępną transmisję...
  • #2 7187904
    Konto nie istnieje
    Poziom 1  
  • #3 7187961
    alien_audio
    Poziom 21  
    Witam.
    Myślę, że w tym przypadku przed odczytem bufora RS sprawdź czy jest w pełni zapełniony, czyli czy cała wiadomość 7 znaków wpadło do bufora.
  • #4 7187979
    sułek
    Poziom 14  
    atom1477 napisał:
    Może zwiększ długość zmiennej Znak do 10...20B.


    Przepraszam, zapomniałem dodać, że oprócz zmian hardwarowych zmieniłem właśnie zmienną Znak do 20B.
    Oprócz tego spróbowałem obsłużyć serwo i LEDa w podprogramikach wywoływanych z pętli (taka sobie kosmetyka, aby tylko coś zmienić). Zmieniłem równiez na chwilę działanie nadajnika tak, aby za 1 naciśnięciem wysyłał tylko pojedyncze słowo, nastepnie żeby powtarzał transmisję co 100ms. W koncu skończyło się na 1s.
    Dodałem też "Clear Serialin" na początku pętli. Głownie z myslą o śmieciach w torze radiowym.
    Bez efektu, jak działało, tak działa. Jak szwankowało, tak (czasem) szwankuje.
  • #5 7187991
    Konto nie istnieje
    Poziom 1  
  • #6 7188329
    alien_audio
    Poziom 21  
    Witam.
    Proponuje tak jka kolego radzi uzyc bufora, który automatycznie działa.
    tu przykład:

    Config Com1 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
    Config Serialin = Buffered , Size = 7 -------' wielkośc 7 znaków
    Enable Interrupts -------' musisz włączyć przerwanie

    później w programie dajesz
    Bufor_rs = Bufspace(1)
    'wprowadziłem zmienną Bufor_rs oznacza ona ilość wolnego miejsca
    w buforze, jak jest 0 to bufor pełny i możesz teraz go odczytać.
    Całość działa na przerwaniach w tle programu. Odczytujesz w dowolnej chwili
  • #7 7188752
    sułek
    Poziom 14  
    Z tym Bufspace, to dobry pomysł. W najbliższych dniach nie będę jednak miał dostępu do prototypu.
    Intryguje mnie tylko to, że własciwie program odbiornika już teraz działa tak, jakby oczekiwał na instrukcji "Input" na odpowiednie zapełnienie bufora a dokładniej na CR (chr$(13))
    Dzięki prostej sygnalizacji LEDowej widzę, że pętla nie jest wykonywana az do momentu odebrania CR.

    Edit: zapomniałem dopisać, że dokonałem w trakcie walki z prototypem jeszcze jednej zmiany hardwarowej: doprowadziłem GND i zasilanie do AVcc. Nic to nie dało niestety...
  • #8 7189113
    Konto nie istnieje
    Poziom 1  
  • #9 7194038
    xury
    Specjalista automatyka domowa
    Piszesz ze daleś:
    sułek napisał:
    Print "zamknij"; chr$(13)
    lub
    Print "otworzo"; chr$(13)

    Nie wiem czy tylko w tym przykładzie, czy również w kodzie nie dałeś średników za chr(13) i nie wiem po co ten "$" ?
    Powinno być
    Print "zamknij"; chr(13) ;
    
    Print "otworzo"; chr(13) ;


    Bo bez tego średnika polecenie "Print wysyła własny dodatkowy CR i wygłada to tak:

    Cytat:
    zamknij<CR>CR>
  • #10 7194312
    sułek
    Poziom 14  
    Oczywiście masz rację!
    Juź poprawiam... Błąd oczywiście tylko w moim poście.
    Na usprawiedliwienie mam tylko to, źe piszę z pamięci: z laptopa będąc w podróży służbowej, natomiast praca leży w domu, na PeCecie.
REKLAMA