Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

Komunikacja przez uart problem

wacha
-
-
Posty:95
Rejestracja:22 lis 2009, o 21:19
Lokalizacja:biele
Komunikacja przez uart problem

Postautor: wacha » 11 sie 2011, o 17:38

Witam wszystikch chciałbym prosić was o pomoc. Mam problem z komunikacja procesorów ATtiny2313 poprzez sprzętowy uart.Poniżej podaje kody nadajnika i odbiornika prosze o podpowiedz jak zrobić tą komunikację aby diałała prawidłowo.
Nadajnik:

Kod: Zaznacz cały

$regfile = "attiny2313.dat" $crystal = 8000000 $baud = 9600 $hwstack = 32 ' default use 32 for the hardware stack $swstack = 10 ' default use 10 for the SW stack $framesize = 40 Dim A As Byte Dim B As Byte Do Incr A If A > 255 Then A = 0 Incr B If B > 255 Then B = 0 End If Print A Print B End If Loop End
Odbiornik:

Kod: Zaznacz cały

$regfile = "attiny2313.dat" $crystal = 8000000 $baud = 9600 $hwstack = 32 ' default use 32 for the hardware stack $swstack = 10 ' default use 10 for the SW stack $framesize = 40 Config Lcd = 16 * 2 Config Lcdpin = Pin , Db7 = Portb.7 , Db6 = Portb.6 , Db5 = Portb.5 , Db4 = Portb.4 , E = Portb.3 , Rs = Portb.2 Cursor Off Dim A As Byte Dim B As Byte Do waitms 300 Cls Lcd "zmienna1=" ; A Lowerline Lcd "zmienna2=" ; B A = Inkey() B = Inkey() Loop End
Edit: A ja bym prosił, o stosowanie znaczników

Kod: Zaznacz cały

następnym razem. Pajączek[/color]

Awatar użytkownika
Press
-
-
Posty:389
Rejestracja:10 mar 2004, o 16:21
Lokalizacja:Wrocław
Kontaktowanie:

Re: Komunikacja przez uart problem

Postautor: Press » 14 sie 2011, o 08:26

No nie wiem kolego co Ci się dokładnie dzieje, ale może masz ten sam problem co ja wczoraj...
Przekłamywało mi wartości na odbiorze.
U mnie pomogła zmiana taktowania na 4 MHz. Przynajmniej na płytce prototypowej wszystko działa elegancko.

Pozdrawiam

wacha
-
-
Posty:95
Rejestracja:22 lis 2009, o 21:19
Lokalizacja:biele

Re: Komunikacja przez uart problem

Postautor: wacha » 16 sie 2011, o 19:11

Albo przez to że jeden układ chodzi na zewnętrznym kwarcu a drugi na oscylatorze RC bo odbiornik coś tam odbiera ale wyświetlane są jakieś dziwne kody.A mam jeszcze jedną zagadkę podam kod programu i niech mi ktoś powie jak zrobić aby prawidłowo odbierał kody z pilota RC5? :?

Kod: Zaznacz cały

$regfile = "M8515.dat" $crystal = 8000000 $baud = 9600 Dim Wysw As Word , Wysw_pomoc As Word , T As Word , Pomoc_pomiaru As Word , A As Word , B As Byte Dim T1 As Word , Wyswietlacz_info As Byte Dim R1 As Byte , R2 As Byte , R3 As Byte , R4 As Byte , R5 As Byte , R6 As Byte , R7 As Byte , R8 As Byte Dim Liczba1 As Byte , Liczba2 As Byte , Liczba3 As Byte , Liczba4 As Byte , Liczba5 As Byte , Liczba6 As Byte , Liczba7 As Byte , Liczba8 As Byte Dim Mux As Byte , Data_rok As Byte , Data_mie As Byte , Data_dni As Byte Dim Address As Byte , Address1 As Byte , Command As Byte , Command1 As Byte , Jasnosc_swiecenia As Byte Dim Ss As Byte , Mm As Byte , Gg As Byte , Mmb As Byte , Ggb As Byte , Alarm_posredni As Bit Dim Jasnosc As Byte , Budzik As Bit , Pobrany_rc5 As Bit Const Ssb = 0 Wejscie_1 Alias Pine.0 Wejscie_2 Alias Pine.1 Buzzer Alias Porta.2 Foto_rezystor Alias Pina.3 Config 1wire = Pina.0 Config Int0 = Low Level Config Int1 = Falling Config Rc5 = Pind.2 Config Watchdog = 2048 Config Porta.7 = Output Porta.7 = 1 Config Porta.3 = Input Porta.3 = 0 Config Portb = &B11111111 Portb = &B11111111 Config Portc = &B11111111 Portc = &B11111111 Config Porte = &B100 Porte = &B111 Config Timer0 = Pwm , Prescale = 1 , Compare Pwm = Clear Up Config Timer1 = Pwm , Pwm = 10 , Prescale = 1 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down On Int0 Pobr_rc5 : On Int1 Impulsy_zegara : On Timer0 : On Timer1 : Start Watchdog Enable Interrupts : Enable Int0 : Enable Int1 R1 = 255 : R2 = 255 : R3 = 255 : R4 = 255 : R5 = 255 : R6 = 255 : R7 = 255 : R8 = 255 : Data_rok = 11 : Data_mie = 7 : Data_dni = 31 Alarm_posredni = 0 : Jasnosc = 5 : Set Pobrany_rc5 Do If Foto_rezystor = 1 Then : Ocr0 = 10 : Else : Ocr0 = 255 : End If If Wejscie_1 = 0 Then : Pwm1a = Jasnosc_swiecenia : Else : Pwm1a = 0 : End If If Wejscie_2 = 0 Then : Pwm1b = Jasnosc_swiecenia : Else : Pwm1b = 0 : End If Incr Mux Incr A If A = 500 Then A = 0 Incr B If B = 10 Then B = 0 Incr Wyswietlacz_info End If If Wyswietlacz_info > 3 Then Wyswietlacz_info = 0 1wreset 1wwrite &HCC 1wwrite &H44 Else 1wreset 1wwrite &HCC 1wwrite &HBE T = 1wread(2) T = T Or 65536 T1 = T * 5 If Budzik = 1 And Alarm_posredni = 1 Then Buzzer = 0 Else Buzzer = 1 End If If Pobrany_rc5 = 1 Then Portc = 255 Command1 = Command Reset Pobrany_rc5 Enable Int0 Else Select Case Command1 Case 0: Reset Watchdog Select Case Wyswietlacz_info Case 0: Reset Watchdog Wysw = T1 If Wysw < 1000 Then Wysw_pomoc = Wysw Mod 10 Liczba6 = Wysw_pomoc Wysw = Wysw / 10 Wysw_pomoc = Wysw Mod 10 Liczba5 = Wysw_pomoc Wysw = Wysw / 10 Wysw_pomoc = Wysw Mod 10 Liczba4 = Wysw_pomoc Wysw = Wysw / 10 R1 = 255 R2 = 255 R3 = 255 R4 = Lookup(liczba4 , Tabela) R5 = Lookup(liczba5 , Tabela1) R6 = Lookup(liczba6 , Tabela) R7 = 156 R8 = 198 End If Case 1: Reset Watchdog Wysw = Data_rok If Wysw < 100 Then Wysw_pomoc = Wysw Mod 10 Liczba8 = Wysw_pomoc Wysw = Wysw / 10 Wysw_pomoc = Wysw Mod 10 Liczba7 = Wysw_pomoc Wysw = Wysw / 10 R6 = 191 R7 = Lookup(liczba7 , Tabela) R8 = Lookup(liczba8 , Tabela) End If Wysw = Data_mie If Wysw < 13 Then Wysw_pomoc = Wysw Mod 10 Liczba5 = Wysw_pomoc Wysw = Wysw / 10 Wysw_pomoc = Wysw Mod 10 Liczba4 = Wysw_pomoc Wysw = Wysw / 10 R3 = 191 R4 = Lookup(liczba4 , Tabela) R5 = Lookup(liczba5 , Tabela) End If Wysw = Data_dni If Wysw < 32 Then Wysw_pomoc = Wysw Mod 10 Liczba2 = Wysw_pomoc Wysw = Wysw / 10 Wysw_pomoc = Wysw Mod 10 Liczba1 = Wysw_pomoc Wysw = Wysw / 10 R2 = Lookup(liczba2 , Tabela) R1 = Lookup(liczba1 , Tabela) End If Case 2: Reset Watchdog Wysw = Ss If Wysw < 60 Then Wysw_pomoc = Wysw Mod 10 Liczba8 = Wysw_pomoc Wysw = Wysw / 10 Wysw_pomoc = Wysw Mod 10 Liczba7 = Wysw_pomoc Wysw = Wysw / 10 R6 = 255 R7 = Lookup(liczba7 , Tabela) R8 = Lookup(liczba8 , Tabela) End If Wysw = Mm If Wysw < 60 Then Wysw_pomoc = Wysw Mod 10 Liczba5 = Wysw_pomoc Wysw = Wysw / 10 Wysw_pomoc = Wysw Mod 10 Liczba4 = Wysw_pomoc Wysw = Wysw / 10 R3 = 255 R4 = Lookup(liczba4 , Tabela) R5 = Lookup(liczba5 , Tabela) End If Wysw = Gg If Wysw < 24 Then Wysw_pomoc = Wysw Mod 10 Liczba2 = Wysw_pomoc Wysw = Wysw / 10 Wysw_pomoc = Wysw Mod 10 Liczba1 = Wysw_pomoc Wysw = Wysw / 10 R1 = Lookup(liczba1 , Tabela) R2 = Lookup(liczba2 , Tabela) End If Case 3: Reset Watchdog Portc = 255 Print "Temperatura pokoju2=" ; T Print "Prad LED-ow=" ; Jasnosc_swiecenia ; "mA" Input Data_rok Input Data_mie Input Data_dni Input Gg Input Mm Waitms 50 Wyswietlacz_info = 0 End Select Case 1: Reset Watchdog Wysw = Jasnosc If Wysw < 11 Then Wysw_pomoc = Wysw Mod 10 Liczba5 = Wysw_pomoc Wysw = Wysw / 10 Wysw_pomoc = Wysw Mod 10 Liczba4 = Wysw_pomoc Wysw = Wysw / 10 R1 = 191 R2 = 191 R3 = 191 R4 = Lookup(liczba4 , Tabela) R5 = Lookup(liczba5 , Tabela) R6 = 191 R7 = 191 R8 = 191 End If Case 2: Reset Watchdog Wysw = Ggb If Wysw < 24 Then Wysw_pomoc = Wysw Mod 10 Liczba2 = Wysw_pomoc Wysw = Wysw / 10 Wysw_pomoc = Wysw Mod 10 Liczba1 = Wysw_pomoc Wysw = Wysw / 10 R1 = Lookup(liczba1 , Tabela) R2 = Lookup(liczba2 , Tabela) R3 = 247 End If Wysw = Mmb If Wysw < 60 Then Wysw_pomoc = Wysw Mod 10 Liczba5 = Wysw_pomoc Wysw = Wysw / 10 Wysw_pomoc = Wysw Mod 10 Liczba4 = Wysw_pomoc Wysw = Wysw / 10 R4 = Lookup(liczba4 , Tabela) R5 = Lookup(liczba5 , Tabela) R6 = 247 R7 = 192 R8 = 192 End If Case 3: Reset Watchdog R1 = 131 R2 = 227 R3 = 161 R4 = 191 If Budzik = 0 Then R5 = 163 R6 = 142 R7 = 142 R8 = 255 Else R5 = 163 R6 = 171 R7 = 255 R8 = 255 End If End Select End If End If If Mux = 8 Then Mux = 0 Portc = 255 Select Case Mux Case 0: Portc = R1 : Portb = &B01111111 : Porta.7 = 1 Case 1: Portc = R2 : Portb = &B10111111 Case 2: Portc = R3 : Portb = &B11011111 Case 3: Portc = R4 : Portb = &B11101111 Case 4: Portc = R5 : Portb = &B11110111 Case 5: Portc = R6 : Portb = &B11111011 Case 6: Portc = R7 : Portb = &B11111101 Case 7: Portc = R8 : Portb = &B11111111 : Porta.7 = 0 End Select Waitms 2 Loop End Impulsy_zegara: Incr Ss If Ss > 59 Then : Ss = 0 : Incr Mm : End If If Mm > 59 Then : Mm = 0 : Incr Gg : End If If Gg > 23 Then : Gg = 0 : Incr Data_dni : End If If Data_dni > 31 Then : Data_dni = 1 : Incr Data_mie : End If If Data_mie > 12 Then : Data_mie = 1 : Incr Data_rok : End If If Data_rok > 99 Then : Data_rok = 0 : End If If Ss = Ssb And Mm = Mmb And Gg = Ggb Then Alarm_posredni = 1 Return Pobr_rc5: Disable Int0 Enable Interrupts Getrc5(address , Command) Command = Command And &B01111111 Set Pobrany_rc5 Return Tabela: Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144 , 255 Tabela1: Data 64 , 121 , 36 , 48 , 25 , 18 , 2 , 120 , 0 , 16 , 255
Jak widać urządzenie działa na wyświetlaczu LED. Program ma kilka niedorubek jak widać ale teraz pomóżcie prosze mi w obsłudze kodu RC5. Chodzi o to że jak nacisne jaki kolwiek przycisk na pilocie to wyświetlacze całkiem gasną i koniec działania dodam że na wyświetlaczu LCD działa wszystko ładnia z góry dzięki za pomoc.

wacha
-
-
Posty:95
Rejestracja:22 lis 2009, o 21:19
Lokalizacja:biele

Re: Komunikacja przez uart problem

Postautor: wacha » 21 sie 2011, o 16:49

Posiedziałem nad tym uartem i przerobiłem kody w ten sposób :
Nadajnik:

Kod: Zaznacz cały

$regfile = "attiny2313.dat" $crystal = 4000000 $baud = 9600 $hwstack = 32 ' default use 32 for the hardware stack $swstack = 10 ' default use 10 for the SW stack $framesize = 40 Dim A As Byte Dim B As Byte Do Incr A If A = 255 Then A = 0 Incr B End If Print A Waitms 1000 Loop End
Odbiornik:

Kod: Zaznacz cały

$regfile = "attiny2313.dat" $crystal = 4000000 $baud = 9600 $hwstack = 32 ' default use 32 for the hardware stack $swstack = 10 ' default use 10 for the SW stack $framesize = 40 Config Lcd = 16 * 2 Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.3 , Rs = Portb.2 Dim A As Byte Cls Lcd "Interfejs RS232" Wait 5 Do A = Waitkey() Cls Lcd "zmienna a=" ; A Loop End
Teraz obydwa układy działają na zewnętrznym kwarcu i jest problem komunikacja jakaś tam jest ale odbiornik wyswietla mni cały czas liczbę 10 po odłączeniu odbiornika liczba 0 dodam że przez terminal zawarty w bascomie wszystko jest ładnie odczytywane.
Prosze o pomoc :?

Awatar użytkownika
r-mik
-
-
Posty:351
Rejestracja:14 cze 2005, o 19:18
Lokalizacja:Wawa
Kontaktowanie:

Re: Komunikacja przez uart problem

Postautor: r-mik » 21 sie 2011, o 17:38

A fuses MPU ustawiłeś na pewno na zewnętrzny generator? Może nadal pracuje wewnętrzny RC?

Awatar użytkownika
Press
-
-
Posty:389
Rejestracja:10 mar 2004, o 16:21
Lokalizacja:Wrocław
Kontaktowanie:

Re: Komunikacja przez uart problem

Postautor: Press » 22 sie 2011, o 18:04

http://ep.com.pl/files/4556.pdf
http://ep.com.pl/files/4539.pdf
a poczytaj kolego te dwa linki.
Co prawda to R485 w tytule ale to tylko warstwa sprzętowa. A sama transmisja RS232. Może transmisja buforowana Ci rozwiąże problem bo nie będziesz gubił danych.

Awatar użytkownika
pikczu
-
-
Posty:89
Rejestracja:5 paź 2003, o 19:55
Lokalizacja:Dublin
Kontaktowanie:

Re: Komunikacja przez uart problem

Postautor: pikczu » 1 wrz 2011, o 21:17

Całkowicie musisz zmienić podejście do tematu.
Pominę na razie ustawienia Fusów itp.
Popatrz na twoją część odbiorczą:

Kod: Zaznacz cały

Do A = Waitkey() Cls Lcd "zmienna a=" ; A Loop

Twój program nie będzie działał poprawnie ponieważ ty z góry mu narzuciłeś kiedy ma odbierać (nasłuchiwać) dane. A przecież nie wiesz kiedy nadajnik je będzie wysyła i przez jak długo.
Musisz ustawić bufor odbioru i przenieść odbiór do przerwania.
dane przychodzące do bufora będą informacją że program ma się zając w tej chwili odbieraniem a nie np wyświetlaniem na LCD.

Więc tak musisz dodać bufor:

Kod: Zaznacz cały

Config Serialin = Buffered , Size = 60
rozmiar na razie nie jest istotny wyjdzie w praniu
Koniecznie musisz włączyć przerwanie

Kod: Zaznacz cały

Enable Interrupts Enable Urxc

I teraz główny punk programu moment decyzji czy odbierać czy nie.
Potrzebna będzie zmienna najlepiej bitowa bo będziemy tylko wystawiać chorągiewkę.
jakaś zmienna opisze ją "Serial_flag" nazwa łatwa i mówiąca o co biega.
I nasz klucz Ischarwaiting czyli "jeśli znak czeka"

Kod: Zaznacz cały

Serial_flag = Ischarwaiting()
jeśli jest znak w buforze wystawia naszą flagę.
A jeśli mamy flagę że znak już jest w buforze gotowy do odebrania musimy go teraz gdzieś przepisać żeby nie doprowadzić do przepełnienia bufora.
Najlepiej przepisać do zmiennej tablicowej czyli jeśli twoja paczka danych będzie miała 6 bytów zrobisz tablicę o rozmiarze 6 ale można więcej mniej jak kto woli.
"Dim Serial_rx(6) As Byte " Zmienna tablicowa do odbioru danych na 6 byteów
Teraz odbieramy:

Kod: Zaznacz cały

If Serial_flag = 1 Then Inputbin Serial_rx(1) , 6 End If
użyj inputbin do odbioru i printbib do wysyłki.

można dodać jeszcze sygnalizację odbioru na jakiegoś leda czy "cuś" w tym wypadku portb.0
Całość mogła by wyglądać tak:

Kod: Zaznacz cały

Serial_flag = Ischarwaiting() Portb.0 = Serial_flag If Serial_flag = 1 Then Inputbin Serial_rx(1) , 6 End If
Wrócę jeszcze do bufora odbioru, powiedz my że program jest w momencie wyświetlania na LCD i nie jest w stanie przejść do "Ischarwaiting" w tedy dane trafiają do bufora o pojemności w tym przykładzie 10 transmisji.

Cześć nadawcza:
Praktycznie to samo tylko dla części nadawczej.
Zmienna z której będziemy nadawać "Dim Serial_tx(6) As Byte "

Kod: Zaznacz cały

Config Serialout = Buffered , Size = 6
bufor wyjściowy

Kod: Zaznacz cały

Enable Interrupts Enable Utxc
przerwania

Kod: Zaznacz cały

Printbin Serial_tx(1) ; 6
i samo wysyłanie sześciu byteów w nawiasie podajesz od którego byte-u ma zacząć wysyłać.
Proste i skuteczne
Pozdrawiam
Pikczu

wacha
-
-
Posty:95
Rejestracja:22 lis 2009, o 21:19
Lokalizacja:biele

Re: Komunikacja przez uart problem

Postautor: wacha » 16 wrz 2011, o 18:30

Dzięki serdeczne za te praktyczne rady jak bende miał chwilę czasu to sprawdze działanie programu i napisze czy mi to działa pozdrawiam. :D

Dodano po namyśle:

Witam ponownie właśnie przerobiłem programy jak podpowiedzał kolega piczku i teraz kody wyglądają tak:
Nadajnik:

Kod: Zaznacz cały

$regfile = "attiny2313.dat" $crystal = 4000000 $baud = 9600 Dim Adres As Byte Dim Komenda As Byte Config Rc5 = Pind.6 Config Serialout = Buffered , Size = 8 Enable Interrupts Enable Utxc Do Getrc5(adres , Komenda) Komenda = Komenda And &B01111111 Printbin Adres Printbin Komenda waitms 200 Loop End
Nadajnik ma za zadanie odebrać komende i adres z pilota rc5 i wysłać te dane za pomocą uarta do odbiornika.
Odbiornik:

Kod: Zaznacz cały

$regfile = "attiny2313.dat" $crystal = 4000000 $baud = 9600 Dim Serial_flaga As byte Dim Adres As Byte Dim Komenda As Byte Config Serialin = Buffered , Size = 8 Enable Interrupts Enable Urxc Do Serial_flaga = Ischarwaiting() If Serial_flaga = 1 Then Inputbin Adres Inputbin Komenda Else Cls Lcd "adres=" ; Adres Lowerline Lcd "komenda" ; Komenda End If Waitms 200 Loop End
I wszystko działa pięknie dzięki serdeczne za pomoc
pozdrawiam.

Edited by Pajączek.

Awatar użytkownika
pikczu
-
-
Posty:89
Rejestracja:5 paź 2003, o 19:55
Lokalizacja:Dublin
Kontaktowanie:

Re: Komunikacja przez uart problem

Postautor: pikczu » 17 wrz 2011, o 11:11

Jeszcze źle zamiast dwóch osobnych zmiennych na adres i komendę zrób jedna tablicową.
Czyli Dim Paczkadanych(2) as byte
I teraz twój pierwszy byte w tablicy to adres a drugi to komenda

Teraz po getrc5
musisz przepisać te dane do tablicy
czyli:
paczkadanych(1)= adres
paczkadanych(2) = komenda

Co pozwoli na zamienienie na jedno printbin paczkadanych(1);2

wtedy nie będzie możliwości na pomyłkę że np adres zajmie miejsce komendy.
Pozdrawiam


___________________________edit____11:28______________________________

Kod: Zaznacz cały

Dim Serial_flaga As Byte Dim Paczkadanych(2) As Byte 'zmienna balicowa do odebrania Dim Adres As Byte Dim Komenda As Byte Config Serialin = Buffered , Size = 20 'miejsce na 10 nie odebrancyh transmisji Enable Interrupts Enable Urxc Do Serial_flaga = Ischarwaiting() If Serial_flaga = 1 Then Inputbin Paczkadanych(1) , 2 Adres = Paczkadanych(1) , 1 Komenda = Paczkadanych(2) , 1 Else ' to ELSE jest bez sensu poco w momencie nie odbiernaia komend co chwile 'czyscisz i wyswietlasz te same dane ???? 'totalny bez sens Cls Lcd "adres=" ; Adres Lowerline Lcd "komenda" ; Komenda End If Waitms 200 Loop End

----------------------edit 11:35------------------------------------------------
Odbiornik :

Kod: Zaznacz cały

Dim Serial_flaga As Byte Dim Wyswietl As Bit Dim Paczkadanych(2) As Byte 'zmienna balicowa do odebrania Dim Adres As Byte Dim Komenda As Byte Config Serialin = Buffered , Size = 20 'miejsce na 10 nie odebrancyh transmisji Enable Interrupts Enable Urxc Wyswietl = 1 Do Serial_flaga = Ischarwaiting() If Serial_flaga = 1 Then Inputbin Paczkadanych(1) , 2 Adres = Paczkadanych(1) , 1 Komenda = Paczkadanych(2) , 1 Wyswietl = 1 ' to na pierwszy raz zeby wyswietlacz nie by pusty po starcie End If If Wyswietl = 1 Then Cls Lcd "adres=" ; Adres Lowerline Lcd "komenda=" ; Komenda Wyswietl = 0 End If Loop End
Poprawiłem wyświetlanie na lcd bo było bez sensu
Tak się nie robi bo poco wyświetlać w kółko te same dane dlatego musiałeś dodać to wait na dole bo wyświetlacz migał a wystarczyło zrobić warunek że jeśli są jakieś nowe dane to wyświetla jelsi nie to stare dane nadal są na LCD.


---------------------------------------------Edit 14:40---------------------------------------------------------------
poprawiłem (mam taka nadziej bo nie mam jak tego przetestować) plik nadawania

Kod: Zaznacz cały

$sim $regfile = "attiny2313.dat" $crystal = 4000000 $baud = 9600 Dim Flag1 As Bit Dim Flag2 As Bit Dim Paczkadanych(2) As Byte Dim Adres_1 As Byte Dim Komenda_1 As Byte Dim Adres As Byte Dim Komenda As Byte Config Rc5 = Pind.6 Config Serialout = Buffered , Size = 20 Enable Interrupts Enable Utxc Do Getrc5(adres , Komenda) Komenda = Komenda And &B01111111 If Adres <> Adres_1 Then Set Flag1 End If If Komenda <> Komenda_1 Then Set Flag2 End If Adres_1 = Adres Komenda_1 = Komenda Paczkadanych(1) , 1 = Adres_1 Paczkadanych(2) , 1 = Komenda_1 If Flag1 = 1 Or Flag2 = 1 Then Printbin Paczkadanych(1) , 2 Flag1 = 0 Flag2 = 0 End If Loop End

wacha
-
-
Posty:95
Rejestracja:22 lis 2009, o 21:19
Lokalizacja:biele

Re: Komunikacja przez uart problem

Postautor: wacha » 17 wrz 2011, o 20:24

Słuszne podpowiedzi ja tak za bardzo nie chciałem się wgłębiać w to wyświetlanie na lcd chciałem tylko się nauczyć jak zrobić komunikację pomiędzy mikrokontrolerami przez uart. Tak naprawde to robie taki domowy system kokunikaci temperatura , data , godzina , bydzik i sterowanie oświetleniem led w pokoju i chcę aby mikrokontrolery się komunikowały ze sobą a to ćwiczenie mi w tym świetnie pomogło. Wiem że lepsza była by komunikacia przez spi ale uart wystarczy zupełnie.

wacha
-
-
Posty:95
Rejestracja:22 lis 2009, o 21:19
Lokalizacja:biele

Re: Komunikacja przez uart problem

Postautor: wacha » 3 lis 2011, o 16:35

Witam ponownie nie chciałem zakładać nowego tematu ale czy może ktoś z was forumowicze wie przy pomocy jakiego modułu zrobić komunikacje bezprzewodową przez UART chodzi mi o moduł do komunikacji bezprzewodowej? :?

Awatar użytkownika
pajaczek
Moderator
Moderator
Posty:2653
Rejestracja:24 sty 2005, o 00:39
Lokalizacja:Winny gród

Re: Komunikacja przez uart problem

Postautor: pajaczek » 3 lis 2011, o 20:40

A może tak jakieś szczegółowsze wymogi?
Jakiego zasięgu komunikacja?
Jakiego poziomu transfery?
Jaki budżet?

wacha
-
-
Posty:95
Rejestracja:22 lis 2009, o 21:19
Lokalizacja:biele

Re: Komunikacja przez uart problem

Postautor: wacha » 4 lis 2011, o 15:56

A więc tak to zasięg ok.200m prędkość transmisji danych nie ma znaczenia , budrzet w granicach 100zł za moduł.

Awatar użytkownika
pajaczek
Moderator
Moderator
Posty:2653
Rejestracja:24 sty 2005, o 00:39
Lokalizacja:Winny gród

Re: Komunikacja przez uart problem

Postautor: pajaczek » 8 lis 2011, o 09:07

No to BT raczej odpada, zerknij może na ZigBee (np. w Maritexie widzę mieszczące się w Twoich granicach).
Jeżeli nie, to proste tanie transceivery na 433/868MHz, w cenach do 20 zł (30 zł), tyle że tu musiał byś zatroszczyć się o wszystko (protokół). No i zwykle jakiś pośrednik SPI/I2C <=> UART

Awatar użytkownika
Łukasz Krysiewicz
-
-
Posty:143
Rejestracja:8 cze 2011, o 20:03

Re: Komunikacja przez uart problem

Postautor: Łukasz Krysiewicz » 10 lis 2011, o 21:34

Bluetooth zdecydowanie odpada ( za mały zasięg), ZigBee również :D
co prawda specyfikacja ZigBee podaje, zasięg do 100 m, ale w praktyce
jak testowałem moduły to w otwartym terenie uzyskiwałem zasięg
rzędu 40 metrów, w budynku przez jedną ścianę jeszcze się "przebijałem"
dwie to była już zapora nie do pokonania (może to wina modułu który stosowałem)

tak jak pisze pajączek, zastosuj transceiver w paśmie ISM poniżej 1 GHz
ja jestem zwolennikiem Texasa dlatego też polecę Ci moduły CCxxxx
(dawny "norweski" Chipcon kupiony przez TI, jeśli mnie pamięć nie myli w 2006 roku)
na dobry początek możesz poeksperymentować z modułem startowym ez-430 RF2500
http://processors.wiki.ti.com/index.php/EZ430-RF2500
ez-430-rf2500.jpg
moduł nadaje w paśmie 2.4 GHz, obsługiwany jest przez MSP'eka
do transmisji używany jest autorski protokół TI o nazwie "SimpliciTI"

Awatar użytkownika
pajaczek
Moderator
Moderator
Posty:2653
Rejestracja:24 sty 2005, o 00:39
Lokalizacja:Winny gród

Re: Komunikacja przez uart problem

Postautor: pajaczek » 11 lis 2011, o 14:14

Bluetooth zdecydowanie odpada ( za mały zasięg), ZigBee również co prawda specyfikacja ZigBee podaje, zasięg do 100 m, ale w praktyce jak testowałem moduły to w otwartym terenie uzyskiwałem zasięgrzędu 40 metrów, w budynku przez jedną ścianę jeszcze się "przebijałem"dwie to była już zapora nie do pokonania (może to wina modułu który stosowałem)

Kod: Zaznacz cały

ZIG-ETRX2-PA Moduł ZigBee Telegesis ETRX2 o zwiększonym zasięgu (do 1000m), z wbudowaną anteną wewnętrzną, wymiary 37.75 x 20.5 mm, czułość: -97 dBmIlość Cena(netto) [za szt]: 75.00zł Cena(brutto) [za szt]: 92.25zł
Wiem że sporo w tych osiągach przesady, ale te 200-300 m powinno się osiągnąć, oczywiście w terenie otwartym.

Ps. Poprawiłem Ci jedną literówkę, bo brzmiało to dość... dziwnie ;)

Awatar użytkownika
Łukasz Krysiewicz
-
-
Posty:143
Rejestracja:8 cze 2011, o 20:03

Re: Komunikacja przez uart problem

Postautor: Łukasz Krysiewicz » 11 lis 2011, o 17:12

Ps. Poprawiłem Ci jedną literówkę, bo brzmiało to dość... dziwnie ;)
ok, dzięki :D
pisałem w pośpiechu,

wracając do tematu, to skoro dokumentacja podaję zasięg 1.000 metrów, to mnożąc ten wynik przez współczynnik wiarygodności (z mojego opisanego doświadczenia wynika że współczynnik ten wynosi 0,4 :D ) otrzymujemy zasięg rzędu 400 metrów,

a tak na poważnie, to trzeba by przetestować ten moduł, ( patrząc w dokumentację to moduł ten prezentuje się bardzo obiecująco )

wacha
-
-
Posty:95
Rejestracja:22 lis 2009, o 21:19
Lokalizacja:biele

Re: Komunikacja przez uart problem

Postautor: wacha » 14 lis 2011, o 18:49

To może napisze co mi dokładnie chodzi po głowie mianowicie robię sobie coś w rodzaju inteligentnego domu tylko po mojemu nie jest to za wiele inteligentne.
W każdym pokoju będę miał zamontowane oświetlenie ledowe(w chwili obecnej mam zamontowane w jednym pokoju) jest ono sterowane mikroprocesorem steruje on jasnością oraz mogę włączać i wyłączać zarówno włącznikiem w ścianie jak i pilotem.
Skoro jest mikroprocesor to głupio by było wykorzystać go tylko do tak prostych rzeczy więc steruje on też wyświetlaczami led podają one temperaturę w pomieszczeniu , datę , czas i dzień tygodnia.
Mam tam też zaimplementowany budzik i kilka funkcji nastawu daty i czasu ustawiane pilotem RC5.
Moduły pokojowe komunikują się z głównym (na razie jeszcze go nie dokończyłem)modułem poprzez UART stąd pytania wcześniejsze jak mają się one komunikować aby nie gubiły danych.
Moduły pokojowe przesyłają dane do modułu głównego o temperaturze w pomieszczeniach , o prądzie pobieranym przez ledy (rodzaj zabezpieczenia) , a moduł główny wysyła do modułów pokojowych ustawienia czasu i daty po włączeniu zasilania i chciałbym aby można było włączać oświetlenie w poszczególnych pomieszczeniach zdalnie w przyszłości planuje rozbudować ten system np.aby sterować elektrycznie otwieraną bramą oraz drzwiami do garażu itp. i właśnie do tego mi potrzeba tych modułów.
W zasadzie sygnał powinien przeniknąć przez jedną ścianę i aby wtedy miał zasięg ok.60-80m.
Te moduły zigbee podobają mi się ale nie wiem jak napisać program w bascomie do ich obsługi? :?

Edit by Pajączek: 8 ortów i kilka literówek ;/

Awatar użytkownika
pajaczek
Moderator
Moderator
Posty:2653
Rejestracja:24 sty 2005, o 00:39
Lokalizacja:Winny gród

Re: Komunikacja przez uart problem

Postautor: pajaczek » 14 lis 2011, o 20:25

Będziesz miał do napisania konfigurację UART (da się zdaje się również i2c i spi) i wysyłanie/odbieranie komend sterujących (komendy AT ) no i oczywiście właściwych danych ;)

wacha
-
-
Posty:95
Rejestracja:22 lis 2009, o 21:19
Lokalizacja:biele

Re: Komunikacja przez uart problem

Postautor: wacha » 15 lis 2011, o 16:57

Można by też przez spi tylko nie wiem za bardzo jak zrobić tą konfigurację i komendy sterujące odbieranie i wysyłanie danych to nie problem.
Byłbym wdzięczny gdyby ktoś podał mi przykład jak obsłurzyć ten moduł w bascomie.

Wróć do „AVR/AVR32”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 4 gości