Może coś w stylu Dodano po 1 XC8 jest opracowaniem Microchipa pierwotnie dla architektury PIC a ostatnio rozszerzonym o AVR. Dokumentacja XC8 pod AVR do złudzenia przypomina tę na AVR-GCC więc hmmm....
robisz to za każdym razem tak : 1. Zerujesz rejestr/zmienna w której chcesz miec wynik. 2. Przesuwasz rejestr/zmienna o 1 bit w lewo bez rotacji. 3. Jeśli P1.1 = 1 to ustawiasz najmłodszy bit w rejestrze/zmiennej, jeśli nie to zerujesz (poprostu dodajesz zawartość pinu do rejestru/zmiennej) 4. Jesli ni eodebrałes jeszcze 8 bitow to skocz do 2. Pozdrawiam...
Jeśli zmienna / rejestr jest volatile to działa, używam takich zapisów już od dawna i nie ma z tym problemów.
ecx jest rejestrem, nie zmienna lokalna. Jesli wolana funkcja korzysta z tego rejestru (a moge sie zalozyc, ze tak jest), to Twoja petla sie rozsypie.
Zatem jeśli zmienna lokalna (ulotna) jest pamiętana w rejestrze procesora, po odłożeniu na Stos jej początkowej wartości, to będzie ona dostępna szybciej niż zmienna globalna. Czyli, generalnie zmienna lokalna zadeklarowana w przerwaniu , też będzie odłożona przez kompilator do rejestru i potem wszystkie operacje będą wykonywane na tym rejestrze? A...
W bascomie rzeczywiście prosto gdyż mozna dać cos takiego: zmienna.zmienna_pomoc=p3.2, a w asm gorzej bo taki zapis nie przejdzie. Mało tego polecenie setb tez nie akceptuje adresu jako zmienna (rejestr czy cokolwiek) tylko wartość stała. Myślałem nad tym i chyba tylko rrc lub rlc i "wsówanie" bitów poprzez flagę C. Innego sposobu narazie nie widze.
po dodaniu volatile jakos lepiej poszlo ale widze ze wczesniej zmienna w rejestrach siedziala a teraz gdzies w ramie ja umiescil. To jest dość oczywista konsekwencja użycia tego kwalifikatora - efektywnie zabrania on jakichkolwiek optymalizacji zmiennej i pozostaje ona na stosie. Wydaje mi się, że walczysz z niewłaściwym problemem - szukasz dziury...
Ale jeśli mniejsze, to już po 1 takcie zliczania powinno wyskoczyć z przerwania a tak nie jest. Taktowanie timera to 16MHz/1024 = 15625Hz. Pojemność timera to 256, więc przerwanie pojawia się z częstotliwością 15625/256 = ~61Hz. Aby uzyskać opóźnienie ok. 1 sekundy przerwanie musi pojawić się 61 razy i dopiero za 62 zapalić lub zgasić diodę. I tak...
Nie można. Pole unii rejestr zawiera wszystkie 16 bitów widziane jako jedna zmienna 16-bitowa. Pole bit udostępnia je jako 16 indywidualnych zmiennych 1-bitowych b0, b1 itd.
Kiedyś widziałem jak ktoś programowo niwelował drgania poprzez "puszczenie sygnału przez rejestr". Nawet to dosyć dobrze działało. Działało to w taki sposób że przy każdym kolejnym wywołaniu pętli programu, na początku rejestr (np. 8 lub 16 bitowy), przesuwany jest o jeden w prawo, a na najmłodszą pozycję wpisywany jest stan z wejścia (przycisku). Dalej...
czy tak trudno zerknąć do helpa PWM1A = wartość zmienna = PWM1Aalias rejestru Compare 1A licznika TIMER1 (Word) używany gdy licznik pracuje w trybie PWM PWM1B = wartość zmienna = PWM1Balias rejestru Compare 1B licznika TIMER1 (Word) używany gdy licznik pracuje w trybie PWM PWM2 = wartość zmienna = PWM2rejestr Compare 2 licznika TIMER2...
Plik bat [syntax=dos](at)echo off for /f "tokens=3" %%a in ('reg query "HKEY_CURRENT_USER\Software\Microsoft\Wi... Shell Folders" /v "Personal"') do set zmienna=%%a echo %zmienna% pause[/syntax]
czy dzobrze zrozumialem o co Ci chodzilo ? jesli tak to moje rozwiaznie : ;zmienna zm_x (rejestr r0) osiaga wartosci 0-50 ;zmienna wyjsciowa (rejestr r1) min=1 max=100 mova,r0 jnzdalej movr1,#1 ret dalej:rla movr1,a ret
Juz tlumacze :-) Zmienne volatile to takie, ktorych uzycia nie chcemy by kompilator optymalizowal. Zalozmy, ze uzywasz jakiejs zmiennej. Za chwilke chcesz cos na niej wykonac. Kompilator wyprodukowal kod, w ktorym ta zmienna jest w jakims rejestrze. Wiec stwierdzi, ze odwoalnie do pamieci jest niepotrzebne i je usunie, zakladajac, ze rejestr posiada...
Czyli ma to wyglądać mniej więcej tak Wygląda ok. Podłącz tylko któryś z najstarszych bitów do portu LED. mam jeszcze jedno pytanie, czym są zmienne w takim scalaku? To zależy od tego, jaką funkcjonalność ma dana zmienna. Trzeba pamiętać, że to tylko twór w języku VHDL. Dopiero w procesie syntezy tłumaczone jest to na syntezowalny element logiczny....
Nie, jeśli przenosisz zmienną do segmentu data, to rejestr DataSegment musi wskazywać właśnie na niego. Najbezpieczniej jest użyć SEG [zmienna]
(at)ElektrodaBot Czy istnieje metoda, aby wyświetlić model mikroprocesora, na którym skompilowany jest program w AVR GCC? Może istnieć zmienna globalna lub możliwość odczytu rejestrów.
Witam... Tak można... Ale pamiętaj o sumie przy ustawianiu inaczej wyzerujesz sobie cały rejestr... Tak w tym przypadku nie musisz (ale możesz) się martwić odczytem osobnych rejestrów (H i L) i ich kolejnością... Oczywiście zmienna do której wczytujesz musi mieścić 10-bitów... Zabawa w czytanie rejestrów ADCH lub ADCL ma sens jeżeli przesówasz wynik...
BoskiDialer -> nie masz racji. Instrukcje arytmetyczne ZAWSZE muszą zostać wykonane. Przypadek, o którym piszesz dotyczy porównania. Co jest niebezpieczne, jeśli zmienna jest rejestrem jakiegoś urządzenia, i odwołanie do niego w przypadku porównania może nie mieć skutku.
Jeżeli masz na myśli platformę x86 gdzie DL to część rejestru EDX, to piszesz: int zmienna; __asm { ; mov dl, cośtam movsx edx,dl ; int jest ze znakiem więc movSx mov zmienna,edx } Jeżeli zmienna ma przyjmować wartości bez znaku (0-255), to zmień movsx na movzx.
Witam, Mam prosty problem: Jak inkrementować zmienną za każdym załączeniem ? Chodzi o to żeby był jeden marker pomocniczy (%M) który na starcie będzie przesyłał wartość zero do rejestru (%R) kiedy zmienna %M przejdzie w stan wysoki do rejestru powinna zostać wysłana jedynka kiedy zmienna ta przejdzie w stan niski w rejestrze powinna widnieć nadal wartość...
Inkrementacja zmiennej 8-bitowej to też operacja atomowa. No nie za bardzo. Może być atomowa o ile jest to zmienna przechowywana w rejestrze procesora. Normalnie masz 3 operacje: 1. R=zmienna 2. INC(R) 3. zmienna=R Jeśli w przerwaniu jest tylko odczyt, to nie ma większego problemu zazwyczaj - możesz widzieć poprzednią wartość zmiennej. Jeśli jednak...
Jeśli zmienna "globalna" w danym pliku jest statyczna, to nie jest ona "exportowana" poza moduł (czyli plik) - żadne extern w tym momencie nie pomoże i będzie skwitowane błędem kompilacji. Dzięki takim niby nic nie znaczącym zabiegom można pokazać komuś (np sobie w przyszłości), że taka zmienna nie jest przeznaczona do użytku na zewnątrz modułu (odpowiednik...
(at)BlueDraco A jak byś chciał to fizycznie zaimplementować w kompilatorze / linkerze Przykład jak zewnętrzna funkcja miałaby operować na takiej zmiennej w rejestrze? Rozumiem że trzeba byłoby przerabiać kod bibliotek np. Tak jak pisałem w poście 7 można sobie taką protezę wyobrazić. problemem jest C/C++ - zmienna typu rejestr nie ma adresu. To jak...
Co do taktów i cykli - Takt to czas w którym procesor wykonuje pojedynczą czynność. Nie zawsze jest to pojedynczy rozkaz, chociaż bywają procesory z rozkazami nie za bardzo rozumiem pojęcie "czynność" Ta pojedyńcza czynność to linijka kodu w programie np inkrementacja? (zmienna= zmienna +1) Nie. Pojedyncza instrukcja w kodzie maszynowym często dzieli...
Rozwiązanie kiepskie: Zadeklaruj zmienną statyczną przed stworzeniem pozostałych klas (formatek itd). Zmienna statyczna w tym zakresie będzie widoczna wszędzie, ale musisz przekazać do niej wskaźnik (przy tworzeniu innych klas/formatek) - bo jakże inaczej byś się do niej "dobrał". Rozwiązanie lepsze: Jeśli to ma być zmienna do ustawień programu - lepiej...
To rozumiem to tak że zmienna "i" jest już na stałe w pamięci i zadanie tej funkcji jest wykonywane najszybciej jak to możliwe Tak zmienna ma swoje stale miejsce w pamięci. Nie koniecznie wykonanie jest najszybsze bo najszybciej to działa jak zmienna jest w rejestrze procesora a globalną trzeba zapisać do pamięci przynajmniej przed wyjściem z funkcji...
wszystkie AVR'y mają wewnętrzne pullupy. załącza sie je programowo poprzaez ustawieniu pinu jako wejście i wpisanie 1 do rejestru wyjściowego czyli ddrx=0 portx=&hFF zmienna=pinx 'czytamy cały port pozdrawiam
"Wtedy program zacina się w momencie kiedy wpisuje do rejestru gotową zmienna konfigurującą pętle PLL (RCC->CFGR = tmpreg;):" Sprawdź i wrzuć tu może wartość tego rejestru w tym momencie.
Czy działa Systick to łatwo sprawdzić w debuggerze. Zresztą wiele spraw można sprawdzić. Ja bym zaczął od tego czy właściwe rejestry podlegają zmianom. To nie jest nic trudnego, w krokowym trybie Też jaka wartość jest SystemCoreClock, to zmienna globalna. Może ląduje gdzieś w HardFault, zaraz po uruchomieniu. EDIT. Często problemem przy kopiowaniu plików,...
Zamiast pytać o to jak odwołać się do tego rejestru (co prawda można tworząc zmienną przez jakas_zmienna >>= 1; if(PS_WEJ&0x01) jakas_zmienna |= 0x80; nie tracąc na szybkości (3 cykle przy rejestrze IO dostępnym przez sbic/sbis, 3 przy innym rejestrze [sbrc/sbrs], 5 przy komórce pamięci). Ze względu na skrajny bit można to zoptymalizować,...
tego typu instrukcje sa niewskazane we wstawkach, bo nie pozwalaja kompilatorowi dokonac dobrej optymalizacji. niemniej jednak akurat ta instrukcje powrotu mozna wykorzystac i nie powinno z tym byc problemow. pytanie pierwsze: mozna uzyc lekkiego helpa ze strony tworcow assemblera. nalezy najpierw zaladowac wartosc zmiennej do jakiegos tam rejestru:...
Tylko co niby wydłużeniu bufora cin (w przypadku wejścia z klawiatury) miałoby dać? Odczyt do tego bufora nie jest asynchroniczny, tylko synchroniczny z wywołaniem funkcji wejściowej w programie. Zatem jaki długi ten bufor by nie był, jeżeli program nie czyta danych na bieżąco, to i tak maksymalna ilość zbuforowanych znaków jest ograniczona długością...
To ty się mylisz. rejestr to nie zmienna.
Możesz przetestować Funkcję BIN() A = 25 C = 14 D = 14 B1 = switch functions Sub Write I2cstart I2cwbyte 130 I2cwbyte 0 I2cwbyte A ; Głośność kanał L ; zakres 0 - 63 I2cwbyte A ; Głośność kanał R ; zakres 0 - 63 I2cwbyte C ; Bass ; zakres 0 - 15 I2cwbyte D ; Treble ; zakres 0 - 15 I2cstop Waitms 10 I2cstart I2cwbyte 130 I2cwbyte 8 I2cwbyte B1 ; switch...
Nie podałeś ja są przechowywane te dowolne liczby (chyba myślałeś o zmiennych). Dla jednobajtowych (8-bit) użyteczny jest skutek uboczny rozkazu "movf x,x" w postaci ustawienia bitu Z w rejestrze stausowym jezeli ruszony rejestr ma wszystkie bity równe 0. Jeżeli zmienna jest wielobajtowa to wystarczy wykonać "or" na wszystkich jej bajtach i jeżeli w...
A jak kopiujecie bloki programowe które są bardzo podobne funkcjonalnie ? Jest mechanizm który zmieni adres i nazwę zmiennej ? Bo ten co znam to dobrze zmienia tylko nazwe przez dopisanie prefixa , ale problem pojawia sięz adresami. Jeśli natrafi na np: %R20 którego długość to 10 słów to pozwala utworzyć zmienna w rejestrze %R21 ... a powinien w %R31,...
Niestety musze cie zmartwić , ale jest to kod bezpośrednio przekopiowany z kompilacji. Kod if jest tutaj 268: 81 fd sbrc r24, 1 , a ten out, to inicjacja stosu jaka nastepuje w procach avr. OKi, nie można uzywać zmiennych rejestrowych, i to będzie ta odpowiedź, nie doczytałem sie tego niestety, musze poprzewertować jeszcze mana. Ten kod jest poprawny...
Witam. Rn oznacza nazwę rejestru np. R1, R2, R3. Rejestr znajduje się pod jakimś adresem w pamięci uC. MOV Rn, #dana powoduje wpisanie do rejestru o nazwie Rn danej o nazwie dana np. Mov R5, #22h. A to akumulator, symboliczna nazwa rejestru tak samo jak R1. Nie jest to zmienna Mov A, Rn oznacza wpisanie do rejestru A (akumulatora) zawartości rejestru...
Witam, chciałbym się Was zapytać jaką wartość osiąga zmienna ADCW (rejestry ADCH + ADCL), przy podczas pomiaru przetwornikiem ADC w mikrokontrolerze przekroczymy wartość napięcia odniesienia (w moim przypadku 2,56V). Chciałbym przekroczenie wartości napięcia na pinie pomiarowym ująć konkretnie w programie, ale nie wiem nawet jaką wartość wtedy osiąga...
Uruchomiłeś: TIMSK0 |= (1<<OCIE0A); przerwanie od porównania a obsługujesz: ISR(TIM0_OVF_vect) przerwanie od przepełnienia. A tak przy okazji: - zmienne zsyp1 i 2 to gdzieś zerujesz? Czy tylko je inkrementujesz aż się przekręcą? - zmienna "CZAS_NA_test" jest niepotrzebna. Równie dobrze mógłbyś w main sprawdzać czy zmienna i>=75 a w przerwaniu...
Ok, zastosuję się do wskazówek. Ale dlaczego właściwie zrobienie zmiennej tymczasowej i późniejsze jej używanie zamiast volatile jest szybsze? Chodzi o to, że zmienna volatile cały czas odczytywana jest z pamięci i ładowana do rejestru a zmienna bez volatile, ładowana jest tylko raz? Czy dobrze myślę?
Czyli mam rozumieć że jak wyślę cos na port RS to te dane pojawią się w rejestrze UDR. I teraz if zmienna=0 then <nic> else <zapisz te dane do rejestru np. I i potem wyświetl> I jak wyświetlę na LCD tą zmienna to powinien wyświetlić te dane?
A na co Ci zewnętrzne liczniki , jeśli sprawę załatwi licznik 16-bitowy + rejestr/zmienna 8-bitowa. Poza tym , ja mówię o bramkowaniu licznika/timera w mikrokontrolerze , przez impuls/sygnał , którego "długość" chcesz zmierzyć :D Piotrek
Na pewno na pierwszym miejscu jest zestaw instrukcji. Na przykład możliwość łatwego adresowania tablic obiektów o rozmiarze większym niż 1 bajt powiedzmy w ARM, czy w MC68020 i wyższych, lub na przykład wykonywanie operacji na 16 i więcej bitach za pomocą instrukcji operujących na danych ośmiobitowych (dodawanie, odejmowanie, porównanie itd. z propagacją...
szelus : nie w tym problem - zmienne w pamięci i tak muszą zostać zaktualizowane, chciaż dodanie volatile powinno zapewnić kolejność aktualizowania zmiennych. Bardziej obstawiał bym na błąd z czasem istnienia zmiennych - zmienna checksum jest tworzona na stosie (zmienne lokalne, których adres jest potrzebny nie są umieszczane w rejestrach), więc jej...
Czy pamiętałeś o włączeniu portów w ODPOWIEDNIM rejestrze APBENR? volatile nie ma nic wspólnego z AVR. Tego atrybutu używa się np. wtedy, kiedy zmienna modyfikowana przez obsługę przerwania jest testowana przez inny fragment kodu. Pokaż kod procedury przerwania, bo coś tam narozrabiałeś.
Problem leży w sposobie działania biblioteki TWI_Master i miejsca, skąd jej pośrednio używasz. TIMER0_OVF_vect, jak i każde inne przerwanie, uruchamia się z czasowo wyłączonymi przerwaniami, dlatego ani sonar_request, ani sonar_gets_distance nie zadziała z tego miejsca. Polecenia zostają zakolejkowane, i może tylko TWI::START zostaje wykonany. Możesz:...
IMHO przyczyna leży całkiem gdzie indziej. Może procek się nie wyrabia. W przypadku zmiennej globalnej, na etapie konsolidacji jej adres jest znany, a więc dostęp może być przez adresowanie bezpośrednie. W przypadku zmiennej na stosie prawdopodobnie (nie wiem, domyślam się, nie chce mi się sprawdzać) zachodzi adresowanie pośrednie. Być może z dodatkowym...
Przesuń wynik z rejestru o 4 bity w prawo i będziesz miał wartość okej. Po prostu masz wyrównywanie tych 12 bitów do lewej w 16 bitowym rejestrze. czyli zmienna = zmienna >> 4;
Każda zmienna wykorzystywana w przerwaniu i pętli głównej lub w 2 przerwaniach musi być typu volatile. Normalnie zmienna jest kopiowana do rejestru i program operuje już na ty rejestrze. Przerwanie może zostać wywołane w każdej chwili wobec czego program nadal wykorzystuje ten rejestr mimo zmiany wartości zmiennej w przerwaniu. Jeśli zmienna jest typu...
Masz funkcje RTC_GetTimer i RTC_SetTimer które odczytują i zapisują ten licznik oczywiście można to zrobić też bez tej biblioteki. A jesli jednak 32 bity to za mało to zawsze można dodać dodatkową zmienna przechowywaną w rejestrach podtrzymywanych bateryjnie i zwiększać ją gdy licznik przepełni się ;) Jak już bedę w domu to coś dokładniej Ci napiszę...
Po drobnych modyfikacjach w/w programu udało! mi się jednak zestawić tą transmisję :D Zastanawiam się jednak po co robię takie kombinacje alpejskie skoro transmisja z lpt do uP może działać na dwóch liniach na zasadzie podobnej do spi - na jednym int (clk) i dowolnym porcie (miso). Wystarczy przerwanie i badanie stanu drugiego pinu. Jedna zmienna robiąca...
witam, potrzebuję zrobić kilka wstawek asmemblerowych do programu napisanego w C. Kompilator to CodeWarrior oparty o eclipse. Mam problem z przeniesieniem zmiennej z języka C do asm i odwrotnie. Od dłuższego czasu szukam rozwiązania w sieci, ale nic sie nie kompiluje... mam takie coś: i = 67; __asm(" mov r0, i "); Co robię źle, co...
.Czy ktoś może wie w czym tkwi problem/spotkał się z taką sytuacją? A zmienna, której wartość kopiujesz do OCR3A/PWM3A nie jest przypadkiem zadeklarowana jako BYTE ? Jeżeli to nie to, to spróbuj zapisywać rejestry OCR3 osobno - OCR3AH, OCR3AL.
daną ładujesz do rejestru w ten sposób, że po prostu tworzysz zmienną na stałe przypisaną do rejestru: register char zmienna asm("r5");
PTR to nie jest rzutowanie, jakie występuje w językach wysokiego poziomu, tylko traktowanie. Po prostu jest spod adresu wskazanego zmienną pobierane WORD danych. Jako, że sama zmienna jest tylko typu bajt, to w rzeczywistości zostaną pobrane wartości ze zmiennej Byte1 i Byte2 w kolejności.
Czy ten zapis jednoznacznie świadczy o fakcie pisania w ASM ? Usartc0_data = zmienna Gdyby to było w asemblerze, to zapisałbyś to jakoś tak: [syntax=asm] LDS R24,ZMIENNA STS USARTC0_DATA,R24 lub z użyciem rejstrów indeksujących: LDIZL,LOW(USARTC0_base) LDI ZH,HIGH(USARTC0_base) LDI XL,LOW(ZMIENNA) LDI XH,HIGH(ZMIENNA) LD R24,X STD Z+0,R24[/syntax]...
Zmienna może być w rejestrze i chyba żadnych wymagań standardu to nie pogwałci. c.b.d.o. No... słowa "może" i "chyba" podkreśliły wagę Twojego dowodu (; 4\/3!!
Od pewnego czasu tylko piszę w C i to zupełnie na inne mikrokontrolery, lecz naskrobałem takie "cóś": [syntax=asm] liczba equ 72h ; przechowywana liczba podana przez uzytkownika czy_kod_poprawny equ 73h ; zmienna "flaga", jesli wartosc 0 to kod poprawny org 0h; start: mov R0, #3 ; ilosc cyfr mov R1, #0 ; offset w tablicy mov DPTR, #haslo mov czy_kod_poprawny,...
Stos nie jest ustawiany na r16. Rejestr r16 służy do zapisania w rejestrach wskaźnika stosu SPH i SPL (jeden odpowiada starszemu bajtowi, drugi młodszemu) odpowiednich wartości. RAMEND to zmienna zadeklarowana w plikach *.inc dla każdego procka. Oznacza ona ostatni adres w pamięci RAM. HIGH(RAMEND) i LOW(RAMEND) służą do 'wyciągnięcia' z tej wartości...
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!!
dawid512 : ?. "CLI" blokuje wywoływanie przerwań, ale nijak nie przekłada sie na równoważność z wyjściem z funkcji. dreidel : Funkcji obsługi przerwania napisanej w C nie opuszcza się przez reti - wtedy tylko możesz spowodować przepełnienie stosu (na stosie zawsze są odkładane co najmniej 2 rejestry), zresztą powracasz nie do miejsca, w którym nastąpiło...
wyswielic stale ktore juz miale przypisane do poszczegolnych wyswietlaczy tez mi sie udalo natomiat nie wiem jak wyswielic zmienna z jakiegos rejestru ktora jest czterocyfrowa (dziesietnie) i wyswietlic odpowiednio jednosci na 1 wys, dziesiatki na 2 itd z tego co czytalem to trzeba uzyc dzielenia z reszta ale nie wiem jak to ma wygladac
jesli koledze chodzi tylko o zapis i odczyt z rejestrow to nie ma zadnego problemu wystarczy jedynie uzyc zwykledo assemblerowego mov. np. chcesz zapisac do rejestru r0 ze zmiennej to piszesz mov r0,{zmienna} a przy odczycie odwrotnie mov {zmienna},r0
W czystym C mozesz zrobić tak: Załóżmy, że liczba do wysłania to A. Deklarujemy wskaźnik: unsigned char *p p=&A; PORTB=A; //pierwszy port (można uzyc PORTB=*p; PORTC=*(p+1); //drugi port Jednak niekoniecznie bedzie to szybkie. Wszystko zależy od rodzaju kompilatora, jak jest realizowana zmienna - czy w rejestrach czy w pamięci, jak są realizowane wskaźniki....
Bo to bardziej skomplikowane jest - ty chcesz od tyłu wprowadzić multitasking. A to nie takie proste. Albo zrób obsługę silnika na przerwaniach, a w programie głównym modyfikuj tylko flagi sterujące wykonaniem kodu w przerwaniu, albo zmień menu tak, aby wysyłało komunikaty do kolejki. Zawsze przy takiej okazji polecam: http://www.sics.se/~adam/pt/...
witajcie ,w asemblerze nie bardzo wiem co i jak wiec kiepsko będzie z analizą kodow w c przydąłyby się jakieś rysunki , mam nadzieje że ten post stanie się pomocny dla takich jak ja początkujacych , zdefiniowana zmienna volatile- nie wedruje do rejestru ale operacjie na niej są przeprowadzane na niej z poziomu ramu tam też zachodzą zmiany które zachodzą...
Często stosowane w dostępie do rejestrów gdzie są oddzielne pola bitowe czy bajtowe o różnych funkcjach. [syntax=c] typedef union { uint32_t wartosc; struct { uint8_t bt0; uint8_t bt1; uint16_t wr0; }bajty; }moj_rejestr_a; .............. // zmienna lokalna do modyfikacji rejestru moj_rejestr_a loc_rej_a; // wczytanie całego rejestru jako wartości 32...
ADRES to nie jest "zmienna", to rejestr (AD_RESult, w skrócie ADRES), w którym jest przechowywana wartość z po konwersji AD (wartość rejestru ADRES jest zapisywana wewnętrznie przez uC a nie przez soft), w poniższym kodzie: [syntax=csharp] int ReadTEMP(unsigned char Channel){ ADCON0=(Channel<<2) | 1; ADCON2=0b10110101; //Right justify - Fosc/16...
Kolega wyżej podał bardzo fajną pętlę [syntax=avrasm] lpm R0,Z+ ;odczyt st Y+,R0 ;zapis dec R16 [/syntax] Jeśli chcesz kopiować od jakiegoś adresu w tablicy to do Z dodajeszsz offset przed rozpoczęciem petli a w r16 masz ilosc elementów do skopiowania. Jeśli chcesz więcej niz 256 to musisz zrobić licznik na dwóch rejestrach które będziesz dekrementował...
Oto przykładowy programik, który nic nie robi ale ma obsługę od przerwania INT0 i w zależności od stanu zmiennej o nazwie "zmienna" wykonuje tą obsługę albo nie. Dla urealnienia problemu zakładam, że używam w programie "akumulatora" R16 (czyli rejestru do wszystkiego) oraz rozpoczynam obsługę przerwania od zabezpieczenia tego "akumulatora" i rejestru...
(at)excray, (at)es2, w stm32 jest coś takiego jak rejestr powtórzeń licznika - więc zmienna / licznik stanu nie ma sensu ;) Dygresję nie na temat usunąłem.
Chcę kożystać z przerwania INT0, a w nim o jeden powiększać zmienną zapisywaną w rejestrze np.: r20. Niestety po powrocie z przerwania zerowany jest stan rejestrów, awięc zmienna znika. Komend Push i Pop nie ma w ATtiny12. Jak operować na zmiennych? Jak odkładać je na stos?
no przeciez juz to sam napisales... rotacja sobie wrzucasz bit do Carry, nastepnie przerotowywujesz owe Carry dalej do jakiegos (wyczyszczonego wczesniej) rejestru na dowolna pozycje, choc najlepiej na LSB. dokladnie to samo robisz dla drugiej zmiennej, tyle ze wykorzystujesz jako adres drugi rejestr. czyli ze jesli akurat twoim bitem aktualnym jest...
Powrócę jeszcze do tematu. Timery programowe to objaśnił Mirekk36 w swojej książce oraz artykułach i wideo poradnikach, bardzo dobrze je się stosuje. Jest to proste, wystarczy ustawić jakiś timer w tryb CTC i wywoływać przerwanie co jakiś zamierzony czas (stosuje około 10ms). F_CPU/Prescaler/100 Zaokrągloną wartość wpisujemy do rejestru OCRx. W przerwaniu...
To akurat nieprawda. Tutaj to taka histereza bo nie porównujemy czy jest mniejsze czy nie, tylko do dwóch różnych wartości . (W Zajete oblicza Prog_gorny a w Wolne na odwrót) Niestety ten zapis jest jednak nieefektywny bo za każdym IF`em zmienna musi być ponownie załadowana do rejestrów celem porównania. Jeśli jest to ta sama zmienna to efektywniej...
są identyczne i tożsame. Nie są tożsame ani identyczne. Chodzi mi tylko o końcowy efekt pracy programu. Dla rejestrów volatile ma ogromne znaczenie kolejność i rejestr (druga zmienna) może nie być w ogóle odczytany (i np. flagi/statusy sprzętu nie zostaną ustawione/wyzerowane), w zależności od wartości pierwszej zmiennej. I to nie z powodu optymalizacji,...
Zaraz za zmienna wysyłaj kilka spacji, bez żadnych warunków.
Tak tego nie zrobisz. Zmienna X jest zamazywana nowym stanem rejestru PIN. Próbuj dalej.
Optymalizacje :D No właśnie. A BASCOMowi są one obce. Wciąż nie wiem jak działa bascom...;] BASCOM wszystko robi na pamięci RAM. Nawet zmienną licznikową pętli For za każdym razem pobiera i powtórnie odsyła do pamięci. W rejestrach tylko operuje. Było to nawet wygodne bo w takiej wersji zawsze wiadomo było gdzie jest dana zmienna (w którym rejestrze,...
Żadnego sensu, ale też sensu nie było robić wersji z buforem jak mam problemy z przerwaniami. warunek [syntax=c] if (isr & USART_ISR_RXNE) {...} [/syntax] jest uruchamiany automatycznie mam rozumieć i jeżeli nie mam bufora to zmienna data_rx jest cały czas nadpisywana?
Bo nie ma to żadnego znaczenia, gdzie jest spacja? Dodano po 3 BTW, zapis typ *zmienna, to nie deklaracja, a definicja zmiennej. Deklaracją byłoby np. extern "C" typ *zmienna.
W bascomie można tak: 'zmienna_long = (zmienna_byte & 3) << 10; Zlong = Zbyte And 3 Shift Zlong , Left , 10 'zmienna_long |= (zmienna_byte <<2) & 3; // ???????? Shift Zbyte , Left , 2 Zbyte = Zbyte And 3 Zlong = Zlong Or Zbyte Pozdrawiam Piotrek
1. Biblioteki ST są do d... (wszyscy to piszą, to ja też) 2. Żeby zmienić wartość jednego rejestru niekoniecznie trzeba wywoływać cała inicjalizację timera (patrz post powyżej) 3. Popatrz w Swoją pętlę główną. Zanim zdejmiesz paluch z klawisza, pętla obróci się kilkaset (kilka tysięcy?) razy i zmienna c pójdzie poza zakres.
Bawiłem się ostatnio CAN'em na STM32F103. Program "demonstracyjny" nie został w pełni ukończony ale działa. Można by poeksperymentować z filtrami bo na początku konfigurowałem wszystkie (albo więcej niż wszystkie). Załączam ważniejsze pliki. Cube nie robi niestety wszystkiego. Sama konfiguracja jest w Cube (nowym). W programie używałem rejestrów. STM...
Mozesz zrobic tak: Tajmer ustawiasz tak zeby liczyl powiedzmy 50ms. W procedurze obslugi przerwania po pierwse przeladowjesz go zeby liczyl znowu 50ms, nastepnie zwiekszasz jakis rejestr (zmienna) i sprawdzasz czy jest 20, jesli jest to masz juz zliczona sekunde wiec robisz to co chciales, zerujesz rejestr i od nowa (najlepiej to zorganizowac w ten...
Niestety: If R6.4 = 0 Then nop End If ani nawet: If R6 = 0 Then nop End If się nie skompiluje. Pozostaje odczyt rejestru do zmiennej i testowanie zmiennej (O zgrozo - odczyt rejestru do zmiennej :D. Żeby potem i tak zmienna była odczytywana do rejestru i tam sprawdzana.), albo assembler: sbrc R6, 4 jmp Zrob_to nop nop nop nop jmp Zrob_tamto !Zrob_to:...
W twojej pierwszej deklaracji jest nieszczęście. Spróbuj tak: struct TPole{ unsigned char bit_0:1; unsigned char bit_1:1; . . unsigned char bit_7:1; } bit_field; zdefiniuj dodatkowo takie coś: #define Get_bit(adr) (*( (volatile bit_field*) (adr) ) ); Teraz chcąc wyłuskać jakiś bit piszesz: zmienna = Get_bit (i tu adres właściwy bajtu na którym ci zależy...
Najczesciej Rejestr jest jakby podzielony jest na czesc zapisana na stale w ROM, mozesz ja sobie zbackupowac, ale ponownemu zapisaniu podlega TYLKO pdczas wgrywania od nowa Firmware (nie mylic z zawartoscia pamieci residentFlash) Druga czesc Rejestru jest zmienna i zapamietywana w ten sam sposob jak pliki na Flashu - jak zmodyfikujesz, tak bedziesz...
Mnóstwo instrukcji assemblera nie może być wykonanych w jednym cyklu zegara... w sumie wszystkie wykonywane są w tej samej liczbie i zależy ona od PIPELINE'u... pobranie instrukcji, dekodowanie, wykonanie, zapis do pamieci, akumulacja wyniku. To jest taki najprostszy pipeline i umożliwia on właśnie wykonywanie instrukcji w "jednym" cyklu zegara.......
Skrypt w ogóle nie zadziała. Powód taki, że najpierw czytasz zawartość np. flow.get("tempMax"), a jeśli takiej nie ma to zmienna przypiera postać undefined. Po drugie by działały poprawnie operatory porównania to obie strony muszą być liczbami i to typu float (ujemne dane) [syntax=javascript]var t = parseFloat((msg.payload*1).toFixed (1)); var Tmax...
Zgadza się, jeśli zmienna jest volatile, to kompilator musi bezwzględnie realizować wszystkie dostępy bez buforowania odczytu ani opóźniania zapisu. Jak by nie patrzeć, kompilator optymalizuje kod zakładając liniowy(sekwencyjny) sposób wykonywania: w obrębie danej funkcji (jaka by ona nie była: program główny, przerwanie czy cokolwiek innego) można...
Zamiast Bitwait Pinc.3 , Set wpisz: Blad=0 Do If Timer0 > 200 Then Blad=1 Exit Do End If Loop Until Pinc.3=1 Wyskok z petli nastepuje kiedy warunek Pinc.3=1 albo kiedy Timer0 > 200. Wartosc 200 to oczywiscie przyklad :-) Drugie pytanie. Mozna dokladniej zmierzyc, choc to jest Timer0 8-bitowy. Robisz nastepujacy prosty trick: 1. deklarujesz zmienna...
Oczywiscie ze mozesz nuzywac nazw rejestru w roznych czesciach programu. A do przechowywania zmiennych zdecydowanie uzywaj RAM-u. Zreszta stos jest czescia RAM-u tyle tylko ze dostep do niego jest przez inne instrukcje i trzeba dbac o kolejnosc. Czytelniej chyba jest gdy napiszesz tak: .equ rTemp1=R16 zmienna1: .BYTE 1 lds rTemp1, zmienna1 ;laduje...
Dobrze. Zmienna value_adc0 nie musi być volatile , chyba, że odwołujesz się do niej jednocześnie w programie głównym i w przerwaniu (przerwaniach).
Wszytskie zmienne daklarowane w C są przekazywane do ASM poprzez rejesrty R0-R7. W opisie kompilatora powinno to być opisane jaka zmienna w jakich rejestrach. C działa na funkcjach gdzie do funkcji są przekazywane oraz odbierane zmienne. Funkcja może być napisana w całości w ASM i wtedy z języka C przekazuje się zmienne właśnie poprzez rejestry. Robienie...
Portb = Mem_wiert ustawia na porcie odpowiednią kombinację stanów Mem_wiert = 1 - Końcówka 0 stan wysoki; reszta niski Mem_wiert = 2 - Końcówka 1 stan wysoki; reszta niski Mem_wiert = 4 - Końcówka 2 stan wysoki; reszta niski Mem_wiert = 8 - Końcówka 3 stan wysoki; reszta niski portb=0 wyłącza zasilanie silnika. Łatwiej jest sterować portem za pomocą...
Nie chce mi się czytać instrukcji, napisz konkretnie jaki rejestr chcesz odczytać z falownika, tutaj masz błąd w Adres 4 to zmienna Ineger czy Dint jeżeli Dint to zaznaczasz 4xbit za rejestrem nie może być # tylko zapisujesz jako ciąg rejestru 01305 rejestr 13 bit 5 w screnie masz podpowiedz, jeżeli jest to Integer to i tak nie może być # https://obrazki.elektroda.pl/7175554800_...
Drugie co się nasuwa to że PDC_TCR to jakiś rejestr, a nie zmienna, którego wartość odczytana nie jest taka sama jak zapisana lub którego zawartość zmienia się sprzętowo niezależnie od tego, że zastopujesz procesor (np. timer) Ale mogę się mylić bo ARM'y Atmela omijam z daleka. Albert
zmienna dword zmienna single combobox zmienna
czyta schematy elektryczne tokarka samoróbka gazem grand cherokee
master klima krups napełnianie
Instrukcja obsługi Polar CZ340 - gdzie znaleźć? Temperatura pracy tranzystora BD136 w MDS-432