...Jakie jest zatem rozwiązanie tego problemu (jeśli jest)? Bascomowy UART programowy działa jedynie wtedy , kiedy wywołamy funkcję z nim współpracującą. W pozostałych przypadkach ( kiedy działają funkcje/procedury nie związane z programowym UART-em ) , nadchodzące dane są "niewidoczne" dla procka :( Np. jeśli masz w kodzie Wait 1 , a w czasie działania...
To nie są problemy Bascoma, w bascomie można wiele rzeczy szybko zrobić, tylko jak ktoś go nie zna to najłatwiej i naszybciej jest na niego psioczyć i wylewać swe żale. ale ok, skoro ty (o ile dobrze zrozumiałem) w jakimś tam przerwaniu wysyłasz coś poleceniem PRINT przez łącze RS232 a następnie w tym samym przerwaniu czekasz na odbiór przez RS232 (waitkey)...
To wiele wyjaśnia. Spróbuj tak ;) [syntax=vbnet]$regfile = "m8def.dat" $crystal = 8000000 $hwstack = 64 $swstack = 16 $framesize = 64 $baud = 9600 Config Lcd = 16x2 Config Lcdpin = Pin , Db4 = Portb.3 , Db5 = Portb.2 , Db6 = Portb.6 , Db7 = Portb.0 , E = Portb.4 , Rs = Portb.5 Cursor Off : Cls Dim K1 As Byte Dim K2 As String * 20 Dim Id As String *...
Ale mi nie chodziło o bufor programowy - AVR-y serii mega mają wbudowany bufor sprzętowy. Opóźnienie odebrania jednego znaku o kilka ms (w przypadku bardzo rozbudowanych procedur) nie powinno więc spowodować problemów
UART nie ma tutaj nic do rzeczy bo rozdzielić trzeba dane które już są w pamięci. Chodzi o BASCOMa w którym się ciężko pisze. I o niezrozumiały opis. A do tego nie bardzo rozumiem o jakie zera Ci chodzi. Bo z tego co napisałeś to wynika że Ty zamiast 32 to odbierasz 64 znaki. I do tego jakieś zera (których nie ma) Ci obcina. Może BASCOM to konwertuje...
Witam! Mam kłopot z odbiorem danych z PC. Podłączam uC do PC + terminal i wpisuje ciąg danych r:122.g:144.b:125 i enter no i wszystko super bo diody przygasają, ale jest problem jak Podepnę pod linuxa i chcę wysłać w ten sposób echo "r:122.g:144.b:125" > /dev/ttyUSB1 i nic sie nie dzieje, wiec moje pytanie w jaki sposób wysyłać dane lub co zmienić...
Witam. Chciałbym uzyskać efekt parametru echo on instrukcji input (mikrokontroler otrzymuje znaki po UART, i natychmiast wysyła je spowrotem) dzięki czemu na ekranie monitora portu COM będę miał wyświetlane wpisywane przez siebie znaki. Niestety używam konwertera http://obrazki.elektroda.pl/2797859300_1... Oczywiście w takim przypadku...
Witam, Jak sprawnie odebrać dane bajty lub znak ascii z przedziałów: - 1..32 - 126..255 Gdyż program sprawuje się rewelacyjnie i NIEZAWODNIE jak odbieram tylko znaki z klawiatury, a ja chcę przesłać z PC do uC ok 1MB danych z zakresu Bajt = 1..255 Rozwiązanie jakie jest poniżej - rewelacja! Lecz moja ramka danych jest 128bajtowa i docelowo 128bajt jak...
pracownia z prockow:) odrazu implementacja z przesylaniem danych przez rs232. moze sie polapiesz bo kod jest troche zaspamiony pozdro bufor EQU 030h;adres początkowy buforu danych index EQU 02fh;index ostatniego bajtu w buforze index2 EQU 02eh;index pierwszego bajtu w buforze ORG 0H SJMP RESET org 023h;przerwanie od portu szeregowego JNB ri, serout;w...
$crystal = 8000000 $baud = 9600 Config Lcd = 40 * 2 Config Serialin = Buffered , Size = 20 Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portc.1 , Rs = Portc.0 Enable Interrupts Dim Command As String * 1 Dim Temp1 As Integer Dim Temp2 As Integer Dim Status As Byte Dim Numer As Byte Temp1 = 12.1 Temp1 = 30.1...
Rozwiązanie jest proste :) Odbieraj 156 znaków. Po odebraniu znaku zwiększaj zmienną pomocniczą. Jeśli osągnie ona 156 to zakończ odbieranie. Użyj np. petli FOR..NEXT lub DO..LOOP UNTIL
Przy instrukcji Input "odebranie znaku <CR> (kod 13) kończy wprowadzanie danych dla bieżącej zmiennej." A co jeśli znak <CR> nie zostanie nadany? Wtedy program stoi i czeka!
Zawsze odbierasz przez UART dane binarne. Możesz je tylko sobie wyświetlić lub wypisać jako znaki, liczby dziesiętne lub szesnastkowe. Odbierasz bajty, masz z nich złożyć daną 16-bitową, np. tak: wartosc = bajt_mniej_znaczący + bajt_bardziej znaczący * 256
Jakież to przerwanie muli ci PC-ta mógłbyś rozwinąć ? Użyj zwykłego terminana od windows i zobacz co dostajesz, może masz niedopowiednie prędkości transmisji dla PC i uP ? Uzyj przerwania odbioru znaku z bufora UART nie będzie się nic mulić bo twój program większkośc czasu poświęca na oczekiwanie na odbior znaku z PC-ta. O I2C zapomnij bo nie masz takiego...
Jak XX i ZZZ to znaki przedstawiające liczbę, i dodatkowo ilość znaków jest zawsze taka sama to masz cztery proste operacje: s=MID(<parametry>), x=VAL(s), s=MID(<parametry>), z=VAL(s).
Dzięki za chęci, ale nadal gubię początek ramki.. :(
Z tego co pamiętam to serial in i out używały programowego uarta co oznaczało mniej więcej tyle ,że jak nie czeka na znak to gubi to co dostaje . Dlatego podstawą jest sprzętowy uart obsługiwany w przerwaniach i w taki sam sposób zrealizowane sterowanie przełączanie sygnałów nadawanie , odbiór w konwerterze RS485. Uart generuje szereg przerwań informujących...
pomożecie z tym odbiorem znaku zachęty?
Zastosuj bufor: Config Serialin = Buffered , Size = 100 enable interrupts A oczekiwanie na znak zrób: Bufor_flaga = Ischarwaiting() : If Bufor_flaga = 1 Then Gosub Odbierz_uart Następnie procedura odbioru danych: Odbierz_uart: Bufor = "" Do Bufor_znak = Inkey() Bufor = Bufor + Chr(bufor_znak) Bufor_flaga = Ischarwaiting()...
Zrobilem cos podobnego, tyle ze zapis na karcie SD. Generalnie problem jest dosc prosty, tylko musisz zrobic bufor (np cykliczny) do odbioru znakow z uarta, bo bedziesz gubic dane. Mozesz zrobic tak, ze odbierasz np 30 znakow i dopiero cala paczke zapisujesz w eepromie, w tym czasie inne znaki sa zapisywane w buforze. Dlugosc bufora musisz tak dobrac...
Tak prymitywnie to wyślij to sobie ze spacją i potem podziel otrzymany string szukajac spacji [syntax=vbnet] Print V1 ; " " ; A1 Dim MyArray(2) As String * 5 , M As Byte M = Split(CalyOdebranyString , MyArray(1) , " ") 'podziel szukając spacji Locate 1 , 1 : Lcd MyArray(1) Locate 2 , 1 : Lcd MyArray(2)[/syntax] Radzę też napisać u góry w kodzie : [syntax=vbnet]Config...
No dobra. Wywal wszystko na linii Tx telefonu do Rx procesora. Ma być połączenie bezpośrednie. Na drugim kierunku zostaw tak jak masz. Poniżej kod do testów. Powinien działać. [syntax=basic4gl]$regfile = "m32def.dat" $crystal = 16000000 $baud = 19200 Config Lcd = 16 * 2 Config Serialin = Buffered , Size = 100 Enable Interrupts 'Declare Sub Oproznij_bufor...
pewnie piszesz w bascom ,wiec masz kod odbierania danych (całych stringów ) w przerwaniu :) : Config Serialin = Buffered , Size = 20 do If Ischarwaiting() = 1 Then '1 - odebrano znak,0 - pusty bufor Call Read_rs232 End If loop Sub Read_rs232 Dim Bufor As String * 24 Input Bufor Noecho end sub
Niestety Jak dam instrukcję ustawienia bufora to już nic nie odbiera (nadawać nadaje). Właśnie zauważyłem że jak zepnę RX z TX uP (wywale printa z głównej pętli i dam wait na 5sek. ) to odbiór też jest na 3 znaki :/
...Albo wyrzuciś print albo przerwanie od serial... Albo ... troszkę pokombinować :D Wystarczy że się wie jak działa proc i Bascom ;) W zasadzie wszystko opisał szymtro , więc skupię się na programiku $large $crystal = 11059200 '$regfile = "420.dat" 'DS89c420 $baud = 19200 On Serial Seriall ' odebrany znak Dim Uli As Byte ' odebrano znak...
Witam serdecznie, Czy już coś wiadomo na temat wysyłania i odbioru danych. Pozdrawiam
Aaaaa, Chr(0) to domyślny znak końca string'a w BASCOM'ie !
Dlaczego odbierasz w pętli do loop ? Skoro używasz bytematch to czemu tego nie wykorzystujesz ? Gdzieś niedawno pisałem o tym. Możesz poszukać, bo tam zamieściłem działający kod. Tymczasem podpowiem Ci algorytm odbioru: W podprogramie Serial0charmatch ustawiaj tylko flagę. W pętli głównej sprawdzasz czy flaga jest ustawiona i jeśli jest to odczytujesz...
Najlepiej to dać znacznik początku ramki a na końcu jakieś CRC. Odbiornik powinien szukać znacznika początku i jak na niego trafi to zacząć odbierać pozostałe dane. Jak zbierze ich 513 to z 512-tu oblicza CRC i porównuje ze znakiem 513-tym. Jak dobre to zapisuje, jak złe to odrzuca. A sam odbiór to w przerwaniu, i zapis do bufora z jednoczesnym inkrementowaniem...
Możesz użyć Inkey. Tylko funkcja ta ma taką cechę że nawet jak nic nie ma w UDR to zwraca 0. Także najlepiej zrób to w ten sposób że najpierw sprawdzasz czy jest znak (Ischarwaiting) a potem jeśli jest, to odbierasz Inkeyem. Można też zrobić to w przerwaniu. Jeśli początek odbieranego tekstu masz stały to można też zrobić pętlę w któej ciągle pytasz...
Sproboj zrobic tak, żeby procesor po odebraniu danych czekał na określony znak (przyslany z komputera przez RS), po jego odebraniu niech natychmiast odsyla dane, w prog. na PC trzeba oczywiscie odbierać dane zaraz po wyslanie tego znaku inicjującego odbiór... Upewnij się też, czy nie masz zapełnonenego bufora nadawczego w uC.
String zakończony jest 0, a znak enter to 0x0D musiałbyś to rozwiązać
$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...
ale jak tam dodam czyszczenie bufora to on sie wyczyści przed wyjściem z programu obsługi przerwania..i nic się nie wyświetli raczej.. zależy mi na tym by wielkość bufora była na jeden znak. Chyba tak jest najlepiej ?
W kwestii bascom-u Ci nie pomogę ale może wykorzystasz wstawki asemblerowe ; .org 0 rjmp RESET ; Reset rjmp EXT_INT0 ; zewnetrzne Int0 rjmp EXT_INT1 ; zewnetrzne Int1 rjmp TIM1_CAPT ; zewnetrzny wychwyt wartosci licznika 1 rjmp TIM1_COMPA ; komparator A licznika 1 rjmp TIM1_OVF ; przepelnienie licznika 1 rjmp TIM0_OVF ; przepelnienie licznika 0 rjmp...
Witam, Nie znam BASCOM'a ale procesory AVR oferują przerwanie w momencie odebrania znaku. Wykorzystaj przerwania i bedziesz miał daną w momencie odbioru, a w tym czasie program może wykonywać co do niego należy Pozdrawiam
Dobrze, że chcesz to przesyłać w trybie tekstowym. Zatem od strony mikrokontrolera poczytaj sobie w Bascomie o poleceniach: Config Seriallin INPUT Config INPUT Ischarwaiting a także do operacji na łańcuchach znaków: MID LEFT RIGHT itp to powinno cię naprowadzić.
Obsługa UART jest przerywana TIMEREM i dlatego gubi znaki. Zrób odbiór UARTU na przerwaniach, odbieraj w nim tylko pojedynczy znak i ładuj go do bufora (nie czekaj w tej funcji,aż odbierzesz wszystkie znaki), a po odebraniu końcowego znaku ustawiasz flagę, że skończył. I w pętli głównej dekodujesz sobie na spokojnie tą ramkę. Popróbuj może jeszcze ze...
Jak pisze print "2" to oprócz liczby 2 wysyłasz też dwa znaki - CR i LF Jeśli chcesz wysłać tylko 2 to zakończ printa średnikiem, czyli Print "2";
(at)Mat_91 Nadajnik wygląda ok. Tylko przy pierwszym ustawianiu ChkSum stosuj = zamiast +=. A więc nadajnik: RFXX_WRT_CMD(0x0000); RFXX_WRT_CMD(0x8238); RFM12b_send(0xAA); RFM12b_send(0xAA); RFM12b_send(0xAA); RFM12b_send(0x2D); RFM12b_send(0xD4); RFM12b_send(0x30); ChkSum=0x30; // zamiast...
Za punkty - nie, przynajmniej nie ja. Ale cos pomóc mogę. Zrealizowałem już parę projektów uC + vb6 i jakoś one działają. Może zacznijmy od samego uC. Jeżeli był by to asm (bascom + zaawansowany bascomowiec) to zrobiłby to na dwuch tablicach które wyrażały by bufor odbioru i nadawania np rs_tx_bufor(12) as byte i rs_rx_bufor(12) as byte Można by to...
Dzięki lecz - NIE ZDA TO EGZAMINU Ja odbieram dane z przedziału 0..255 Jak zastosuje twoje rozwiązanie to jak wystąpi mi w ramce danych znak 13 to program wykryje że jest koniec transmisji - przerabiałem to Bascom jedynym sprawdzonym i profesjonalnym odbiorem danych jest mój zapis reszta to dla amatorów "zapal zgaś diodę" - Bez obrazy! Lecz to doświadczenie
Próbowałem jeszcze waitkey - efekt ten sam tyle że waitkey jak gsm już nie nadaje wiesza program... INPUT nigdy nie używałem. Wstawiłem teraz na szybko INPUT znak (w miejsce znak =inkey() ) Efekt jest taki że nie czyta nic. Cisza. Zmykam do pracy, może po południu coś jeszcze pogrzebie przed weekendem... Pozdro :)
trochę dziwnie to robisz: czekasz na znak w buforze - to jest oki a jak masz to po kolei odczytujesz 6 znaków - i to już może być złe bo skąd wiesz że jak odczytasz pierwszy to masz już następny ? a co jak nic tam nie ma ? (np. przyszło mniej znaków) może lepiej by było za każdym razem sprawdzać czy coś jest
To zależy co robisz w przerwaniach. Wysyłanie znaku z klawiatury zajmuje ok. 4ms. W przerwaniach obsługuję odbiór i nadawanie znaków przez uart i odczyt z ADC- i nic się jakoś nie psuje. Być może- jeszcze. Ale co ile Twój Timer0 generuje przerwanie- nie wiadomo- bo nie podałeś częstotliwości. I ile czasu zajmuje obsługa przerwania- też nie wiadomo....
Deklaruję zmienną jako bajt i jej wartość ustawiam na 0. Następnie wysyłam ją po rs232. Na terminalu ustawionym na odbiór stringów mam prawidłowo odebraną daną - czyli 0. Jak ustawię odbiór hex'ów to wyświetla mi 30 30 0D 0A. Jak jest ta dana konwertowana na hexa? Ona nie jest konvertowana na hex. Print służy do wyświetlania na terminalu więc wartość...
witam up avr po odbiorze znaku przez uart generują przerwanie (rxc), czy w bascomie istnieje możliwość "sprawdzenia" przerwania od uarta? wiem że jest polecenie "ischarwaiting" jednak to polecenie musze umieścić w kodzie programu i sprawdzać nim czy w buforze odbiorczym jest jakiś znak, natomiast interesowało bym mnie jakieś przerwanie które przerywało...
Ok. Znalazłem, mam tylko jeszce jedno pytanie. Bo program pisze na ATmega128 i korzystał będę z 2 UARTów czy odbieranie w przerwaniach będzię dla uart1 i uart2 czy tylko dla jednego?? Dokładnie wygląda to tak: UART1 wykorzystuje do komunikacji procka z PC (RS-232). UART2 wykorzystuje do komunikacji pomiędzy innymi urządzeniami (RS-485). Jak masz może...
Sposób odbioru poprzez procedurę obsługi przerwania od URXC jest lepszy, ale: 1. Nie możesz przy wejściu do procedury obsługi przerwania kasować zmiennej Ciag_rx ponieważ przerwanie od URXC jest wywoływane dla każdego odebranego znaku; 2. Nie możesz w procedurze obsługi stosować Do...Loop ponieważ blokujesz odbiór i pętlę główną do czasu odebrania końca...
Witam serdecznie! Co znaczą znaki zapytania przy odbiorze i odczycie danych z PCF8583, przy godzinach minutach i sekundach , błąd komunikacji? Jak w ogóle powinien zareagować układ co powinien wyświetlić przy pierwszym poprawnym odpaleniu? Dzięki :)
odbiór znaku rs232 bascom odbieranie znaku odbiór bascom
wymiana akumulatora centrala manta ładowanie głośnika wzorcowanie sondy
Lokalizacja przekaźnika wentylatora wnętrza w pojazdach ASRock AM2NF6G-VSTA - Problemy z uruchomieniem