Prawie że na kolanie napisane: #include <avr/io.h> #include <avr/interrupt.h> #define USART_BAUDRATE 57600 #define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1) // maksymalna liczba znaków polecenia #define UART_MAXBUFF 16 // bufor znaków polecenia (UART_MAXBUFF znaków + jeden pod znak zero)...
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
A czy włączyłeś przerwanie od wysłanego znaku?
Jak to testujesz? Wpisujesz znaki na terminalu czy wysyłasz z programu? Jeśli to drugie - musisz czekać na odpowiedź mikrokontrolera po wysłaniu każdego łańcucha. Proponuję też wyczyścić kod procedury odbioru łańcucha: [syntax=c]while (StringLen < MaxLen - 1 && (NextChar = USART_receive()) != '\n') { *Buffer++ = NextChar; StringLen++; } [/syntax]...
No raczej właśnie tak jak piszesz - pierwszy znak nadać "ręcznie" a kolejne nadadzą się same dzięki przerwaniu. Innej sensownej możliwości nie widzę. Z drugiej strony, żeby takie nieblokujące nadawanie w pełni wykorzystać potrzebujesz bufor z którego znaki będą nadawane. Wtedy możesz wykorzystać jedną funkcję, np. Send("Ala ma kota"), która skopiuje...
String to znaki ASCII, więc ustawiasz sobie 2 znaki (2 wartości bajtu) spoza używanego obszaru ASCII i traktujesz je jako stop i start. Algorytm wygląda tak: 1. Czekam na bajt start (lub wykrywam jego nadejście w odpowiednim przerwaniu) 2. Otrzymałem bajt start - zaczynam odbiór 3. powtarzam w pętli (dopóki nie otrzymam bajta) stop: a) odbierz znak...
Spróbuj tak: odczyt [syntax=c] if(eeprom_is_ready()) { eeprom_read_block(&ustawienia,&ustawieni... } [/syntax] zapis [syntax=c] cli();//Globalna blokada przerwań if(eeprom_is_ready()) { eprom_write_block(&ustawienia,&ustawieni... } sei();//odblokowanie przerwań [/syntax]
'Działa od 30rpm do 300000rpm $regfile = "m8def.dat" $crystal = 8000000 Config Lcd = 16 * 2 Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5 Config Timer1 = Timer , Prescale = 64 Config Int0 = Rising Dim Flaga As Byte Dim Text As String * 10 Dim Wynik As Single Dim Zmienna As...
Witam, najprościej mozna zrobic tak : ISR(SIG_UART_RECV){ static unsigned char poz_buf_rs_1=0; unsigned char Odczyt=UDR; static char buf_rs[10]; buf_rs[poz_buf_rs_1]=Odczyt; poz_buf_rs_1++; buf_rs[poz_buf_rs_1]=0; if(Odczyt==13){ if(strncmp(buf_rs,"*IDN?",5)==0){ poz_buf_rs_1=0; } } To jest przykład który po odebraniu ciagu *IDN? wykonuje to co zawarte...
Pomysł z tym programikiem jest dobry ale lepiej zrobić tak aby wykorzystać przerwanie od uart'u od danych przychodzacych. W obsłudze tego przerwania robimy taki myk że gdy przyjdzie znak "$" to niech sie zeruje licznik (wskaźnik pozycji) i każda nastepna dana z portu niech będzie zapisywana do nastepnej zmiennej. Potem można z tych zmiennych wyciągnąć...
A można zmienna i zamienić na nazwę arkusza a nie wartość liczbową to by rozwiązało problem. Po lewej stronie znaku "=" zmienna i to indeks arkusza. Wyrażenie "Sheets(i).Name" zwraca wartość tekstową (nazwę). Nie ma to znaczenia dla prawej strony. W nowym (standardowym) pliku "Arkusz1" i "Sheets(1).Name" to ten sam string. Kluczową sprawą w tym przypadku...
Zauważyłem, że jak nie łączy się z netem lub po przerwanym połączeniu w Menedżerze urządzeń nie ma już poz.1 Realtek 8822CE. Czyli karta WiFI prawdopodobnie umiera Są na Allegro: https://allegro.pl/kategoria/komputery?s...
Znaki \r, \n, \" itd. są określone w specyfikacji języka c i jeśli taki znak występuje w stringu ujęty w cudzysłów to kompilator automatycznie zamienia go na daną wartość w kodzie szesnastkowym. Pokaż funkcję usartSendString razem z przerwaniem od Tx (jeśli wysyłasz używając przerwań). Może tam masz błąd. Może nie wysyłasz ostatniego znaku ze stringu...
Między sąsiednimi złączkami panuje napięcie około 40v. Reszty nawet mi się nie chce komentować. Przeanalizuj sobie to dokładnie, bo według mnie będzie tam panowało pełne napięcie stringu w momencie przerwania połączenia. Nikt mnie nie przekona, że to połączenie jest złe i tyle. Ponadto nie ma tutaj mowy o jakimkolwiek grzaniu takiej złączki. Oryginalne...
Tak na szybko bo w tej chwili nie mam czasu, nie możesz do zmiennej wielobajtowej, modyfikowanej w przerwaniu, odwoływać się tak jak to robisz. Zastanów się, co się stanie jeśli przerwanie wystąpi w czasie wykonywania instrukcji ltoa, lub wysyłania danych? To co uzyskasz będzie mniej lub bardziej przypadkowe. Najpierw atomowo przepisz zawartość zmiennej...
I jeszcze jedno pytanko czy NodeMCU obsługije jakieś przerwania zewnętrzne Jak najbardziej. Tutaj jest to wyjaśnione: https://www.electronicwings.com/nodemcu/...
skoro chcesz jeden znak to po co takie kombinacje dim bufor as string*1 dim jest_dana as bit przerwanie: bufor=chr(udr) set jest_dana return
Weis, tak tutaj głównie błąd leżał. dzięki. _Robak_, czy tym przerwaniem odbierasz stringa: ISR(USART_RXC_vect) { UARTBuffer[UARTCount] = UDR; UARTCount++; rx_counter++; if ( UARTCount == BUFF_SIZE ) { UARTCount = 0; } }
Chciał bym, aby funkcja mogła pobierać znak po znaku i tworzyć stringa ale w przerwaniu, którego mogę później przekonwertować. Przepraszam że tego nie dopisałem. Owszem funkcja działa jeśli jest w pętli while(1).
USART_Send_String(USART3, "powrot "); ma wysłać do USART informację o przerwaniu. Narazie jest to test czy w ogole przerwania się wykonuje. W konfiguracji jest odblokowanie przerwania od Rx -> USART_ITConfig(USART3, USART_IT_RXNE, ENABLE); Czy podczas wywołania przerwania musze podawać ten argument? Co do sprawdzenia źródła przerwania. Czy w sytuacji...
Dzis spróbuje napisac sobie procedure konwertujaca liczbe na format 0,00 - mam pomysła:-). Koncepcje podsunął kolega xury i wielkie dzieki dla niego. Jaka jest najnowsza wersja Bascom, ale taka która pewnie i stabilnie działa? Czy nowsza wersja nie będzie mieć problemów z konwersjami czy lepiej zrobić sobie jednak na piechote i nie łudzić sie że "niedobre"...
Funkcja hextoul przyjmuje stringi które powinny być zakończone zerem. A u ciebie wartosc1 ma tylko dwa bajty na wartość. Anomalie też są jeśli chce przesłać czas włączenia urządzenia w formacie hh;mm;ss Może ramu za mało. Na dodatek, jeśli wysyłasz w funkcji main oraz przerwaniu, to jeśli funkcja wysyłająca nie jest atomowa, to będziesz miał sieczke...
Mógłbym jeszcze prosić o podpowiedź odnośnie wykrycia ciągu znaków, pojawiającego się na uarcie? :) Tak, zastosuj bufor cykliczny do odbioru, a później w przerwaniu badaj wystąpienie albo ilość wystąpień znaku 0x0d czyli (ENTER) .... wtedy będziesz wiedział ile przyleciało stringów do bufora i kiedy można je w całości ładnie odczytać.
Co do tych "wypisz..." ... sorki, niejasno napisałem, miałem na myśli procedurki obsługi LCD - domyślam się że korzystasz z jakichś gotowych bibliotek. Twoje "wypisz" i "wypisz2" wołają pewno wspólną proedurkę (nazwijmy ją powiedzmy "PrintScreen") ... i teraz jak ta PrintScreen będzie w trakcie wysyłania do LCD stringu, a ty ją przerwiesz przerwaniem,...
Przetestuj ten. Tak go poopisywałem, że aż mi się nie podoba :D [syntax=basic4gl]$regfile = "m8def.dat" $crystal = 8000000 $hwstack = 40 $swstack = 16 $framesize = 32 '# wyświetlacz Config Lcd = 16 * 2 Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5 Cls '# timer ' 8000000Hz(8MHz)/256(Prescaler)=...
W funkcjach pomiarowych są opóźnienia (swoją drogą można by zrobić bez nich) czyli domysł, że przerwanie wskakuje w momencie przetwarzania na string jest bardzo mało prawdopodobne... Spróbuj odbierać dane w HyperTerminal (albo innym terminalu).
Ja mam podobny problem. Mam pytanko czy jeżeli już wykorzystam procedurę przerwania od UART Receive to odczyt tablicy znaków powinienem umieścić w obsłudze przerwania czy wystawić flagę która będzie sprawdzana w programie głównym. Aktualnie odczytuje dane w przerwaniu a cały string zapisuje do tablicy. Wysyłam napis w celu kontroli (czy dobrze odebrałem)...
Przez buforowanie transmisji... Po odebraniu pierwszego znaku odpalasz timer i zaczynasz ładować kolejne znaki do tablicy... Przy każdym następnym znaku resetujesz timer... Jak string się kończy timer się przepełnia i generuje przerwanie...
Ja na starcie sprawdziłbym flagi przerwań od nadawania, zamienił w przerwaniu USART0_Transmit_Word(); na flage i wysłał stringa w odpowiednim miejscu programu. Do tego na czas nadawania wyłączałbym przerwania RX. Pozdrawiam
A czy mogę prosić o jakikolwiek przykład odbioru jednego bajtu w przerwaniu przy wysyłaniu zmiennej string?
Tak tego się napewno nie robi. Wykorzystaj event który będzie odpalany gdy dostaniesz nową ramkę, np. [syntax=csharp] mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataRecei... private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e) { //1 mySerialPort.Read(Buffer,0,Buffer.Length... //lub SerialPort...
Tak na szybko przerobiłem odbieranie stringa (na razie bez przerwań i pewnie nie do końca poprawnie ) działa to w ten sposób że w pętli while odbieram cały string a potem go wyświetlam, i jak na razie działa ok. Także pewnie tutaj leżał problem dzięki wielkie za pomoc. [syntax=c]void receive_text (void) { char ch; uint8_t i=0; while(1){ ch = USARTReadChar();...
Rozumiem że chodzi Ci o zamianę pierwszej małej litery jaka wystąpi w ciągu a nie o pierwszy element ciągu tak? Jest kilka opcji jak to zrobić... Można tak jak kolega Dawid_20, sprawdzać po kodzie ascii, wtedy jedziemy w pętli: Duże znaki to kod z przedziału: 65-90 Małe znaki mają przedział: 97-122 Czyli dla pierwszego napotkanego kodu ASCII w ciągu...
PORTB^=(0<<PB0); Powyższy kod nie robi nic. Nie wkleiłeś kodu funkcji USART_Init, a to może być znaczące - jeśli załączasz tam przerwania od usartu, to procek będzie się mógł resetować(brak funkcji obsługi przerwania) np po opróżnieniu się buforu nadawczego (przerwanie od wolnego buforu nadawczego).
tak volatile pomogło :) Dodano po 12 powiedz jeszcze dlaczego jak podaję string "test" zamiast pojedynczego znaku, to znowu w przerwaniu UDR=znak wysyła cały string, natomiast w pętli tylko jeden znak "t" ?
Nic nie dostaję. Chce tylko wiedzieć jak odbierać dane jeśli nastapi przerwanie np dane typu string . Pisze jeszcze w bascom i tam jest funkcja ISCHARWAITING umożliwiająca kontrole bufora wejściowego gdzie dalej mogę sobie obrabiać itd..Wiec tu nie musze sie martwic czy jest jakiś znak w buforze i od tej strony dla mnie jest wszystko jasne Rozumiem,...
na pierwszym poście re_de sterowane jest z pina ESP wiec schemat który wkleiłeś później nie ma sensu. Przy okazji sam z podobnego korzystam w swoich projektach. pytam o to bo w arduino czas potrzebny na sterowanie re_de nie jest taki prosty jak się wydaje. generalnie Serial.print jest wspomagany przez system przerwań i dla dłuższych stringów obsługa...
Hm, rzeczywiście obsługę "dekodowania" zawartości odebranego stringu można przenieść poza przerwanie. Choć - to akurat rzeczywiście działa :) Ale - to raczej nie zmieni problemu z "ginącą" częścią odebranego stringu, bo przecież zawartość bufora się nie zmienia od momentu "poskładania" go w serial1charmatch. Kiedy następuje wywołanie serialcharmatch...
Jak kolega wyżej słusznie zauważył, potrzebna jest funkcja operująca na RAM. Domyślam się że korzystasz z przykładowych kodów z książki "AVR. Praktyczne projekty"? Nie ma tam buforowanej funkcji UART czytającej stringa umieszczonego w RAM, a więc trzeba sobie taką funkcję dopisać (można też zmodyfikować istniejącą korzystając z tzw named address spaces)....
Jeśli dałeś jedną wkładkę do trzech połączonych równolegle paneli to jest to błędne. Bo co jeśli dojdzie do uszkodzenia jednego panela? Prad z dwóch pozostałych bedzie chciał płynąć przez ten uszkodzony. Dlatego każdy string (panel) powinien mieć własne zabezpieczenie. A tu już nie da się dobrac wkladek żeby przy 13A działały, a przy 14A przerwały obwód....
Jaki będziesz miał wyświetlacz? Alfanumeryczny że string będzie ok? Czy może LED lub LCD segmentowy? Żeby zmieniać wartość enkoderem trzeba go obsłużyć... Enkoder ma przycisk? Zatem weź zmienną Word w której będziesz zmieniał nastawy np. [syntax=vbnet]dim wartosc as word dim index_wartosc as byte if index_wartosc =1 then wartosc=wartosc + 1 end if if...
...a tak z ciekawości zapytam jak długi zadeklarowałeś ten string LINIA ??? skoro jak rozumiem obsługujesz zapewne SMSy. To chyba długość co najmniej 160 hmmm ??... U mnie , zmienna Line ma rozmiar 30B , ponieważ pobieram do niej tylko ... jakby tu powiedzieć ... mnemoniki komend AT i ich parametry , a SMS-a dekoduje "w locie" , w czasie przerwań od...
Wielkie dzięki za tak szybką odpowiedź. Czy mógł bym spytać co rozumiesz przez skopane sparsowanie? Jeśli chodzi o return 0 w funkcji uart_getc() - to w książce, z której korzystałem autor z tego skorzystał, tłumacząc, że 0 przy łańcuchach tekstowych oznacza koniec tekstu. Czy w takim razie lepiej było by zrobić np. coś takiego? [syntax=c] char uart_getc(void)...
Witam Dzieje się tak dlatego że w przerwaniu RSa kasujesz flagę TI. W pewnej sytuacji kasujesz tą flage gdy procesor czeka w pętli while(TI==0); Przyjdzie przerwanie z wysłania, ty kasujesz w przerwaniu flagę i procesor nie wyjdzie z pętli. Nie da się tak łatwo pogodzić wysyłaniu stringów przez funkcję i wysyłaniu znaków przez przerwania. Zdecyduj się...
Nie do końca wiem jakich uwagi oczekujesz, ale możesz zrobić tą funkcję typu bool. False'a niech zwróci, gdy musiała przerwać dodawanie ze względu na przekroczenie rozmiaru tablicy, a true gdy dodawanie się powiodło bezproblemowo. Jeżeli kiedyś w ogóle będziesz chciał użyć tej funkcji, to będziesz mógł sobie testować, czy wszystko się udało :P
witam chciałem troszkę odswierzyć temat, mianowicie korzystajac z częsci napisanej przez kolegę M. S. skleciłem takie coś: $regfile = "m8def.dat" $crystal = 8000000 $baud = 2400 Dim Gps As Byte Dim Gpstxt As String * 80 Dim Czastxth As String * 4, Dim Czastxtm As String * 4, Dim Szerokosctxtst As String *4 Dim Szerokosctxtmin As String * 4...
Dobra okazja by to spie.... Jeśli jest to typowa filozofia Arduino, z delayami, odpytywaniem portów w pętli (a nie przerwania), to zabija większą aktywność Jak napisałem - wykorzystuje stack TCP I proste parsowanie stringa. Nie ma w tym magii, proste C portowalne na wiele platform. przyklad kodu parsowania: void parseudp(AsyncUDPPacket packet)...
Jak zmienić tryb ADC? Tak jak pisałem wcześniej, trzeba pogmerać w rejestrach. W setupie dopisz: [syntax=c]PRR &= ~(1 << PRADC); ADMUX = (1 << REFS0) | (0 << ADLAR) | (0x00 << MUX0); ADCSRA = (1 << ADEN) | (1 << ADATE) | (1 << ADIE)| (0x04 << ADPS0); ADCSRB = (0x00 << ADTS0) | (0 << ACME);...
Zmień: dim Objetosc_lcd as string*10- a potem jakie x-sprawdź. Bascom jest wolny i gruby- jak wół. Można na nim w pewnym stopniu polegać Ale opanowanie rasowego konia jakim jest C- jest trudniejsze- ma sam na wiele spraw własne zdanie. Brakuje oscyloskopu. Chyba jest-widać sonde. P.S. W głównej pętli wywołujesz menu w którym "siedzisz" przez waitms...
Tzn, że program może działać dalej poprawnie a debuger wskazuje na to, że jesteśmy w np HardFaultHandlerze ? Mógłbyś nieco rozwinąć myśl ? Czasem może być jakiś problem sprzętowy/programowy/systemowy, który może spowodować wywalenie się debuggera, który będzie np. uparcie twierdził, że jesteśmy wciąż w jakiejś linii, choć mikrokontroler sobie wtedy...
Witam Również miałem problemy z wysyłaniem komunikatów przez RSa korzystając z funkcji stosu appWriteDataToUart(). Sądzę jednak że problem leży bardziej w restrykcjach czasowych wykonywania funkcji "callback" i czasu jednorazowego wykonywania funkcji "task". W opisie stosu pisze: All user callbacks should execute in 10 ms or less. The application task...
U mnie działa ;) inputString musisz kasować zawsze po odebraniu pełnej ramki a nie tylko wtedy gdy jest kierowana do Ciebie.
Przerwanie odbiornika USART w postaci w jakiej je masz kompletnie nie ma sensu - duplikujesz softwarowo to co robi hardware. W tym przerwaniu powinieneś zapisywać kolejne bajty do tablicy i np. ustawiać flagę po napotkaniu końca przesyłanego tekstu - np. znaku NUL lub też określonej ilości bajtów, o ile komunikaty mają stałą długość. I dopiero potem...
Jeśli chodzi o cmd_timeout to chodzi o to, że wejscie RX kiedy pin używany jest przez USART nie jest niczym podciągane. Kiedy jest podłączony do drugiego urządzenia np. procesora lub MAX485 to problemu nie ma bo pin jest podciągany wyjściem TX tego uC lub MAX485. Kiedy jednak odłączysz to na pinie stan jest nieustalony i wpadają na USART śmieci. Ten...
buffor_rx to zmienna : volatile char buffor_rx która zmienia stan w przerwaniach UART ,poniewaz tel. przy wysyłaniu sms przez port rs232 ,dzieli go na dwa stringi ,a w przerwaniach odczytuje stringi zakonczone znakiem 0x0D
Aby to zrobić zgodnie ze sztuką obsłuż LED na przerwaniach od USART. Trochę zabawy z tym jest, bo przerwania 300 tysięcy razy na sekundę dla AVR to duże obciążenie (wstawki ASM wskazane). Na 16MHz nie pójdzie, więc kwarc min 18MHz. Prosta sztuczka pozwoli zmniejszyć częstotliwość przerwań dwukrotnie. Aby uniknąć dodatkowych "efektów" wszystkie inne...
Moyshaa, dzięki za link. Ostatecznie pisze, że ten kod działa ale drażni mnie to, że nie rozumiem w jaki sposób tutaj mierzony jest okres(od rising do rising) może dlatego, że komentarzy mało :( Kod proszę umieścić w znacznikach code! Robak
Cześć wszystkim, Zwracam się do Was z prośbą o pomoc w rozwiązaniu problemu z poprawnym wysyłaniem stringa po UART za pomocą przerwania nadawczego. Męczę, się z tym już któryś dzień, czytam reference manuala, i cały czas nie udało mi się tego problemu rozwiązać. Ogólnie rzecz biorąc funkcje do buforowania zdarzeń odbiorczych/nadawczych są sprawdzone...
Jeżeli stosować się do porady kolegi wyżej można by zastosować tablice tylko dwu-wymiarową.Chcąc mieć 3 poziomy wystarczy nam 3x n gdzie n będzie ilością funkcji danego poziomu a ostatni trzeci odnosnikiem do konkretnych funkcji (za pomocą właśnie wskaźnika) Przyznam że pomysł fajny i relatywnie prosty szkoda że sam tak nie robiłem w moim systemie...
No to zaczynamy po raz kolejny. Coś takiego jak stworzyłeś to niestety za szybko nie będzie działać. Mega z kwarcem rs 14 z groszami działa naprawdę szybko i można zrobić bardzo dużo w jedna sekundę. Do odbierania i wysyłania danych można sobie napisać własną procedurę - nawet w bascomie i jest ona sporo szybsza i działa rewelacyjnie. Deklarujemy przerwania...
Chodzi o wyświetlanie Stringów przez USART? To na czas testów tylko. Jakiś pomysł?
Ta linijka jest bez sensu. Chciałem poczekać aż pierwszą wartością w stringu do wysłania będzie 0x55 ale od razu jest więc to nie opóźnia.
Cześć, (at)ElektrodaBot Chciałbym napisać makro które będzie zapisywać mi plik w określonej lokalizacji z podaną wcześniej nazwą. Nigdy wcześniej tego nie robiłem i nie wiem co powinienem przerobić w tym co wyskrobałem aby zadziałało. Okno nazwy wyskakuje jednak przy komendzie zapisuj jest błąd. Sub makro1() Dim sciezka As String Dim nazwaPliku As String...
Witam Kolegów. Natrafiłem na "ścianę" przy moim nowym projekcie. Realizuję układ który bezprzewodowo steruje steruję urządzeniem , ale też "odpytuje" to urządzenie i wysyła dane. Urządzenie "gada" w HEXACH bez znaków końca linii. Napisałem program w którym używam dwóch portów rs - softwarowego i hardwarowego - dane z urządzenia odczytuje przerwaniem...
Cze, mam makiete ZL1ARM. Problem polega na tym ze nie moge skonfigurować jednocześnie przerwania zewnetrznego (EINT1) i pracy portu szeregowego. W momencie wlaczenia funkcji konfigurujacej przerwanie zewnetrzne port szeregowy przestaje dzialac. Gdy funkcja konfiguracji przerwania jest wylaczona program wysyła stringa do komputera poprawanie. Program...
Sprawdź najpierw pochodzenie tego zera. Najlepiej w terminalu jak Ci pisałem. Moje podejrzenie jest takie, że jak wysyłałeś przez putst() było OK, bo on eliminował zero na końcu Twojego "stringa" char dataBuff wychodząc z funkcji. To zero pojawia się w tablicy niejawnie, ale tam jest. Gdy uruchamiasz DMA nie bierzesz pod uwagę, że tablica ma rozmiar...
Nie mam takiego sprzętu. Napisałem coś takiego: [syntax=c] volatile uint8_t i=0; // LICZBA PRZERWAN volatile uint8_t freq=0; // CZESTOTLIWOSC volatile uint8_t pr=0; // ZMIENNA USTAWIANA CO PODSTAWE CZASU 0,025 S int main(void) { lcd_init(); // INICJALIZACJA WYSW. sei();// GLOBALNE PRZERWANIA TCCR2=(1<<WGM21)|(1<<CS22)|(...
Zbyt ogólnie opisałeś swój problem.Co(kto) wywołuje przerwanie co 5s. Ja zrozumiałem to w następujący sposób: Procedura obsługi przerwania np.TimerX co 5s wykonuje następującą czynność: zapisuje jeden bajt do SBUF i czeka na SCON.1, potem następny bajt ... i tak 8 bajtów czyli 2xfloat(4 bajty). Czy to tak się dzieje :?: u Ciebie , a może wysyłasz te...
pomyślałem że wykorzystam 2 przerwania, złączyłęm razem int0 i int1. jedno bedzie wykrywac opadajace zbocze a drugie rosnące. efektem miał być ciąg licz np "345,12,345,32,463,12" gdzie kazda liczba oznaczałą by długość kolejnego impulsu otrzymywanego z czujnika. napisałem kod: $regfile = "m16def.dat" $crystal = 16000000 Config Lcdpin = Pin...
Domyślnie mam pętlę w której jest tylko skok do obsługi ds. Oczywiście bez zwłoki w postaci waita, tylko mniej więcej liczę ile przebiegów potrwa te 750 ms. W samej procedurze odczytu najpierw odczytuje temperaturę, następnie zlecam konwersję np.: do incr i if i=?? then 'ma być ok 750 ms call odczyt_ds i=0 end if loop I trzymam w jakimś stringu przeliczony...
Problemem przy szeregowym łączeniu ogniw wtórnych są pojemności tych ogniw. Jakakolwiek różnica będzie powodowała inne tempo zmiany napięcia ogniwa. Po rozładowaniu ogniwa dalsze rozładowanie stringa powinno być przerwane, gdyż grozi spadkiem SEM ogniwa do 0V lub nawet zmianą polaryzacji ogniwa. Akumulator samochodowy to pakiet 6 ogniw wtórnych połączonych...
Mniej więcej wiem jak działa timer0, tylko nie wiem jak go wykorzystać w programie. W prostych programach, podają jak załatwić sprawę przy 1 diodzie, a ten program z linku jeszcze jest dla mnie za trudny [syntax=basic4gl]$crystal = 8000000 Config Pinb.1 = Output Config Timer0 = Timer , Prescale = 64 On Timer0 Przerwanie Dim A As String * 5 Dim B As...
wynik końcowy faktycznie za każdym razem jest inny. (at) emarcus możesz podpowiedzieć jak powinien wyglądać serwis int1? Popatrzyłem troche bliżej na twoj kod. Z jakiego powodu potrzebujesz otrzymać wynik ("Czas_2") z dokładnocią aż do 9 miejsc decimal? Jeżeli jeden z czynników iloczynu (rozdzielczość timera) jest liczbą wymierną z dokładnościa do...
Witam. Wiem o tym co napisałeś, ale przed input jest sprawdzane czy jest co pobrać (ciąg zakończony LF) i jeśli jest co pobrać to jest pobierane w całości (jako string). A działa to tak: - zbiera się znak i jest zgłaszane przerwanie - kolejne znaki trafiają do bufora - jeśli ostatni znak jest LF (10) to jest wystawiana flaga że jest cała ramka to jest...
Dondu, mimo wszystko wolałbym zostać przy bascomie. :v Kindlar, chodziło mi bardziej o pisanie programu. Dodano po 28 $regfile = "m8def.dat" $crystal = 1000000 $baud = 9600 Config Portb.0 = Output Enable Interrupts Enable Urxc Dim zmienna As String * 20 On Urxc Odbierz 'przypisanie obsługo przerwania Podpowie ktoś co dalej?
:arrow: JRV - Ciekawe podejście Z tym że może wystąpić kłopot przy błędnych danych tzn. jak np. zabraknie jednego ";" to np. zmienna3 wędruje w miejsce zmiennej 2 Ja poszedłem trochę inną drogą (dodałem komunikaty "kierunkowe" w razie błędu) [syntax=vb]Sub podziel() Dim ostWiersz As Double Dim x As Integer, y As Integer, i As Integer, j As Integer,...
Witam, Mam potencjalnie banalny problem z odczytem stringa z przerwania UART w pętli głównej programu. Kiedy przesyłam przez UART ciąg znaków są one odbierane, jednak przy próbie wyświetlenia ich na wyświetlaczu którego obsługa znajduje się w pętli głównej programu zamiast przesłanego stringu widzę losowe śmieci z pamięci (np. fragmenty danych poprzednio...
O wreszcie znalazłem. Kiedyś próbowałem odpalić przerwanie serial od rs i wtedy zadziałało. Coś takiego: $regfile = "89c2051.dat" $crystal = 14745600 '$crystal = 11059200 $noramclear $noinit '---------------------------------------... Th1 = &HE0 '1200 dla kwarcu 14MHZ 'Th1 = &HFC '9600 dla kwarcu...
$regfile = "m8def.dat" $crystal = 1000000 Config Lcd = 16 * 2 Config Lcdpin = Pin , Db4 = Portd.6 , Db5 = Portd.5 , Db6 = Portb.7 , Db7 = Portb.6 , E = Portd.7 , Rs = Portb.0 $lib "mcsbyte.lbx" Cursor Off Config Pinb.2 = Input Portb.2 = 1 Config Rc5 = Pinb.2 Dim A As String * 2 'Deklaracja umożliwiająca działanie komendy GETRC5...
Niestety projekt mam do oddania "na wczoraj" więc nie będę się w to bawił. Ale na pewno porada przyda się na przyszłość. Mam pytanie z innej beczki: Do interakcji z urządzeniem będę wykorzystywał 5 przycisków. Czy dobrym pomysłem jest sprawdzanie ich stanu w przerwaniu generowanym np co 25ms?
(at)grala1Ten Twój kod jest trochę za prosty i z czasem zgubi synchro niemniej jak wrzucisz ten poprawiony na symulator, albo nawet uruchomisz na żywca z tym co Tobie tam nadaje to na chwile powinien podziałać ;) Lepiej byś odbierał znaki w przerwaniu do bufora. Procesor na nic by nie czekał i miał czas na inne sprawy. Do tego synchro, jakis timeout...
Obsługę USART'A realizuję na przerwaniu. Mój układ służy do sterowania wyświetlaczem LCD via RS232. Każda komenda jest ma konstrukcję "znak=string\n". Po odebraniu pełnej linii funkcja obsługi przerwania wkłada ją do bufora, z którego dane są wybierane inną funkcję programu w głównej pętli aplikacji. Przy wysłaniu kilkunastu komend jedna po drugiej...
Z tego co zrozumiałem będziesz wysyłał wyrazy przedzielone myślnikiem więc odczytujesz string, zliczasz ilość myslników (lub spacji, bo by było łatwiej) a następnie w pętli for wycinasz fragmenty pomiędzy myślnikami do tablicy i jednocześnie zwiększasz indeks tablicy. Poczytaj w helpie o poleceniach obróbki string'ów mid, instr, len, itd Aaa sorry zapomnialem...
Nie wiem czy dobrze kombinuje i trochę mi nie pasuje co zrobiłem. Do tego celu wykorzystuje polecenie Config Serialin które po konfiguracji wygląda tak: [syntax=basic4gl] Config Serialin = Buffered , Size = 20 Config Timer0 = Timer , Prescale = 256 Dim A As String * 10 Dim Odczyt As Bit Dim I As Word On Timer0 Przerwanie Enable Interrupts Enable Ovf0...
Witam Zasada jest niezmienna i polega na tym aby co 4 milisekundy odświeżać kolejny wyświetlacz. Kwestia rozbicia liczby na poszczególne znaki to temat rzeka. Każdy robi to po swojemu. Mogę jako kolejne rozwiązanie podać zamianę liczby na string 3 lub 4 znakowy w zależności od potrzeb i wyłuskiwanie z owego stringu wybranego znaku. Jednak taka operacja...
Myślę, że każdy z tych kadłubków ma przewód anteny: https://allegro.pl/kategoria/obudowy-i-k...
Działa elegancko. Żeby było wiarygodnie to nawet wygrzebałem Ardu Leonardo z m32u4 na pokładzie. Na jedną rzecz bym jeszcze uważał. Twój kod nie jest w żaden sposób synchronizowany. Może się kiedyś zdarzyć, że jedna z wiadomości nie dojdzie. Z nie będzie miało wartości 3 i przy nastepnej wiadomości procesor zacznie przypisywać wartości innych zmiennych...
A to niby dlaczego nie wolno stosować waitms ??? U mnie jakoś działa przy wielu czujnikach na jednej linii i co to ma wspólnego z wysyłaniem przez uarta ? W tym przypadku waitms nie zakłóca obsługi przerwań, wiec nie widzę problemu. Kolega namieszał trochę w procedurze "odczyt". Na początku wyszukujesz czujniki na linii 1wire, a później, w procedurze...
Enable Urxc On Urxc Odbior_rs_232 Enable Interrupts Dim Odebrane As String * 16 Dim Time_out As Integer Dim Ax As Byte Do Wait 1 Cls Lcd Odebrane Loop Odbior_rs_232: Odebrane = "" Time_out = 0 Do Ax = Inkey() Incr Time_out If Time_out >= 30000 Then Exit Do If Ax > 0 Then Odebrane = Odebrane + Chr(ax) End If Loop Until Ax = 13 Return Ja używam tego od...
A może to nie problem przerwań czy stosu a po prostu wystarczy dodać "\n" na końcu stringu podczas formatowania? I równocześnie wyczyścić bufor za pomocą memset() przed formatowaniem? Nie wiem do końca jak to jest w przypadku jednoukładowych (implementacja sprintf), ale praktyka tutaj powinna być chyba podobna do tej z PC?
Sprawdź to: W tym przypadku wpadamy w nieskończoną pętlę. Nie sposób przerwać jej w żaden sposób, cały czas woła kolejne dane
Witam, 1. Mam nie lada zagwozdkę z obsługą zegara PCF8563p przez Atmege32 + wyświetlacz LCD. Sam zegar działa dobrze. Poprawnie wpisuje datę i godzinę. Problem pojawia się z odczytem. W PCF ustawiam wyjście na 1Hz, które jest połączone z Atmegą jako przerwanie INT0. Co kilka razy, przy resecie uC, gdy program startuje od nowa, to czas zaczyna się niepoprawnie...
Poprawiony nieco kod programu. Póki co działa tylko dla liczby 7, dla wszystkich innych wyświetla, że liczba jest złożona. Zrobiłem mały postęp, ale to nadal nie rozwiązuje całego problemu. Naprawdę nie ma nikogo kto mógłby mi pomóc? :/ [syntax=asm].text main: la $a0, powitanie #laduje adres powitania do $a0 li $v0, 4 #zaladowanie 4, ktora odpowiada...
Po pierwsze - łańcuch 3 znakowy zajmuje w pamięci CZTERY znaki (bo jest jeszcze '\0' na końcu). Po drugie - przejrzyj naprawdę ten dokument który wskazałem, znajdziesz w nim np coś takiego: 8.1 asctime—format time as string 8.3 ctime—convert time to local and format as string 8.8 strftime—convert date and time to a formatted string...
Niestety nie działa pod Worksheet_Calculate, Arkusz nie odbiera nawet pojedynczego sygnału. Może to wina samego kodu. Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim Value As String Dim w As Integer If MSComm1.PortOpen = False Then MSComm1.CommPort = 3 'MSComm1.InBufferSize = 1024 MSComm1.Settings = "4800,e,7,2" MSComm1.PortOpen...
Witam postaram sie wyjasnic o co mi chodzi: po wscisnieciu klawisza program obsluguje przerwanie i ma wyswietlic znak (nazwijmy go x) ktory znajduje sie w zmiennej M1,a wiec: locate 1,6 lcd M1 i dalej wychodzi z przerwania i robi swoje, po odebraniu drugi raz przerwania ma na pozycji 1,6 wyswietlacza (gdzie do tej pory byl znak x - nic nie wyswietlic,lub...
Dziękuję za odpowiedzi. atom1477 dodałem drugi bufor, którego zawartość wyświetlam. Przepisuję do niego zawartość Rs tak: If Rs_zn = 10 Then 'znak końca lini - koniec lini do wyśw. lub koniec polecenia If Commode = 0 Then Set Przerysuj_lcd Rs_lcd = Rs End If Reset Commode End If Ale to nie działa. Co do pierwszej flagi to w sumie już była (Przerysuj_lcd)....
Dzień dobry Koledzy. Piszę kod w C#.NETMF dla STM32F429I-DISC1. Próbuję zrealizować takie działanie w którym wykorzystuję metody klasy UIElement. Jedna z metod obsługuje zdarzenie dotknięcia panelu dotykowego. Druga z metod ("Invalidate();") pozwala aktualizować treść wyświetlacza. Do tego mam timer który co sekundę generuje przerwanie inkrementujące...
...Przykro mi ale działa No faktycznie, działa. i właśnie o to chodziło by działało bez przerwania a jednocześnie w "przerwaniu" w tle No to muszę Cię zmartwić, bo buforowanie działa na przerwaniach i te masz włączone, choć sam tego na początku nie zauważyłem - SEI :D PS Część kodu, jakaś dziwnie znajoma :lol:
Wymyśliłem taki kod i właśnie testuję : unsigned long countPulses(int pin, unsigned long durationMs) { unsigned long startTime = millis(); unsigned long pulseCount = 0; while (millis() - startTime < durationMs) { if (digitalRead(pin) == HIGH) { pulseCount++; while (digitalRead(pin)...
growat string łańcuch string attiny string
civic elektryczny schemat kalibracja belki tensometrycznej openvpn porty
pralka mastercook punkt dostępu
Instrukcja serwisowa do drukarki Epson L1210 - gdzie znaleźć? Potencjometr 50KB 270° - gdzie kupić i specyfikacja