Ja bym nie ufał i dopisał przed skopiowaniem bufora [syntax=vbnet] If Flaga Then Return[/syntax] a [syntax=vbnet] In_pos = 1 'Zmniejszamy wskaźnik bufora do 0 (usuwamy ramkę)[/syntax] przeniósł przed ten warunek.
lcd_string jak widać w kodzie potrzebuje jako parametr wskaźnik na tablicę znaków. Czyli nie to co zawiera UDR - znak. Potrzebujesz użyć funkcji wyświetlającej znaki - poszukaj. Albert
Bufor cykliczny, inaczej też nazywany kołowym, to najlepsze rozwiązanie do tego co chcesz zrobić. Tym bardziej, że jak zaznaczyłeś danych będzie sporo. Każdy odebrany znak wpisujesz do bufora i przesuwasz wskaźnik zapisu o 1. Możesz to robić przez obsługę przerwania od portu szeregowego, albo możesz do tego wykorzystać DMA. Dlaczego bufor? Ponieważ...
IRQ tester https://obrazki.elektroda.pl/3243423400_... IRQ Tester to proste narzędzie, głównie do testowania czasu odpowiedzi na impulsy, lub czasów międzyzboczowych dostarczonego sygnału. Program został napsiany na ukontroler AVR Atmega168, a jego głównym zadaniem jest funkcja multiwibratora monostabilnego, którego działanie polega...
Witam wszystkich! Jak stworzyć dynamicznie obiekt reprezentowany przez wskaźnik na tenże obiekt? Sedno problemu polega na tym, że mam klasę. Zdefiniowany wskaźnik na obiekt tej klasy zainicjowany wartością NULL. W trakcie życia programu chcę w pewnym momencie powołać do życia obiekt, wykorzystać, po czym zniszczyć. Nie chcę marnować pamięci (a na razie...
Znowu się na chwilkę wepchnę w temat czy podczas inicjalizacji takie równanie da prawidłowy wynik czy mogą wyjść jakieś krzaczory. UART->BRR = (uint16_t) ((fpclk + (baud>>1))/baud); UART to wskaźnik pobierany przez funkcje inicjalizującą
Takie "zjawiska" to zazwyczaj niezainicjalizowany wskaźnik lub niewystarczająca ilość miejsca na stos. Sądząc po stylu pisania to jedna i druga opcja jest wielce prawdopodobna z przewagą na brak stosu, gdyż nie wiadomo jak bardzo operujesz na wskaźnikach. Stos najlepiej jest sprawdzić podglądając RAM za pomocą debuggera, a jeśli nie masz takowego to...
To może być właściwy trop. Jestem jeszcze w pracy, więc nie podepnę Dragona. Kiedyś wgrywałem Twój program "RS232overUSB". Zciągałem wtedy jakieś sterowniki. Jak sprawdzić faktyczną częstotliwość zegara? Oscyloskop (przykładany gdzie?), wskaźnik stanów logicznych, miernik częstotliwości?
(at)tmf zawartość wierszy nie ma być zawijana, jeśli będą dłuższe niż 14 znaków (szer LCD) to po prostu będą tracone. Całe to kombinowanie jest po to, aby w jednej zmiennej (tablica 2 wym) trzymać zawartość ekranu, przesunąć wszystko w górę (wierszami) i dodać do dolnej linii inną tablicę (1-wym) zawierającą komendy AT przychodzące z USART (będą różnej...
Mam tab Jeśli tablica mogłaby być alokowana jednowymiarowo aka `tab struct S { typ costam; typ tab[1000][16]; }; to nie wiem jak jest pod STM-owymi ARM-ami, ale na większości (jeśli nie wszystkichi) nie 8-bitowych platformach, taka struktura wyrówna swoje membersy do granicy słowa platformy/rozmiaru adresowania, więc będzie...
A co myślisz o takim rozwiązaniu? Zda egzamin takie sprawdzenie UDR: [syntax=C] #include <avr/io.h> #include <util/delay.h> #include <stdlib.h> #include <stdio.h> #include <avr/interrupt.h> #include "HD44780.h" volatile uint16_t tempw, tempx; volatile uint16_t cz_d, cz_u; char tab1[8], tab2[8], tab3[8], tab4[8]; volatile...
Nie no... nie jestem aż takim amatorem, żeby nie zdawać sobie sprawy z długości bufora. :) Używam sizeof :) W pliku ee_dbase.h mam takie definicje: #define DBREC_LEN sizeof(t_st_dbrec) // długość bajtowa rekordu danych #define DBROW_LEN 16 // długość wiersza na rekord w bazie A co do wskaźnika, to go sobie wyświetlam przez USART i stąd wiem....
http://obrazki.elektroda.pl/1852929500_1... http://obrazki.elektroda.pl/5115381900_1... Mimo upływu lat w dalszym ciągu lubię od czasu do czasu odświeżyć sobie w pamięci elektroniczne brzmienia lat 80tych, kiedy to po raz pierwszy miałem okazję usłyszeć „syntetyczną” muzykę pochodzącą z wielkich drewnianych...
Żeby się nie zamykać na 16/32 bity. Jak nie 16, to wcale nie musi być 32 :) Co powiecie na 24b ? 12b? 18b? Albo słowo 36b? C bezpośrednio nie wspiera zmiennych liczbowych, stałoprzecinowych, innych niż 8, 16, 32 i 64 bity. Czasem przydały by sie właśnie zmienne np 24 bity ale w prockach 8 czy 16-bit. W 32 bitowych nic do nie przyspieszy. Historycznie...
Witam ;) Napotkałem dzisiaj dziwny problem. Mam zdefiniowaną strukturę: typedef struct test_struct { uint16_t data; unsigned char adress; unsigned char komenda; unsigned char ilosc_danych; unsigned char dane[5]; unsigned char CRC; }ramka, *ptr_ramka; Definicja elementu oraz wskaźnika zrealizowana jest w następujący sposób ramka DoWyslania;...
Przerwania służyły i służą tylko i wyłącznie do sygnalizacji zaistniałego zdarzenia a nie obsługi zdarzenia. Panowie, jeżeli tak podchodzicie do realizacji prostego zadania, to boję się myśleć co będzie przy bardziej skomplikowanych systemach :D kornik280 Zastanów się spokojnie jakie zadania ma do wykonania Twój program. Moim zdaniem masz tutaj kilka...
Pokaż funkcję LCD_WriteText(), bo sądzić można, że jako parametr zawiera wskaźnik na tekst i nie służy do wyświetlania liczby 8-bit. Jeśli jest tak jak napisałem, to musisz najpierw przekonwertować liczbę na ciąg znaków ASCII i zapisać w buforze (tablicy) i dopiero funkcji LCD_WriteText() wskazać jej początek. Przykłady: http://mikrokontrolery.blogspot.com/2011...
Staram sie napisac program z analiza przewidzianych potwierdzen i nie przewidzanych zdarzen w module GSM(sms, ring itd.). W jaki sposob skonstrulowac bufor cykliczny i parsowanie odpowiedzi ? Moze zastosowac nieskonczony bufor, a odczytane i przeanalizowane dane kasowac i przesuwac wszystko w lewo ? Jak sie za to zabrac ? W przerwaniu zawartość rejestru...
Absolutnie nie mam pojęcia co chcesz zrobić. Program który wstawiłeś jest kiepski: 1) Nie baw się w takie skomplikowane ładowanie danych ldi r17, 1<<CS02 out TCCR0, r17 in r16, TIMSK //tryb normalny sbr r16, 1<<TOIE0 out TIMSK, r16 //przerwanie od przepełnienia Tylko zrób to na brutala, bo tutaj niczym to nie grozi: ldi r16, (1<<TOIE0)...
Witam wszystkich, Próbuję uruchomić kartę mikro SD na płytce extrino od Leona, Mam książki Pana Tomasza Francuza i przerabiam przykład "Inicjalizacja" z katalogu KartySD. Książka "AVR Układy peryferyjne". Używam Atmel Studio 7. Uruchomiłem przykład na płytce DIL64 (także od Leona). Działa w trybie SPI. Ponieważ docelowo będę potrzebował SPI_USART sięgnąłem...
czyli twierdzisz że to powinno pomóc? zaraz sprawdzę :P hmmm, no i dalej się nie komunikuje z tym programem, ma być komunikacja synchroniczna? Na synchronicznej nic nie śle do terminala nawet aktualny kod .INCLUDE "m128def.inc" ; SEGMENT DEKLARACJI .EQU OSC_FREQ= 11059200; częstotliwość pracy w Hz .EQU RS_BAUD= 57600 ; prędkość transmisji...
jeeeez!!... "czegoś mi tu brakuje" jest chyba zbyt ogolnym stwierdzeniem aby cokolwiek pomóc... Zrobilem sam na dokladnie tych samych STMach conajmniej 5 roznych interfejsów CAN<->UART i za tydzien bede robic kolejny... Więc mogę podpowiedzieć: 1) TXuj UARTa przez DMA. Tylko. Zawsze. Najzawszej... 2) Tego UARTa TXuj przez DMA z bufora kołowego....
W porównaniu z Raspberry Pi ilość chociażby RAM-u nie robi jednak sporego wrażenia. Poza tym ja chętne widziałbym jakieś urządzenie, które fabrycznie miałoby wyprowadzone złącza GPIO, USART oraz SPI, w postaci złącz na płycie głównej. Tak, aby nie trzeba było się podlutowywać cienkimi kabelkami pod diody albo piny procesora. BTW czy moc obliczeniowa...
Po pierwsze proponowalbym zmienic troche ta funkcje: void wyslij_znak(unsigned char znak) // bylo: unsigned int { if (znak == '\n') znak = '\r'; // bylo: wyslij_znak('\r'); while (!(UCSRA & (1<<UDRE))); UDR = znak; } A tak w ogole to masz moj fragment kodu: :D typedef unsigned...
zumek coś namieszał, funkcja atoi zamienia łańcuch na integer czyli zmienna zn powinna być pointerem do stringu, czyli ciągu znaków (zwykle cyfr) zakończonych znakiem o wartości zero. UDR to, o ile się nie mylę USART Data Register, czyli rejestr w którym jest jeden odebrany znak. Nie ma szans, żeby funkcja atoi coś z niego odczytała. musisz czytać kolejne...
He, he, he... Patrz na to: while (1); Nic, co jest dalej, nie ma szans się wykonać, więc kompilator eliminuje zbędny kod. ...A ponadto masz błąd w inkrementacji wskaźnika. idx = (idx + 1) % BUFSIZE; - to najprostszy poprawny zapis tego, co masz zrobić, chociaż nie zawsze daje optymalny kod.
[syntax=c]unsigned char buffer[3] = {}; // zmienna globalna[/syntax] Za mały bufor na 3 znaki - gdzieś trzeba zmieścić NULL. [syntax=c]buffer=="abc"[/syntax] warunek nigdy nie zostanie spełniony - porównujesz wskaźniki na tablice. Powinieneś użyć coś w rodzaju strcmp().
Na 99% nie. Można kombinować z auto-reload i transmisją jednego bajtu, o ile uda się przekonać DMA, że docelowy UART jest pamięcią, a nie peryferialem i o ile będziesz miał pewność, że nigdy dane nie będą równocześnie nadchodziły w takim tempie, żeby zapchać nadajnik. Czyli: nawet gdyby się udało, to jest to rozwiązanie wysoce niepewne i zawodne. Co...
To co wpisujesz do rejestru MOAR to jest "adres adresu" (wskaźnik na wskaźnik) a raczej nie o to Ci chodzi... Tym bardziej że w tym kontekście tab to zmienna lokalna, więc i tak nie zadziała jak trzeba. DMA1_Stream6->M0AR = (uint32_t)&tab; 4\/3!!
Super skompilowało się działa. Ale Build Output Parser nie przechwytuje ścieżek includes i symboli. Jego ustawień nie zmieniałam, Freddie w temacie Link podał link gdzie zalecane są te same ustawienia. I nic. W ramach poszukiwań problemu usunąłem z ustawień "(gcc)". Zaskoczyło, ale to nie powinno tak być. Zmieniłem | na ||. i działa. Jestem z goła...
Po co ten wskaźnik na dane? Zrób: volatile unsigned char znak; ISR(USART_Rx_vect) { znak = UDR; } Po co czekanie na RXC == 1 w przerwaniu uarta? Przecież jest to warunek wygenerowania przerwania.... Zapis: UCSRC = ~_BV(UMSEL) oznacza, że przypisujesz do UCSRC wartość 10111111. Chyba nie o to Ci chodziło. Pozdrawiam, Dr.Vee
Włączyłeś przerwania, jednak nigdzie nie masz procedury obsługi dla RXCIE i TXCIE. Wywołanie przerwania powoduje skok programu pod adres zdefiniowany w tablicy wektorów przerwań, czyli w Twoim przypadku reset procka. Druga sprawa to błąd w tej funkcji. Ona nigdy się nie zakończy, gdyż brakuje inkrementacji wskaźnika s w pętli. Ale zakładam, że to błąd...
Jest tu co najmniej kilka błędów. Pierwszy to taki, że funkcja uart_getc nie jest atomowa. W ogóle kolejka jest zrealizowana źle - nie uwzględnia, że odczyty/zapisy następują asynchronicznie, w związku z tym pewne operacje (np. uaktualnienie wskaźników początku i końca) muszą być robione atomowo. Przypadkowo to działa przy zapisie, bo ISR jest wykonywane...
Z ciekawości sprawdziłem, która się szybciej wykonuje: void Tekst_USART(char *wskaznik) { char znak; while((znak = *(wskaznik++)) != 0) 2f0:fc 01 movwr30, r24 2f2:21 91 ldr18, Z+ 2f4:80 e6 ldir24, 0x60; 96 2f6:90 e0 ldir25, 0x00; 0 2f8:22 23 andr18, r18 2fa:d1 f3 breq.-12 ; 0x2f0 <main+0xe>...
Próbuje napisać coś w stylu klasy ale stanąłem w miejscu. Klasa ma obsługiwać usart. W pliku H zadeklarowałem strukturę która przechowuje m.in. wskaźniki na funkcje, a w konstruktorze do tych wskaźników przypisuje funkcje. Plik h // usart type powinien być różny w zależności od obiektu który wywołał funkcję! //while (!(module->usart_type->SR & USART_SR_TXE));...
Sprzętu się nie czepiaj. HardFault może być powodowany przez różne rzeczy, z popularniejszych to za mały stos lub popsute operacje na wskaźnikach. Zamieść cały kod jaki masz. I po co ten FlashUnlock na początku?
No dokładnie, o poolingu zapomnij. Najprościej zrobić tak jak pisze Mirek, bufor (niekoniecznie cykliczny), ale po prostu tablicę zawierającą wskaźniki do kolejnych komunikatów. W procedurze obsługi przerwania TX, wysyłasz bieżący komunikat, jeśli wysyłka jest zakończona to sprawdzasz czy w tablicy jest jakiś oczekujący i rozpoczynasz jego wysyłkę....
Dynamic Battery Simulator 2281S-20-6 Keysight N6705B DC Keithley Series 2300 Battery Simulating DC - model2306,2308 Keithley 6060B-J08 Special Order Electronic Load Cadex C8000 ale i Cadex serii C7000 Rigol DL3000 Series DC Electronic Load ewentualnie ACCUMASTER C5 (• Zintegrowany Datenlagger do zapisu przebiegu krzywych ładowania/ rozładowania...
Masz racje, wystarczy tak: [syntax=c] string ComOperator::readFromCom() { string message; getFromSerial(); if (messageLength>0){ for (int i = 0; i<this->messageLength;i++){ message.push_back(data[i]); } } return message; }[/syntax] A co do wartości zwracanej, to próbuję wymyślić jakiś powód dla którego nie chcę zwracać wskaźnika :) Ale wygląda...
Charakterystyczną właściwością bufora cyklicznego (kolejki FIFO) jest to, że wskaźniki początku i końca (odczytu i zapełniania) przemieszczają się niezależnie - każdy w swoim tempie. Stąd w Twoim programie indeksy powinny być niezależnymi zmiennymi globalnymi/statycznymi. Przypisanie liczniku=usartbufferlicznik zakłóciłoby normalny tryb pracy bufora...
Schematu nie widzę. Napisałem Ci już jakie tranzystory możesz tam zapakować. Kosztują <0,50PLN/sztukę w TME, więc tanio. W dokumentacji do wyświetlaczy sprawdź maksymalny prąd i na początek ogranicz prąd maksymalny do tej wartości (prawdopodobnie 20-60mA). Program do napisania od nowa. 1. Po co zewnętrzny prescaler, jeżeli licznik TIM0 ma wbudowany...
Argumentem funkcji USART_Transmit_Word() powinien być wskaźnik na tekst, a ty przekazujesz też jakieś stałe w postaci liczb (np. TOSCA). Transmitowana będzie kaszana. Wrzuć konstrukcję pętli głównej, bo ten błąd wygląda na problem ze stosem.
Czy aby przypadkiem sizeof(dane) nie zwróci 4 (rozmiar wskaźnika) i nie powinno dać się czegoś w stylu strlen(dane)? Pozdrowienia, m.ki
To dotyczy raczej bibliotek C18 niż samych mikrokontrolerów. putsUSART: Write a string from data memory to the USART. putrsUSART Write a string from program memory to the USART. Jeżeli funkcja której parametrem jest wskaźnik do pamięci RAM otrzyma wskaźnik odwołujący się do pamięci programu lub odwrotnie, to odczyta "śmieci". Przy wielu innych funkcjach...
strasznie żeś nakombinował ja wysyłam tak stringi void USART_Transmit_string( char *text ) { while(*text) USART_Transmit(*text++); } void USART_Transmit( unsigned char data ) { /* Wait for empty transmit buffer */ while ( !( UCSRA & (1<<UDRE)) ); /* Put data into buffer,...
No rozważyłem problem w kodzie i doszedłem do tego ze problem jest spowodowany w jakiś sposób działaniem funkcji USART_Init. Generalnie konfiguruje w ramach jakiś tam inicjalizacji systemu konfiguruje sobie port http://obrazki.elektroda.pl/6543406500_1... Zupełnie nie znam się na asmblerze ARMA (znam jedynie z zamierzchłych czasów asemblera...
Jaką masz szybkość transmisji przez UART? Na moje oko to jesz źle: USART_Transmit_String_P(dni[d.WeekDay]); - poneważ wektor dni[] jest w PROGMEM, wskaźnik musisz czytać przez pgm_read_word()
A kompilator nie krzyczy ostrzeżeniami? Twoja funkcja Usart_wysylanie() przyjmuje na wejściu unsigned char, a w wywołaniu przekazujesz wskaźnik na char. Normalnie kompilator rzuca ostrzeżeniem. Teraz tak - Usart_wysylanie() przyjmuje na wejściu bajt danych binarnie i wysyła jego wartość tekstowo - nic dziwnego, że nie da się wysłać liczby wiekszej,...
Wyciągam z niebytu ale akurat grzebię w Poly-800 z podobnymi objawami. (są napięcia a nawet trochę sygnałów ale układ niezyje). Co do kwarcu w Poly-800 to jest to 6MHz Jak komu to pomoże to tu trochę moich "odkryć" (jedyny krążący po sieci schemat jest faktycznie makabrycznym skanem chyba równie nieczytelnego oryginału drukowanego): Procesor główny...
Ta pętla [syntax=c] while(1) { ... wsk_do_wyslania=0; USART_Tx(buff[0]); wsk_do_wyslania++; } [/syntax] wykonuje się cały czas, więc naokrągło zerujesz ten indeks tablicy, który nazwałeś wskaźnikiem. Tzn z tego urywka kodu tak wynika, nie wiem czemu nie pokażesz więcej.
esp8266 usart przerwa usart usart printf
bezpieczniki volvo lusterka samorozładowanie akumulator brotje energy błędy
IRsend with PulseDistance Protocol: MQTT, Tasmota, IRremoteESP8266, 9-bit LSB, 0x721/0x622 Volvo L30Z 2000 – demontaż bębna hamulca postojowego, budowa hamulca nożnego