E tam, nic strasznego.... Tu masz błąd: Dim U_wy As String * 2 Zwiększ to na: Dim U_wy As String * 3 I leci aż miło. Nie mieścisz się w zmiennej, that's all:) Poza tym skonfiguruj watchdog oraz TIMER. Pewnie jeszcze coś tam siedzi (wyświetlanie bez wymazywania poprzednich, większych o rząd wartości na przykład) ale to tak na szybko. Pozdrawiam, TD
Sprawa jest prosta: funkcja strcpy kopiuje tyle bajtów, ile może, póki trafi na zero które kopiuje, ale zaraz po tym przerywa kopiowania. Jeżeli ilość znaków w MaskEdit1->Text będzie większa od 3, to strcpy może nadpisać wszystkie lokalne zmienne, od pierwszej do tej przed str1, a nawet zmienne w funkcjach które oczekują na powrót z aktualnej funkcji....
a po co Ci dwie zmienne ? if(!(PIND & _BV(4))) { _delay_ms(250); if(++set_h >= 10){ set_hh++; set_h = 0; } } if((set_hh>=6)&&(set_... 68 to wyzeruj set_hh i set_h { set_h=0; set_hh=0; } tak to raczej winno wyglądać
Już Ci pisałem, że nie zerujesz zmiennej licznik_bitow_rx.
W przerwaniu Int0 inkrementuj zmienną. Ustaw timer na jakąś jednostkę czasu i w przerwaniu od tego timera obliczaj cześtotliwość i zeruj zmienną
Jak wyżej.
ups. znowu mój błąd. zapomniałem zerować zmienną I I=0 program u góry już poprawiłem moze teraz zadziała ??? :D
Excray, twój kod zadziała raz na 255, zapomniałeś zerować zmiennej a :P Mylisz się. Po prostu nie zrozumiałeś jak działa ten kod. Nie trzeba zerować tutaj żadnej zmiennej. W zasadzie kod można jeszcze bardziej uprościć: [syntax=c] while(1) { if(!(PINC & 0x01)) PORTD ^= 0x01; }[/syntax] Jak widać żadne zmienne ani globalne ani lokalne nie są potrzebne...
Nie zerujesz zmiennej "w" przy kolejnych uruchomieniach, może coś jeszcze. Możesz przecież uruchomić to pod debuggerem i podejrzeć która instrukcja wywołuje błąd i jakie są wartości zmiennych przy jego uruchomieniu. Jeśli włączysz codeguarda to powinieneś też dostać jakiś sensowny komunikat ze wskazaniem na linię kodu, pewnie access overrun.
No teraz dobrze, ale czy to Ci w ogóle potrzebne? Zerujesz zmienną prze wejściem w pętle ... A wracając o głównego wątku, jeśli masz włączone przerwanie to jego czas dodaje się do tych 1780us, być może wiele razy na bajt (bo częstotliwości oscylatora nie podałeś) i sprawdzasz PD2 w niewłaściwym czasie ... Albert
Nie kojarzę jak to jest w STM ale w AVR po resecie zrealizowanym przez WD rejestry konfiguracyjne WD nie są kasowane - tj. watchdog od momentu startu kodu działa tak jak został zaprogramowany przed resetem i czeka na komendę WDR albo wyłączenie. Jeśli ktoś tego nie uwzględni w kodzie to po resecie od WD mikrokontroler potrafi wpaść w pętlę resetowania...
Jeżeli tak zrobisz i nastąpi przypadek, że w momencie w którym licznik będzie miał wartość 125, a warunek który dopisałeś nie będzie spełniony to nie wykona się kod zawarty w instrukcji if, czyli nie wykona się zerowanie zmiennej licznik. W rezultacie zmienna licznik w następnym przerwaniu będzie miała już wartość 126, itd. - i teraz pytanie: Czy to...
Sprawdzasz stan końcówek w pętli głównej i za każdym razem porównujesz stan ze stanem poprzednim. Jeśli zgodny i wysoki inkrementujesz zmienną np Czas. Jeśli przeciwny zerujesz zmienną Czas. Sprawdzasz wartość zmiennej czas i jeśli zmienna osiągnie zadaną wartość uC wystawia na swoim pinie wyjściowym określony stan. Jak widać ustalenie błędu musi nastąpić...
Pewnie niewiele pomogę ale zrób to na zasadzie nadpisywania ekranu. 1. Zrób ekran z opisami 2. wykryj przyciski pilota i przypisz flagi, np. góra, dol, lewo, prawo - zakładając, że przycisk włączony to 1 a wyłączony to 0 3. sprawdź flagi i gdy np. góra=1 to; powtórz punkt 1 ale już z innymi opisami. 4. Nie zerujesz zmiennej góra, zerowana jest dopiero...
Raczej na [syntax=c]char rodzaj[2]; [/syntax] Mniej zmian trzeba będzie dalej wprowadzać. Zamiast [syntax=c]//if (tab[i].rodzaj=="L" || "l") [/syntax] musisz napisac [syntax=c]if ((tab[i].rodzaj[0]=='L') || (tab[i].rodzaj[0]=='l'))[/syntax] (lubię dużo nawiasów) Jeszcze trzeba przesunąć zerowanie zmiennej wynik przed pętle, a wypisanie wyniku po.
Witam, jestem pewnien, że to błachostka, ale niestety kompletnie nie umiem programować, dlatgeo pytam na naszym forum. Nie wiem, dlaczego zmienna się zeruje. Przypuszczam, że poprostu nie umiem użyć globalnej zmiennej. [syntax=cpp]int ir_pin = 7; //Sensor pin 1 wired through a 220 ohm resistor int led_pin = 10; //"Ready to Recieve" flag, not needed...
Wydaje mi się że to zależy od kompilatora. Taka deklaracja nie zeruje zmiennej, czy kompilator ją niejawnie wyzeruje to zależy od niego. Nawet jeżeli ja zeruje to lepiej zawsze napisać; volatile uint8_t accel_decel_counter = 0; Wtedy program jest jaśniejszy, a dobry kompilator i tak to przypisanie zrobi tylko raz. Standard języka C tego nie definiuje...
Czy w sterowniku jest jakaś zmienna odpowiedzialna za zanik zasilania ? A co za problem stworzyć samemu marker typu BOOL w deklaracji VAR (będzie to zmienna ulotna). Po zaniku zasilania tego typu zmienne zawsze są zerowane. Na początku programu wykonujemy operację: IF bAfterReboot = 0 THEN (*tutaj zamykamy pliki*); bAfterReboot := 1; END_IF;...
Banalne zadanie. A więc włączasz licznik(lepiej TIMER1-większa pojemność), tak, aby odliczał ci te 10sekund. Dajesz zmienną którą zwiększasz np co 1sekunde (zmienna o nazwie sekundy). W czasie odliczania do 10s w pętli głównej zliczasz impulsy przycisku i zwiększasz je w innej zmiennej (np. impulsy). Po 10 sekundach w zmiennej sekundy będzie10s a w...
Wykorzystuje te zmienne do pomiaru ilości spalonego paliwa. Układ to komputerek do samochodu mierzący temperaturę, napięcie, spalone paliwo, sprawdzanie włączenia świateł, sygnalizujący włączenie alarmu zamiast diody i parę innych w przyszłości. Odłączyłem te czujniki, przejechałem 20 km i wygląda na to że wszystko gra, czyli któryś z nich może być...
Instrukcja służy do kopiowania wartości z wejścia IN do wyjścia Q, w tym przypadku dla zmiennej typu Integer (liczba całkowita). Do czego wykorzystać: np zerowanie jakiś zmiennych (liczników, numerów kroku sekwencera itp). ustawienie jakieś wartości zmiennej zależnie od logiki itd
Robisz sobie dwie zmienne: blokada i aktywność. Blokada jako prosta wartość 0 lub 1: jeśli blokada jest założona i wykryjesz, że oba przyciski są naciśnięte, to ustawiasz blokadę na 0 (i aktywność na 0, dodatkowo można dać opóźnienie, aby nie uwzględniać naciśniętych przycisków dalej). Jeśli blokada jest zdjęta, to robisz wszystkie testy, dodatkowo...
W warunku: [syntax=c]if( aktualnyPik++ <(pikniecia*2)) //sprawdzenie czy piknęło już tyle ile trzeba i zwiększana potem liczba piknięć (++) { digitalWrite(pin,!digitalRead(pin)); //tu jest odczytywany aktualny stan pinu i wpisywany odwrotny stanbuzzera=1; //flaga buzera, że aktywny, pozwala ponownie wywołać funkcję } else { aktualnyPik=0; //jeśli...
Nie lepiej zerować przez RS'a zmienną która zlicza impulsy ?
kombinuję też, że może za późno wywołuję funkcję fpu_enable()? W sumie to przed nią tworzy się obiekt IMU. To mogłoby mieć znaczenie tylko jeśli konstruktor tego obiektu w jakiś sposób robi coś "zmiennoprzecinkowego". Jeśli tylko zeruje zmienne w pamięci, to raczej bez znaczenia. Jednak gdy robię to tak: W pliku .cpp ta funkcja musi być zdefiniowana...
Na jakiej podstawie twierdzisz, że problemem są priorytety przerwań? Przerwania występują na tyle sporadycznie, że nie ma tutaj miejsca na problemy. Jeśli wysyłany jest znak '2', to porównanie (i==2) jest błędne TCCR2 = 1<<CS00 | 1<<CS02 | 0<<CS01 ; proponuję zapisać tak: TCCR2 = (1<<CS00) | (1<<CS02) |...
Myślę, że jedynym sposobem jest odbieranie danych z USARTa za pomocą przerwań. W programie należałoby ustawić jakieś opóźnienie i sprawdzać cyklicznie, czy nadszedł nowy znak. Jeśli w określonym czasie (zależnym od częstotliwości "powtarzania" klawiatury) nie nadejdzie nowy znak to diodę wyłączyć, jeśli nadejdzie i jest to 'w' to zapalić. Więc w funkcji...
Ja bym to zrobił tak: zadziała pierwszy czujnik - ustawiasz jego zmienną na 1 i czekasz aż zadziała drugi czujnik, jeśli tak, zerujesz zmienną , dodajesz jeden do licznika, i czekasz aż drugi czujnik wróci do stanu zasadniczego. Jeśli nie - zerujesz zmienną po określonym czasie. (znaczy że ktoś uruchomił jeden z czujników i nie aktywował drugiego) zadziała...
Żeby odliczyć wyznaczony czas zamiast ustawiać od razu relay ustaw tryb pracy na wyłączanie i zapisz sobie stan millis, potem w loop jeśli tryb pracy jest wyłączanie odliczasz czas, gdy warunek się spełni ustawiasz zmienną stanu przekaźnika na low i zerujesz zmienną wyłączanie. [syntax=c]if (wylaczanie) { if( (uint32_t) (millis()-odliczanie)>=czasWylaczenia).....
Usuń znaczek hash i nazwę zmiennej umieść w nawiasach klamrowych. Będzie odwołanie do pamięci, a nie ładowanie stałej. Oczywiście pisze o tym w pomocy, ale szukać się koledze nie chce. :bad-words: Można uzyskać dostęp do zmiennej umieszczając jej nazwę w nawiasach klamrowych { }. By mieć dostęp do bajtu MSB zmiennych Integer/Word, należy użyć formy:...
buffer<<=18; można też rozumieć jako przesunięcie o 18 bitów :D bo docelowe dane nie znajduja się na początku ramik Tylko czy aby we właściwym kierunku? Funkcja TC_GetTC1() nie wykonuje konwersji tylko rzutowanie i moim zdaniem jest zbędna. Spróbuj tak buf w funkcji RD_AD() bo zmienne lokalne nie są domyślnie zerowane podczas deklaracji i mogą...
Przy tej ilości przepracowanych godzin można przed instalacją systemu było wykonać erase - czyli zerowanie dysku.
W linii 21 Set kom = wksN.Columns(2).Find(What... LookAt:=xlWhole) Jeśli prawdziwe jest If kom Is Nothing wychodzisz z procedury bez zerowania zmiennych obiektowych (które sobie będą siedzieć w pamięci). Unikniesz tego stosując Else... If kom Is Nothing Then MsgBox "Nie ma podanej komórki." Else On Error GoTo 0 wksR.Range("C1:D1")...
Może odpal jakiś Timer żeby generował przerwanie bardzo często. Powiedzmy co 10us. I w przerwaniu sprawdzaj czy pin ma stan 0 czy 1. Jak 1 to inkrementujesz jakaś zmienną. Jak zmieni się na 0 to zwracasz wynik i zerujesz tą zmienną. Oczywiście w tym samym przerwaniu sprawdzaj tak samo drugi pin. Niestety wymaga to kodu obsługi przerwania w assemblerze...
Sam kiedyś z ciekawości i chęci sprawdzenia jak mają się pomiary różnymi czujnikami do siebie zbudowałem taki układ z termoparą, LM35, DS18B20 i czujnikiem NTC. Jeśli te pomiary Ci się w kodzie "nie spieszą" to może przyda Ci się taka prosta metoda. Jako że ADC czyta się do Word bo ma więcej niż pomieści Byte to pozostaje w tej zmiennej dużo wolnego...
Masz tam od zatrzęsienia operacji na znakach i ciągach... Kolego nie dramatyzuj ;) spacer: Odbieraj znaki w przerwaniu, po odebraniu w jednym ifie sprawdzaj czy NIE jest to znak CR dalej w tym ifie sprawdzaj czy NIE jest to LF. Jeżeli znak nie jest jednym z nich to znaczy że jesteś w tym ifie i zapisuj znak do bufora: bufor[i++]. Dalej w przerwaniu...
Można zerować, ale nie trzeba, bo każda instrukcja, która ją "obsługuje" i tak ją wyzeruje jeśli nie ma błędu lub ustawi po błędzie.
Trochę to trwało za nim coś skleciłem Za mało czytałem bo mi coś nie wyszło kod wygląda tak [syntax=c]#include <avr/io.h> #include <avr/interrupt.h> #include<stdio.h> #include<util... #define LED3 PB1 #define LED2 PB2 #define LED1 PB4 #define S2 PB0 #define S1 PB3 //definicja początkowej wartości timera #define timer_start...
Problem leżał w przerwaniu ADCA_CH1_vect. Zapomniałem zerować zmienną tymczasową po wykonaniu uśrednienia wartości.
Dla testu możesz dodać network na początku, w którym zerujesz zmienne temp
Chciałem Ci dać wędkę, ale wolisz rybę. $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 Cls Config Timer1 = Timer , Prescale = 256 On Timer1 Odmierz_2s Dim Licz As Byte Enable Interrupts Enable Timer1 Start Timer1...
Problemem są twoje zmienne adcresult. Jak zwykle to bywa zapomniałaś dodać magicznego modyfikatora volatile - bez tego optymalizator pzyjmuje te zmienne za stałe i pod tym kątem optymalizuje pętlę w main. No i robi się kaszana. Poza tym diodami świecisz po 50ms, niezły cyborg z ciebie, skoro to ci wystarcza :) W pętli nie ma też sensu inicjować za każdym...
Uparcie trzymasz w loop() zerowanie zmiennej iloscImpulsow. Już pisałem wcześniej, że robi to funkcja odczytImpulsow() i w sposób prawidłowy tzn. na chwilowej blokadzie przerwań.
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...
Witam ! Cytat: .....na końcu zerowałem zmienną. Nie ma tego w programie. Pozdrawiam. Stefan
Pokaż może kod tego innego bloku, w którym zmienne się ustawiają. Nie wolno używać zmiennych tymczasowych, bez ich wcześniejszego zapisania w obrębie bloku. Może ktoś się pomylił i wykrywanie zbocza lub ustawianie/zerowanie zmiennej zrobił na tymczasowych?
Chyba dokładniej się nie da skomentować ;) Powinno być już wszystko jasne... [syntax=basic4gl]Do ' pętla główna jakiegoś programu ' ' ' tu jest badany przycisk If P = 0 Then 'czy wciśnięty przycisk (P to pin procesora od guzika) If Lk = 0 Then 'czy licznik programowy doliczył już do zera Lk = 50 'jeśli tak to ustaw znowu na 50ms ' (można też nieco mniej,...
(at)_lazor_ i przy okazji pozwala zobaczyć jak sobie zrobić inicjalizacje i zerowanie zmiennych umieszczonych w innych obszarach pamięci (np CCM)
Wg priorytetów: 1. Policz/zmierz, czy czas obsługi przerwania jest wystarczający przy prędkości obrotowej enkodera. 2. Dostęp do zmiennej counter wykonuj w sekcji krytycznej. 3. Zastosuj typ signed, jak sugeruje (at)jarekgol . 4. Zamiast zerować zmienną counter, to zmniejsz jej wartość o 500. 5. Ja bym zrobił jedną procedurę obsługi przerwania na zmianę,...
W AVR GCC wszystkie zmienne globalne i statyczne są automatycznie zerowane i nie ma najmniejszej potrzeby ich inicjalizacji zerami. Jeśli natomiast definicja zmiennej znajduje się wewnątrz funkcji to już trzeba ją samemu inicjalizować.
A więc tak. Nie wiem co o tym myśleć.. czujnik raz zaniża, raz zawyża wyniki. Patrz post #5 :) Jeżeli w "case 3" zerujesz zmienną flow_frequency, to dobrze było, aby w tym czasie zablokowane było przerwanie, w którym ta zmienna również jest modyfikowana.
Nie widzę żebyś gdzieś zerował zmienną "flagi". Ciągły wpis do tej pamięci może coś psuje ??
Zapewne Twój program działa w pętli głównej (loop) i tam rozpoznajesz stan przycisku. Gdy wykrywasz przyciśnięcie przycisku zapamiętujesz w zmiennej A stan millis. Za każdym razem, gdy wykrywasz, że przycisk nie jest przyciśnięty zawsze zerujesz zmienną A. Jeśli A jest różne od zera oraz aktualne millis odjąć A jest większe od 10s, wykonujesz co sobie...
zerujesz zmienną przepisujesz pierwszą liczbę bez przesunięcia dodajesz binarnie (or) drugą z przesunięciem 16 itd...
Zrób odbiór na przerwaniu, a w pętli głównej tylko sprawdzaj jakąś zmienną, ustawianą w przerwaniu, czy coś przyszło, jeśli nie, to goń procka do innej roboty... ;) Acha, jak już wszystko będzie odczytane to tą zmienną sobie zerujesz... Ogólnie to można zrobić bufor, a ta zmienna będzie licznikiem nieprzetworzonych bajtów.
Witam, nie powiem, że to będzie najlepszy sposób, ale myślę że będzie prosty. W przerwaniu odbierasz bajt pierwszy komunikatu MIDI, zerujesz zmienną uint32_t i zaczynasz budować ją od nowa. Po odebraniu wszystkiego porównujesz, i kopiujesz do bufora.
Jeśli masz do dyspozycji timer to zmień podejście do rozwiązania problemu. Ustaw timer tak, aby przepełniał się np. po minucie. To bezpośrednio zapewne nie jest możliwe (długość licznika), ale np. ustaw tak, aby przerwanie ovf występowało np. co 1s, 100 ms, obojętnie. W handlerze tego przerwania umieść dodatkową zmienną zliczającą te przepełnienia,...
Być może ktoś nie chciał lub nie wiedział jak używać volatile flags bądź zerować zmiennych w XOB16.
Tak bo Twój program rusza od main. Wcześniej są robione jeszcze inne rzeczy np zerowanie zmiennych globalnych, ale wszystkie operacje muszą być w funkcjach.
] Zastanawia mnie tylko jedna rzecz. Dlaczego/skąd program wie, że ma zmienić(jak on to zmienia) row Pętla forech automatycznie bierze kolejne wiersze z tabeli i zapisuje je do zmiennej row. To, którą kolumnę ma wczytać, podajesz sam pisząc Aha, pytanie nr2: jak uniknąć błędu podczas kliknięcia drugi raz na "wczytany" button? "Indeks wykraczał poza...
Spróbuj tego programu napisanego na szybko. Jeśli coś nie będzie działało to pisz. Dodałem kilka komentarzy. Przy sprawdzaniu czy znak nie jest "tekstem" jest taka linijka: ctype.h . [syntax=cpp]#include <iostream> #include <fstream> #include <stdio.h> #include <ctype.h> using namespace std; int main() { ifstream zrodlo("xxx.txt");...
(at)jta można wzbogacić o kondka, jak najbardziej. Można prościej, bez oporników Jak zwykle proszę o schemacik. zastąp sobie oporniki kreską... i sam narysuj schemacik oczywiście trzeba obrobić programowo impulsy co 20ms. Możesz to opisać bardziej szczegółowo jak byś to zrobił. Ja do takich rzeczy odpalam sobie licznik (timer) który robi mi przerwanie...
Kodu niestety wkleić nie mogę, ale dlaczego ma być źle napisany, skoro potrafi tydzień działać bez zarzutu, a potem nagle zeruje zmienną....???
Chyba trochę uprościłeś. No dobra - warunek jest taki, że pomiędzy kolejnymi odczytami nie może upłynąć więcej niż max jeden pełny okres timera, może być max jedno przepełnienie (; Z testowaniem flagi przepełnienia można by niby wykombinować więcej, ale tu pojawiają się bardzo nieprzyjemne sytuacje brzegowe: - jeśli odczytujesz najpierw CNT a potem...
...bo zależy nam na zerowaniu zmiennej po przekroczeniu zakresu. Tyle, że nie zaleca się pisać kodu w oparciu o przekraczanie zakresu ;-)
Chciałem w ten sposób uniknąć zerowania zmiennej employeesNumber, bo gdybym jej nie zapisywał i nie odczytywał z pliku to przy każdym uruchomieniu index wynosiłby 0, nawet jeśli już by był zapisany jakiś pracownik
Jeśli bez timerów to zadeklaruj 4 zmienne typu long ( dla odliczania dużych wartości - to będą czasy przerw ) i 4 zmienne typu byte (czas impulsu) zerujesz zmienne przed pętlą . W pętli incrementujesz kolejno te cztery zmienne. sprawdzasz komendą if czy kazda z nich osiągneła założoną wartośc (czas przerwy) . Jeżeli tak to : zerujesz zmienną , incrementujesz...
Dzięki kolego, twoje ostatnie zdanie o spojrzeniu na cyfry oświeciło mnie. Popełniłem beznadziejny błąd ponieważ zerowałem zmienną index, która tak naprawdę nie odpowiada za przypisanie adresu. Dzięki za linki, one też się przydały. Nie będę zamykał tematu, bo pewnie będę miał jeszcze jakieś problemy i w razie czego się w nim odezwę.
Wystarczy zerować zmienne przy inicjalizacji, albo wyczyścić cały ram ręcznie, będzie szybciej niż reset hardwarowy, który zwykle trzyma procka przed startem w oczekiwaniu na stabilizacje sygnału zegarowego.
uint8_t numer __attribute__ ((section(".noinit"... tego możesz używać, ale zawsze musisz zadbać o zainicjowanie takiej zmiennej samodzielnie. Przykładowo reset wywołany przez POR zeruje zmienną, a w przypadku wykrycia, że przyczyna resetu jest inna zmiennej nie zerujesz. Wystarczy odpowiednio wcześnie sprawdzic zawartość...
OB40: zerujesz zmienną licznik i ustawiasz flagę. OB30 wykonuje się prze cały czas. Jeżeli flaga = 1 to: zwiększ licznik o 1, jeżeli licznik = T1 to załącz wyjście; jeżeli licznik >= T2 to wyłącz wyjście i wyzeruj flagę. Czy w Siemensie przerwania mogą przerywać bloki obsługi przerwań?
Reboot - to kwestia napisania kawałka skryptu i wstawieniu go do cron'a. Normalne, że się grzeją - jaką osiągają temperaturę ? Lepsze i standardowe rozwiązanie to UPS. Nie będzie problemu z wykonaniem reboot z poziomu bash? Co do sktyptu - pierwsza myśl to co 10 minut pingować do jakiegoś pewnego serwera na zewnątrz, i sprawdzać resultat. Jeśli brak...
Kwarc dajesz np. 12 MHz Robisz sobie pętelkę pomiarową wywoływaną z Timera np. co 200 µs sprawdzającą dane wejście pomiarowe. Jeżeli wejście jest =0 to nie zliczasz jeżeli = 1 to zwiększasz zmienną WYNIK o 1 (zmienna 16 bitowa) zakres będzie do jakichś 6.4 sekundy. W pętli sprawdzasz także czy zmienna nie przekroczyła 25000 (5 sekund). Jeżeli...
Zeruj zmienną Err przed testowanym poleceniem, a po testowanej operacji kopiuj jej wartość do innej zmiennej, w końcu Lcd może modyfikować jej wartość...
Propozycja programowego "czyszczenia" impulsów: Prędkość 5 obr na sekunde przy 36 otworkach daje 180 impulsów/s. Czyli czas od impulsu do impulsu troche wiecej niż 5 ms. Rozsądnie jest przyjąć czas impulsu na jakieś 20% czasu od impulsu do impulsu (jest to związane ze średnicą otworków). Czyli mamy czas impulsu nie mniejsy niż 1ms, a w większości przypadków...
No to w takim układzie zerujesz sobie zmienną i w pętli dla każdej cyfry od lewej do prawej wykonujesz: mnożenie przez 10, dodawanie wartości cyfry... Jedyne czego w takim układzie potrzebujesz, to funkcji do mnożenia i dodawania liczb dowolnej długości.. do konwersji w przeciwną stronę liczbę dzieli się przez 10(lub przez inną podstawę) i resztę dopisuje...
Celowo pomijam przerwanie o numerze 5(czyli kanał ADC6) ponieważ wykorzystuję tylko 5 czujników(ADC0...4) ;) Jak wrócę z pracy sprawdzę jeszcze czy aby "zerowanie" zmiennej channel wg Twojego sposobu nie zmieni sytuacji w jakiś sposób.
kiedyś robiłem podobny programik i chciałem powiedzieć że brakuje ci jednej żeczy a mianowicie na początku pętli za każdym razem należy zerować zmienną err . bascom ustawia ją w przypadku błędu ale nie zeruje w przypadku powodzenia.
Problem rozwiązany, zabrakło zerowania zmiennych: set, tys, dzies, jedn. Czekam na wartość ujemną zmiennej 'wynik'. Wynik jest zmienną typu int16_t, wydaję mi się że jest to zmienna uwzględniająca znak. Taki sposób konwersji jest mniej wydajny niż itoa()?
Na to jest kilka metod... Czekaj na wciśnięcie dowolne(jeżeli zmienna wyzerowana to wywołaj obsługe) i ustaw jakąś zmienną ... Wyzeruj tą zmienną po pewnym czasie. Takie rozwiązanie powinno być dobre. Zeruj zmienną conajmniej po 250ms od wykrycia wciśnięcia.
...Zgadza się? Dobrze myślę? Dobrze myślisz, tylko źle robisz :-P Sprawdź składnię instrukcji LOAD TIMER . PS Co sekundę zerujesz zmienną " Licz_8ms", a przerwanie masz "dużo częściej":)
Co to za dziwne typy byte i boolean? Po co definiujesz w pamięci stałą const byte numChars = 32; zamiast #define NCHARS 32 ? ( Dlaczego Record() kończy się po odczytaniu jednego bajtu? Dlaczego dane jest typu int (i po co w ogąle ta zmienna)? Co wypisze showNewData kiedy jeszcze nie przyszedł bajt numer 6? Ta procedura zeruje zmienną adres, więc nigdy...
1. Poczytaj ogólnie o timerach. 2. Poczytaj o trybach timerów, Tobie radziłbym CTC. 3. Poczytaj o przerwaniach. 4. Z Timera co sekundę będziesz wysyłać przerwanie. 5. Ustaw pin z przełącznikiem jako wejście. 6. Podciągnij wewnętrzny rezystor do pinu albo daj jakiś rezystor po drodze - nie zwieraj bezpośrednio do masy. 7. Ustaw port z diodą jako wyjście....
Potrzebujesz timera, który będzie liczył czas i pomocniczej zmiennej którą będziesz dekrementować (o ile jest większa od 0) w przerwaniu od tego timera. Po wykryciu zbocza na INT sprawdzasz czy zmienna jest większa od zera. Jeśli nie to wpisujesz do tej zmiennej wartość adekwatną do maksymalnego czasu dwukliku. Jeśli tak to sprawdzasz jej wartość i...
Witam. Zmontowałem przed chwilą i sprawdzone. Zostaje tylko pozbycie się drgań styków klawisza. [syntax=c]#define F_CPU 16000000UL // Atmega644 #include <avr/io.h> /*biblioteka avr*/ #include <string.h> /*biblioteka napisy*/ #include <stdio.h> /*biblioteka podstawowa C*/ #include <stdlib.h> /*biblioteka C*/ #include <stdbool.h>...
Spróbuj tego: $regfile "attiny2313.dat" $crystal = 4000000 Config Portd = &B11111100 Portd = &B00000011 Config Lcd = 16 * 2 Config Lcdpin = Pin , E = Portb.1 , Rs = Portb.2 , Db7 = Portb.7 , Db6 = Portb.6 , Db5 = Portb.5 , Db4 = Portb.4 Config Timer0 = Timer , Prescale = 8 Enable Interrupts Enable Timer0 On Timer0 Przerwanie Dim Czas_cyklu...
Uśrednianie ci nie działa, bo nie zerujesz zmiennej Sre po dziesięciu pomiarach. Wynikiem funkcji format musi być zmienna tekstowa, a ty próbujesz zapisać to do Dys typu Single. Zresztą Dys po Round nie wymaga formatowania. Co najwyżej konwersji na tekst.
Nie zerujesz zmiennej pc. Nawet gdybyś to robił, to bez przerwanie timera ten cały kod działa tylko "na słowo honoru". Cokolwiek zmienisz - i wszystko się rozsypie. To trzeba zrobić na przerwaniu, a najlepiej wziąć uC, który ma tyle wyjść PWM, ile trzeba (i przy okazji będzie zapewne tańszy od ATmega16).
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...
No ale jaki jest w ogóle sens tego kodu? 1. Najpierw czekasz na zmienną którą ustawiasz w tej samej funkcji i ponoć nie masz przerwań (choć w komentarzach coś niby o nich piszesz), to po co czekać? (nie mówiąc już o tym, że się nigdy nie doczekasz poza pierwszym razem [może], gdyż nigdzie tej zmiennej nie zerujesz przy braku problemów) 2. Potem kopiujesz...
Pokazywałem to na którymś filmie (chyba local vs global). Klawiatura to kolejny ekran i powracając z niego wszystkie zmienne lokalne są zerowane a globalne pozostają bez zmian
TMF ma rację - w tym listingu masz kopiowany cały rejestr SREG .Na koniec jest ponownie ustawiony na wartość początkową. Zastanawia mnie coś innego, czemu kompilatory mają problemy z atomowością zerowania zmiennej. Przecież polecenie x =0 , gdzie x jest zmienną typu INT,aż się prosi aby zawsze zerować od najmłodszej części, jeśli tak by było zawsze...
Deklarujesz zmienną do liczenia czasu po wciśnięciu przycisku. Gdy puścisz przycisk, określona wartość wykonuje GOSUB do wykonania zadania(LCD czy sterowanie portami) i zeruje zmienną. Kolejne naciśnięcie przycisku zaczyna liczenie od początku i czeka na puszczenie przycisku. Możesz też wykorzystać TIMER do liczenia czasu.
problem wydaje się, że zniknął. Czy doprowadziłem tutaj do jakiegoś UB? O ile rozumiem ta zmienna to zmienna lokalna zadeklarowana w funkcji. Takie zmienne w C mają "automatic storage duration" i nie są zerowane jak nie ma jawnej inicjalizacji. Dodanie 'static' powoduje, że mają one "static storage duration" (tak samo jak np. zmienne globalne) i są...
Dziękuję za odpowiedź. A gdybym chciał zliczać ilość przyłożeń czegoś metalowego do czujnika? Np. [syntax=c]while(....) { if(czujnik) i++ }[/syntax] To w którym miejscu muszę zerować zmienną czujnik? Może w jakimś przerwaniu po przepełnieniu się timera? Np. co 20ms?
Metodą prób i błędów rozwiązałem problem. Zainicjowałem timer wewnątrz funkcji "void change_color(void);" i teraz nie ma żadnych mignięć diody, tylko normalnie świeci z zadanym wypełnieniem zmiennych pwm_r, pwm_g, pwm_b 0-255. Przy krótkim wciśnięciu przycisku zmieniają się kolory oraz przy długim wciśnięciu zeruję zmienne pwm_r, pwm_g, pwm_b. Wszystko...
... co do resetu to : Reset zeruje tylko zmienna globalna a zmienna lokalna pozostaje nie ruszona :) Ze tez tego nie moglem sie nigdzie doczytac... Przestrzeń w pamięci RAM na zmienne lokalne , jest przydzielana dynamicznie i dla tego nie są one zerowane , bo w czasie kompilacji ich położenie(adres w pamięci) nie jest znane. Bascom również nie zeruje...
ustawias z wolny timer na najdłuższy czas jak sie da. w przerwaniu dajesz inkrementacje tak jak pisał kolega następnie dalej w przerwaniu dajesz porównianie czy zmienna osiągneła daną wartość. jeśli tak to wyswietlasz to co chcesz i zatrzymujsze timer i zerujesz zmienną. chyba źle zrozumiałeś kolegę. w pętli głównej nic nie musisz robić
Jak zwykle czasu nie ma, ale nie mogłem się powstrzymać. Nakręciłem pierwszy klip - ahahahaha :D No musiałem się pobawić edytorem. Efekt to półtora minuty magii :D Ahahaha miałem kupę zabawy z tym :D Przy okazji możesz zobaczyć jak się używa wbudowanego symulatora by zadawać wartości ADC ;) Twój pomniejszony kodzik też poniżej, tylko używając poza symulatorem...
Chciałbym się tylko upewnić, czy pamięć od adresu FB00 do FBFF mogę wykorzystywać we własnych programach jako tymczasowy bufor danych ? Jest to fragment pamięci wizyjnej, nie wyświetlana na ekranie, a poprzedzająca zdublowane adresy znaków i atrybutów. W dotychczasowych programach używam tych 255 bajtów jako magazyn zmiennych odciążających rejestry...
bascom zerowanie zmiennej rzutowanie zmiennej zwiększanie zmiennej
renault megane instrukcja obsługi microchip toolchain rowery giant
sharp lc46le824e falownik powmr
Typ lasera w odtwarzaczu DVD Samsung MM-C430D Pilot RC1243B do telewizora Akai - identyfikacja i problemy