Jak najbardziej jest poprawne, tyle że zauważ że w obydwu przypadkach nie masz zrealizowanej programowej eliminacji drgań styków
1. Zaprogramuj timer w tryb CTC, np. na częstotliwość 100 Hz. W przerwaniu timera: - sprawdź, czy przycisk naciśnięty; jeśli tak - zapal diodę i załaduj wartość 1000 do zmeinnej - "timera programowego". - jeśli zmienna timera ma wartość różną od zera, zdekrementuj ją, a jeśli zdekrementowała się do 0 - zgaś diodę. Razem daje to 5 linii kodu w przerwaniu...
Nie znam za grosz bascoma... Ale ogólnie to tak... Pogonił bym go z wewnętrznej PLL (64MHz) na 16MHz... To samo z zegarem timera... Dzięki temu częstotliwość dla PWM będzie jako taka... W zasadzie to sprowadza się to do zrealizowania timera 12-bit... W C łatwiej mi pokazać o co chodzi niż pisać esej... ISR (TIM1_OVF_vect) { if(timer_compare==timer_counter)...
Czy po ustawieniu nr_trybu = 0 w przerwaniu nie powinieneś zerować timer_count ? Albert
Już prawie masz to, co trzeba. Jeśli zmienna timer zwiększana jest co 20 ms, to zrób: if (timer >= 2) { /* albo więcej, ale 40ms to i tak dużo */ uint8_t zmiany = debounce(); /* wersja freddiego */ timer = 0; if (zmiany & _BV(PIN_MINUS)) servonumber -= 1; if (zmiany & _BV(PIN_PLUS)) servonumber...
To zadziała, jeśli pętla będzie w metodzie timer_tick, wtedy zmienna powinna się aktualizować. Sam timer jest w zasadzie abstrakcja, każdy jego tick określony interwalem ograniczony jest przez metodę start i stop. Od momentu start timer staje się hermetycznym obiektem.
Jeśli zbyt często nie przeliczasz tego czasu, i nie brakuje ci mocy obliczeniowej, to może być. Szczególnie że w arduino jest już działający timer.
Ok rozumiem. Spróbuj tego. Użyte przerwanie. Można też zrobić bez zależnie od potrzeb. $regfile = "m8def.dat" $crystal = 8000000 Dim Zmienna As Word Dim A As Bit Config Pinb.1 = Output Config Pind.2 = Input Set Portd.2 '============ definicje timera ================================ Config Timer1 = Timer , Compare A = Toggle , Compare B = Disconnect...
Gratuluję wytrwałości :) Jest jeszcze jedna rzecz, którą będę chciał zrobić - dodać dodatkowy timer, żeby zmienna lesser_delay_counter (flaga przyjmująca 4 stany w zależności od tego co ma być wyświetlone na ekranie "czas, temperatura, cisnienie, hPa") była niezależna od timera wyznaczającego częstotliwość multipleksowania, Jako alternatywę proponuję...
Kwarc 8MHz Prescale 256 Timer liczący do 250 Zmienna licząca do 125 I masz 1.00000s. Dodano po 1 AVCC obowiązkowo do VCC. AGND do GND. Ile razy można to powtarzać.
Może używając timer1 i jakąś zmienną przechowującą ilość przerwań wywołanych przez ten timer - czyli co przerwanie timera zmienna+1 i jeśli osiągnie jakąś tam wartość (czyli ileś tam przerwań timera = jakiś czas (zależny od kwarcu)) to wtedy spełniać ten warunek.
Łańcuch z diod LED. Może podpowiecie, jak napisać taką wstawkę w asemblerze do przerwania od Timera. Zmienna globalna pwm jest porównywana ze zmienną licznik (zwiększana w przerwaniu). Jeżeli większa, to LATX HI else LATX LO. Zmienna globalna będzie normalnie widziana w stawce asemblerowej?
Napisałem prosty program do fazowej regulacji napięcia za pomocą triaka przy uzyciu pilota (rc5). #define F_CPU 8000000L #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> #include "rc5.h" volatile int16_t czas=65379; SIGNAL (SIG_OVERFLOW1) { sei(); PORTB |= 1<<PB0; // ON _delay_us(9);...
Co jest nie tak ? Delikatnie mówiąc wszystko. 1 Timer nie wiem co liczy, cały jest źle napisany i nie powinien działać, bo np: przerwanie od timera powinno być zadeklarowane przed pętlą główną i nie w warunku. Zmienna Reload nie jest zerowana i zwiększa się do maximum typu Word Zmienna M (w zamierzeniu chyba od minut) też się zwiększa do 255 Zmienna...
AVE... Co do kodu, to nie wiem, bo jestem podchmielony lekko winem herbacianym... Program podziel na dwa kawałki: pętlę główną i przerwania. W pętli głównej za pomocą if-then sprawdzasz sobie jakieś tam flagi bitowe związane z przyciskami. I zachowujesz się adekwatnie, w sensie zmieniasz status zapalenia diod. W przerwaniu sprawdzasz po kolei dwie rzeczy:...
No więc mam taki program i jak mogę wyświetlić zmienna w terminalu i jak mogę wznowić czas timera? [syntax=C] #include <Timers.h> Timer zmienna; void setup() { Serial.begin(9600); pinMode(2, INPUT_PULLUP); pinMode(3, INPUT_PULLUP); pinMode(4, INPUT_PULLUP); pinMode(5, OUTPUT); digitalWrite(5, HIGH); } void loop() { while (digitalRead(2) == LOW)...
Coś mi się nie podoba część dotycząca PWM (bez dogłębnej analizy programu). Powodem jest zmiana wartości Timer2 w programie. Załączę poniżej program, którym próbowałem działanie PWM'ów na M8. (Komentarze dotyczą Timera1, a poniższy program utuchamia Timer2) Program działa w 2 pętlkach - jedna zwiększa wypełnienie i kiedu dojdzie do max druga petla zaczyna...
Wskazany w linku debugger to zapewne JLink ale za cenę niespełna 10 $ to napewno nielegalny klon :) Jeżeli chcesz poznać LPC'ki i mieć debugger to wejściami . Kiedyś zapomniałem o tym fakcie i dziwiłem się dlaczego program nie działa tak jakbym się tego spodziewał.
Zmienna count powinna być volatile .
Nie lepiej wykorzystać przerwanie ICP1 timer1. Tam przepisywać zapamiętaną wartość timer1 (timer1 w konfiguracji timera zmienna = capture1), i przeliczać na prędkość, znamy przecież drogę (odległość między magnesami) a potrzebujemy tylko czas pomiędzy kolejnymi przerwaniami wywołanymi tymi magnesami. Po co zliczać ilość impulsów (drogi) w danym czasie...
Zapoznaję się powoli z tematem ARM-ów i korzystam z fajnej (tak mi się dotychczas wydawało :) strony [url=http://www.dioda.com.pl/forum/topic... Generalnie najprostszy kod obsługi timera przepisałem stamtąd i niby wszystko działa ale z jednym mankamentem. Wypisuję na LCD numer kolejnego...
możesz sobie całego switcha umieścić w funkcji obsługi timera, ale zmienna licznik musi być wtedy globalna, czyli zadeklarowana powyżej main, tak sądzę... http://wkretak.pl/readarticle.php?articl...
Jak jest zadeklarowana zmienna Flaga?
Oba przykłady podane przez kamil1984 są błędne. Pierwszy, oparty na porównaniu "nowej" i "starej" wartości zmiennej w rzeczywistości nie wykrywa zmiany wartości, bo zapamiętanie "starej" nie ma związku z wykryciem zmiany. Powinno być mniej-więcej tak: [syntax=c]if (x != stary_x) { stary_x = x; odswiez_wyswietlacz(); }[/syntax] W drugim zmienna odliczający...
skorzystaj z pinu ICP1 i Input Capture Timera1, w rejestrze ICR1 bedziesz mial zliczone impulsy miedzy kolejnymi impulsami na pinie ICP1, w obsłudze przerwania Input Capture dodaj zerowanie timera. Dodano po 16 A jak chcesz to zrobic na INT0 to char zmienna=0; int wartosc; ISR(EXT_INT0_vect) { if (zmienna==1) { cbi(TCCR1B,CS11);//wylacz...
Przy pierwszym naciśnięciu uruchomić Timer np. na dwie sekundy. Jeśli w tym czasie odbierzesz drugi znak, to zmienna=2*10+5. Jeśli nie to zmienna=2.
a _delay_ms i _delay_us Ci nie wystarcza ? Do opóźnień nie trzeba wykorzystywać koniecznie przerwań timera. Można wykorzystać flagi timera (o ile się da, ale wszystko zależy). Poza tym, zmienna deb w Twoim programie zapewne nie jest volatile, ale wrzuciłeś nam NIC, także pomoc też nijaka
Koledzy wspominali o uzyciu timera do tego, ale nie bardzo wiem, jak się do tego zabrać. Bardzo proszę o jakiekolwiek wskazówki. Generalnie co każde przerwanie timera jakaś zmienna jest takim wyznacznikiem upływu czasu.
Program skacze do przerwania co 50ms więc żeby odmierzyć 1s musi skoczyć 20 razy. Poprostu w programie jest zmienna która jest ładowana stałą 20 i odejmuje się w każdym przerwaniu o jeden. Jak dojdzie do zera to jest 1s i cykl się powtarza (znowu jest przypisywane 20). np: co 50ms w przerwaniu: if(zmienna){zmienna--;}... else { zmienna=CYCLE;...
WinCC -> zmienna w pamięci -> PT Timera (ustawiane zmienną) Ta zmienna w pamięci jest w pamięci sterownika i ja jakoś muszę podać ją na PT czy ona sama się tam wstawia ,,automatycznie"?
Na screenach zmienna MW20 przyjmuje wartość 0, 10 i 20 jednocześnie? Sprawdź gdzie i jaką wartość wpisujesz do tej zmiennej.
.. Czy odstęp będzie zmieniał się w tym wypadku automatycznie?.. Jeżeli podłączysz je do jakiegoś licznika/rejestru przesuwnego który będzie je wyzwalał po kolei - to tak. Ale moim zdaniem lepiej zaprogramować jakiś AVR. Będzie dużo szybciej, łatwiej i taniej. A do czego Ci taki układ potrzebny?
Tak, mam komunikację WinCC z S7-200, działa wizualizacja oraz mogę włączyć sobie awarię buttonem, ale za ch**a nie wiem jak zrobić czas trwania procesu (pewnie timer i icznik w MicroWIN), mianowicie skalowania oraz nie wiem jak zrobić aby mi ten suwak działał. Używam WinCC flexible, zrobiłem wizualizację, komunikacja odbywa się przez PC Access (fizycznie:...
period register nie ma nic do rzeczy - nim mozesz conajwyzej skrocic cykl timera. nie ma zadnego prostego sposobu - nalezy zwiekszyc preskaler timera skoro przekraczasz zakres - bedziesz mial mniejsza rozdzielczosc, ale dluzszy mozliwy pomiar. mozna ewentualnie sprobowac partyzantki i wlaczyc przy okazji przerwanie od timera wywolywane przy okazji dojechania...
Dzień dobry, Mam problem z klawiszami. Zedytowałem do własnych potrzeb fragment kodu znaleziony na http://mikrokontrolery.blogspot.com/ [syntax=cpp]ISR(TIMER0_OVF_vect) { sei(); static uint8_t stan_przyciskow_najstarszy , stan_przyciskow_stary , stan_przyciskow_nowy; stan_przyciskow_najstarszy = stan_przyciskow_stary; stan_przyciskow_stary = stan_przyciskow_nowy;...
Jedna rzecz jeszcze nie daje mi spokoju. Jeśli timer się przepełni, zmienna a, jest zwiększana, jest to dla mnie trochę za wolno. Prescaler jest na 1. Więc pozostaje wpisać wartosćdo TCNT0, żeby szybciej się przepełniał. Proponuję użyć trybu CTC timera i przerwań Compare Match. Można ustawić przerwania praktycznie na dowolną ilość taktów, tylko uważaj,...
Musisz ustawić timer. Nie wiem czy dasz radę na 5minut, ale możesz np zrobić go na 10sekund i wywołać 30razy (w timerze będziesz zliczał kolejne wywoływania i ponownie ustawiał timer, jak dojdzie zmienna do 30 to wyłączysz timer i wywołasz podprogram). Nie będzie to nic blokowało :)
Jeśli masz na myśli timer S5, a nie IEC, to zmienna musi być typu S5TIME. Można ją otrzymać z typu TIME przy użyciu funkcji FC40 TIM_S5TI z biblioteki standardowej lub ze zmiennej WORD, ale z większą kombinacją. Musi być 0-999 w kodzie BCD i trzeba ją sumować z poniższymi wartościami w zależności od podstawy czasu: 0.01 sek. = W#16#0000 0.1 sek. = W#16#1000...
Load Timer 250 pojawił się 2 razy bo pierwszy jest wykonyawny przed wejściem do pętli a następny w pętli. W tym programie jest dodatkowa zmienna Licz_8ms bo Timer0 nie może odmierzyć całej sekundy w jednym przebiegu. Przy użyciu Timer1 i odpowiedniego kwarcu można osiągnąć przerwania co 1 s. Jest to korzystne bo odmierzanie czasu jest nieco dokładniejsze....
Będzie ciężko to zrobić :( Najprostsza możliwość, to włączanie i wyłączanie timer-a, przyciśnięciem tego samego Buttona. Rozumiem To zadam pytanie inaczej Chcę wysyłać zmienną o wartości od 0 od 255 + $13 "Enter" jako string na COM port i wypisywać wartość odebraną na "Panel1" chcę by jeden Button jak trzymamy , zwiększał wartość zmiennej co 250ms...
robisz sobie zmienna 1bajtową i na przerwaniu od timera (kiedy sie przepełni) inkrementujesz ją( zwiekszasz o 1). Wtedy łaczna ilosc zliczonych impulsów wyniesie zmienna1*256+timer. Piszesz sobie najpierw procedurke ktora wyswietli pojedyncza cyfre, nastepnie piszesz procedurke ktora wyswietli całą cztero cyfrową liczbe. Wyswietlanie robisz w petli...
Z listingu programu nie mozna doszukac sie jaka metode przyjmujesz w pomiarze RPM. Ja jakoś się doszukałem. A nie, sory. Nawet doszukiwać się nie musiałem. Liczy okres pomiędzy impulsami. Ale przerwanie to powinno wyglądać tak: Przerwanie: Zmienna = Timer1 Timer1 = 0 Wynik = 7500000 / Zmienna Return Preskaler Timera ustaw na 64. A: Capture Edge...
Zmienna dla timera musi mieć format S5Time, a nie INT. Zmień typ zmiennej w bloku DB.
Przerwanie od przycisku jest całkiem trudne do poprawnej obsługi. Po wykryciu zmiany musisz je zablokować, odliczyć czas w przerwaniu timera i ponownie odblokować. Dużo prościej testować przycisk w przerwaniu timera.
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...
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.
Witam, Nie widzę nigdzie czasu dla T1, pewnie to jest ten problem. A I 0.0 FP M 100.0 AN T 1 L S5T#10S SE T 1 A T 1 = Q 0.0 Pozdrawiam. PS: Jeśli chcesz podać do timera czas ze zmiennej, to musisz pamiętać, że zmienna ta musi mieć format S5Time. Możesz zdefiniować taką zmienną w bloku DB.
zapoznaj sie z fusebitami. Czy ty chcesz dokladnie odmierzyc 500 milisekund czy okolo? Jak chcesz dokladnie otrzymac to kwarc zew. i timery. A masz zew. ram podlaczony? nie wiem jak chcesz jakas zmienna zdeklarowac poza pamiecia sram chyba ze chodzi ci o pamiec stala eeprom
No jak masz w buzzerze generator to w programie wystawiasz stan go aktywujący na odpowiedni pin, i ustawiasz jakąś zmienną (zmniejszaną w przerwaniu timera) na wartość odpowiadającą długości piknięcia. I potem w tym przerwaniu od timera jeśli zmienna dojdzie Ci do 0 to wyłączasz nogę aktywującą buzzer i koniec. Program jest zajęty tylko w momencie aktywowania...
Jeżeli używasz timera IEC (TON, TOFF, TP) to użyj zmiennej DINT na HMI. Będzie to zadawanie czasu w sekundach: L Czas_HMI // Zmienna DINT L L#1000 *D T Czas_Timer // Zmienna TIME Nie potrzebujesz żadnych konwersji.
_delay_ms(zmienna) To jest właśnie problem. A dlaczego? Zobacz co to za makro i jak go używać. Chcesz użyć zmiennych? To korzystaj z odpowiedniej funkcji i timera.
z timerami jestem cieńki. czy mógłbys mi to napisac jako gotowa procedura zmieniająca zmienna np vol? razem z ustawieniem timera?
Do zliczania czasu warto użyć timera z biblioteki (SFC5). Czas ma zmienna time, więc możesz spokojnie liczyć do 100h.
Tomaszek_ A co ma timer do tego? Zmienna A zwiększa się o 1 podczas przerwania od pinu INT0. Też nie jestem za zwalaniem winy na Bascom. Nigdy mi się nie zdarzyło żeby Bascom namieszał coś.
Jeśli dalej używasz choćby jednej zmiennej typu Bit to nadal pomysł jest aktualny bo bitów zawsze jest osiem. Jeśli nie, to mozna wygospodarować jedną zmienną typu Byte, ale że Tiny13 to bardzo wymagający uC i mozesz już nie mieć więcej miejsca na Byte to możesz pojechac po bandzie i do przechowywania wartości wykorzystać jakiś nieużywany rejestr :D...
Nie ten dział. uC są nieco wyzej :) Zrób opóźnienie wykozystując Timer. Konkretnie dodaj zmienna, jesli ma np wartosc 0, po wcisnieciu przycisku dzieje sie jakies tam zdarzenie, a zmienna przybiera inna wartosc. Po zadanym czasie przerwanie Timer'a przywraca stan zmiennej na '0' i mozna klikac od nowa.
Witam, Ja tą zmienną deklaruję sam ;). Zmienna podłączona jest po timer. Pozdrawiam,
Można też użyć analizatora stanów logicznych. Przed i po wywołaniu algorytmu zmieniać stan pinu i sprawdzać czas na wykresie. W ten sposób nie jesteś ograniczony czasem od góry. A gdy użyje timera to jest ograniczony? Jaki problem aby zmienna cntHH miała 64 bity. Razem z timerem to 80 bit. Nie wiem czy GCC poradzi sobie z taka zmienna ale nawet przy...
Dzięki wielkie za podpowiedzi, a tak poza tym dopytam się, dlaczego w przypadku backupu, kiedy wykonam kompilację całego projektu bądź zapiszę dany blok bez wykonania jakichkolwiek zmian, wywala mi błąd przy zmiennych w danym bloku, które są przypisane do innego, np. zmienna, która jest przypisana do timera (SFB 4 to timer). Wstawiam zdjęcie dla przykładu....
W pseudokodzie: 1. Ustaw timer na częstotliwość powiedzmy ok. 100 kHz, przypisz do niego przerwanie i aktywuj przerwania 2. Stwórz dla każdego kanału zmienną typu PWM_CHn W przerwaniu od timera 1. Zmienna COUNTER = COUNTER + 1 2. dla każdego kanału 0...n: Jeśli COUNTER < PWM_CHn to zapal diodę, w przeciwnym razie zgaś 3. Ewentualnie jeśli chcesz...
Czyli trzeba zmienić kod wyzwalania timera oraz preskalera tak? Edit: [syntax=text] #include <avr/io.h> #include <avr/interrupt.h> volatile uint8_t licznik, Timer; // deklaracja zmiennych które będą wykorzystywane w przerwaniach // procedura obsługi przerwania INT 0 ISR( INT0_vect ) { licznik++; // zwiekszaj licznik o jeden } // przerwanie...
(at)ElektrodaBot Jak w czystym C (AVR GCC) wyglądałaby funkcja millis() ?, a może pokaż też 2 podejścia (listing), gdzie milisekundy to zmienna globalna np. millis. Wykorzystaj timer do przerwania dostępnego na każdym AVR.
Witam. Na początek napiszę że to ma być mój pierwszy program napisany w tym języku i pierwszy kontakt z mikrokontrolerami. Nie mam pomysłu jak się zabrać za uruchomienie jakiegoś "zegara". Wydaje mi się że wtrącenie w pytaniu „jakiegoś zegara” wprowadza ludzi w błąd. Z dalszej części wynika że raczej potrzebujesz obsługi TIMERA wbudowanego...
.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.
Mozna tez latwiej: Mozesz przeciez zadeklalowac jakas zmienna typu (D)INT i ja uzywac jako licznik czasu. Na przyklad piszac programik FC: U #IN_BO_Permission_on SPB M011 L 0 T #IO_IN_Licznik // inicjacja licznika R #OUT_BO_czas_uplynal // kasuj wyjscie BEA M011: L #IN_IN_Czas_Liczenia // Po jakim czasie wlaczyc? L #IO_IN_Licznik <=I = #OUT_BO_czas_uplynal...
Tak oczywiście zła jednostka, oczywiście chodziło o dosyć niskie częstotliwości czyli od 100Hz do 2khz. Żarówka klasyczna 75W, regulacja działa jednak coś blokuje chyba procesor. uC to ESP32, kod jest wywoływany właśnie w przerwaniu i jest to jedyne przerwanie w całym kodzie. To powinno dać 50khz przerwanie. Dodano po 1
No dobra , tylko jak powinien wyglądać timer "gotowy do użycia" ? timer,ładujemy początkową wartość ,on zlicza do niej i mamy 1sekundę, wtedy Incr Zmienna(sekunda) - jak ja mam to napisać?? Nie mam pojęcia o Timer'ach! Kubbaz napisał coś o tym ale słabo czaję...
Nie potrzebujesz volatile, a jeśli chcesz skomplikować kod, to faktycznie zapis: div_1s=div_1s-1; if (div_1s == 0) działa podobnie (tylko może trochę wolniej), jak if (--div_1s == 0) Zmienna div_1s powinna być zadeklarowana w procedurze przerwania timera jako static uint16_t (i zapewne powinna zliczać w dół od wartości znacznie większej, niż 150). Książki...
Nie typu, tylko z takim specyfikatorem - to był skrót myślowy... [syntax=c] volatile uint8_t softTimer; //Zmienna dekrementowana co 10ms (timer programowy dla debouncingu) [/syntax] [syntax=c] ISR(TIMER1_COMPA_vect) { register uint8_t timerValue; timerValue = softTimer; if(timerValue) softTimer = --timerValue; //Timer programowy dla nieblokującej obsługi...
Napewno poradzisz sobie i w VB. Musisz anlezc przyczyne. moze to wina przetwarzania danych i wysylania na port. sprobuj zrobic zmienna typu boolean ktora bedzie miala wartosc False w momecie przetwarzania obrazu i wysylania go do zyswietlacza. Jezeli wszystko sie zakonczy nabierze ona wartosc True. W Timerze wstaw ta zmienna tak by wykonywal kod tylko...
Nie sądzę, aby funkcje klasy Wire mogły działać prawidłowo w ISR. Ta klasa nie została do tego zaprojektowana. Czy zmienna state jest typu volatile?
No ale to o tym nie świadczy. Świadczy tylko o tym że kod włączenia diody wykonał się po 5-ciu sekundach. Czyli że Timer liczył 2 razy szybciej niż myślałeś. A nie że zmienna doliczyła do 5 zamiast 10.
chyba nie zrozumiałeś o co chodzi z tym rejestrem. po prostu chodzi o to, że wywołujesz przerwanie(no może nie do końca Ty) co np 125µs i inkrementujesz w tym przerwaniu zmienną (to ten tajemniczy REJESTR - pośrednio). Jeżeli ta zmienna = 3, to znaczy, że minęło 375µs (3*125) no i tak to się w zasadzie przelicza. W Atmedze16 są chyba dwa rejestry...
Poza tym to: TCNT0 = 130; Powinna być pierwszą instrukcją w przerwaniu, a tak w ogóle polecam poczytanie o trybie CTC - nie będzie trzeba martwić się o ciągłe ładowanie wartości timera. EDIT: A problemem właściwym jest nadmiarowy średnik, o tu: if(licznik == 375); jak go wywalisz to będzie w miarę OK. A zmienna nie musi być w tej sytuacji volatile,...
Jako ze nie przepadam za pisaniem na maile, to odpowiem tutaj... Musisz skonfigurowac odpowiedni timer i przy przerwaniu, jakie generuje int czas=0; int timer0=131; SIGNAL (SIG_OVERFLOW0) { czas++; if (czas==5000) BUUM(); //jezeli czas osiagnal 5000ms, to wywolaj funkcje BUUM(); TCNT0 = timer0; // zaladowanie do...
Skonfiguruj przerwanie zewnętrzne INT0 pod przycisk. Gdy przycisk zostanie wciśnięty, w przerwaniu ustawiasz odpowiednia flagę zaczynająca odliczanie czasu, oraz załączasz przekaźnik. Ustaw sobie jakiś timer np. timer0, preskaler 1024, w trybie overflow. Przy taktowaniu 1[MHz], częstotliwość przerwań wynosi ok. 4[Hz]. Co czwarte przerwanie timera, inkrementuj...
"Szukam teraz zmiennej którą mógł bym to zrobić" Robisz sobie żarty, czy na prawdę nie wiesz co to zmienna?
1. dobrze 2. zmienna counts nie jest nigdzie zerowana, to raz. pozatym algorytm IMHO jest bledny, to dwa <: idea jest taka, zeby byl on w stanie zmierzyc impulsy o dowolnej dlugosci, a nie tylko takie ktore zmieszcza sie w jednym okresie timera (ile on tam bitow ma). jednoczesnie wiec w pierwszym przerwaniu od gory (overflow) inkrementowany jest...
Teraz zauważyłem, że trochę się machnąłem (dwa odejmowania jedynki). Oczywiście, że możesz tak zrobić - ja wydzieliłem dodatkową zmienną ze względu na optymalizację: aby uniknąć dwóch odczytów zmiennej volatile. Różnica będzie w dosłownie czterech czy pięciu cyklach. Jak chcesz, to możesz nawet napisać tak: [syntax=C]ISR(TIMER...) { if(cnt_busy && --cnt_val...
Jeżeli to ma nic nie robić tylko generować impulsy, to po prostu może użyj Waitms. A jeżeli nie, zmieniaj wartość porównania w zależności od dodatkowej zmiennej. Np: $regfile = "m16def.dat" $crystal = 16000000 Dim A As Word 'Zmienna zwiększana i porównywana. Dim B As Byte 'Zmienna decydująca z jaką wartością będzie porównywana zmienna A. Config...
[syntax=basic4gl] Config Timer1 = Timer , Prescale = 8 'Parametr Prescale może być równy:1, 8, 64, 256 lub 1024 [/syntax] Potem w programie możesz sobie odczytywać zawartość tego licznika w następujący sposób (np.): [syntax=basic4gl] Stan = Timer1 'Zmienna Stan typu Word [/syntax] robiw
Masz błędny kod. Jak chcesz by program działał jak trzeba to musisz wiedzieć co robi każda linijka. Włączasz przerwanie od przepełnienia timera0, a nie maż funkcji do jego obsługi. Deklarujesz funkcję do obsługi przerwania zewnętrznego, a nie masz funkcji obsługi i nie zezwalasz na to przerwanie. Na moje oko to po uruchomieniu timera procesor się zresetuje...
omen_s : Dziwaczny ten program - brak oczekiwania ani odwołań do timera, zmienna znakh jest wykorzystywana raz jako licznik próbek i raz jako aktualna wartość (pomimo, że nie jest potem zerowana). Spróbuj może coś tego pokroju: #include <avr/io.h> #define TIMER_WAIT() \ { \ while(!( TIFR & _BV(TOV0) ))...
Źle podchodzisz do problemu - zmienna i (czyli numer wyświetlanej cyfry) powinna być zmienną globalną, którą w przerwaniu od timera zwiększasz, a następnie wykonujesz blok switch (i) { ... }. Oczywiście delay w przerwaniu to "bluźnierstwo" :) Preskaler ustaw sobie na 64, wtedy przerwanie od timera dostniesz ok. 400x na sekundę, czyli odświeżanie całego...
Zrob zmienna publiczna np "LecaSekundy" w module tak zeby byla widoczna w calej aplikacji. wstaw timer na formatke kliknij na niego 2razy i wpisz" Private Sub Timer1_Timer() LecaSekundy = LecaSekundy +1 'Mozesz odswierzyc pole tekstowe text1 = ZmienCzas(LecaSekundy) End Sub
Oczywiście że nie ma prawa działać. Zasymulujmy: - Włazisz w if (flaga_menufunc1), wykonujesz kod w nim, uzbrajasz timer itp itd. if(Timer1==0) się nie wykona, bo właśnie na świeżo uzbroiłeś timer, więc procek będzie kontynuował kod jak gdyby nigdy nic, a następnie zgasi flagę flaga_menufunc1=0; i opuści ciało "dużego" ifa. Tyle... Co z tego, że w końcu...
Radziłbym Ci zobic tak: Cały PWM zrób na przerwaniu od jakiegoś Timera; nie uzywaj zmiennych typu single, jeżeli częstotliwośc przerwań bedzie odpowiednio szybka wystarczy zmienna typu byte lub word. Obsługe LCD czy przycisków i innych obliczeń zostaw w pętli główne Przykładowy PWM dla portb.3: Gdzie a to jakas amienna a do b podajesz wartosc PWM (0-255)......
Z tego co wyczaiłem to mega popędzana jest kwarcem 14,7456 MHz (kwarc do USART)... Timery ustawione są tak, że przerwanie wywoływane jest co 0,05s stąd podstawowa zmienna zliczająca do sekundy zwiększana jest co drugie wywołanie przerwania (odpowiadają za to variable i variable1)... Spróbuj przeanalizować ten kod i skonfrontować go z dokumentacją do...
Zrób to w konwencji automatu - zmienna określające stan i duży switch (stan) w obsłudze przerwania z odpowiednim zachowaniem w każdym stanie. Na ogół wygodnie jest to zrobić przy stałej częstotliwości przerwań timera, odpowiadającej najkrótszemu odcinkowi czasu, który trzeba odmierzać lub takiemu, który jest podwielokrotnością wszystkich odmierzanych...
Czekaj, czekaj. Jeden czujnik odpali przerwanie INT0 a w tym przerwaniu sie uruchomi timer. Drugi czujnik po INT1 ma go wyłączyć. Raczej o tym myślałem. Lepiej tak: czy ktoś by mi dokładnie wytłumaczył jak wywoływać timery, zbierać z nich czas, do czego służą poszczególne rejestry. Noty katalogowej tego procka po polsku nie znalazłem, a dobrego poradnika...
Zrób to sobie programowo np. weź timer0 i ustaw podstawę czasu tak aby co określony czas timer zgłaszał przerwanie czy to przepełnienia czy porównania w tym przerwaniu umieść np. taki kod [syntax=c] //gl_OCR1 to zmienna globalna pełni funkcje identyczną jak OCR1 uint16_t volatile gl_OCR1 ; ISR(wektor) { static uint16_t zm; if(zm<gl_OCR0) PORTA&=~(1<<PA0);...
Rozwiązanie Twojego problemu jest banalne. Na początek proponuję wykorzystać zmienną, która jest zwiększana przy każdym wciśnięciu przycisku i w zależności od wartości tej zmiennej (tu wystarczy od 0 do 3, przy wartości 4 zmienna jest znowu zerowana) ustawiasz jedynkę na odpowiednim porcie jednocześnie uruchamiając zliczanie. Kiedy licznik dojdzie do...
Co może być przyczyną takiego zachowania się układu ? Regulacja powinna być co 5/256 = 0.019 V. Spróbowałbym zacząć od debouncing'u. Styki mają przecież jakieś drgania. Zamiast tego możesz na próbę pominąć sprawdzanie styków, a zamiast tego w pętli for zmieniać wartość OCR1A z jakimś dużym opóźnieniem, przykładowo: //na początku dołącz #include <util/delay.h>...
(at)Gunis-92: Możesz wykorzystać do odmierzania czasu np. SysTick [syntax=c] volatile uint32_t licznik_tykniec;// zmienna globalna /* obsluga przerwania od licznika/timera SysTick */ void SysTick_Handler(void) { licznik_tykniec++;// inkrementacja licznika } void delay(uint32_t czas) { uint32_t aktaualny_licznik_tykniec; aktaualny_licznik_tykniec = licznik_tykniec;...
if (IO0PIN & LED0) { IO0CLR = LED0; } else { IO0SET = LED0; } To w końcu ten pin "LED0" jest wejściem czy wyjściem? Ja rejestr IOPIN używam tylko jak sprawdzam stan wejścia, natomiast do sprawdzania czy dioda LED świeci czy nie służy mi zwykła zmienna.
No jesli korzystasz z przerwan timera to ok ja bym od razu tak zrobil ale niestety dla mnie basic to same krzaczki ;) a ty mowiles za dopiero zaczyanasz wiec tak jest najprosciej.Ja nie wiem czy to tutaj jest ale robi sie tak ze procedura od przerwania od timera zwieksza jakas zmienna i jesli odliczy ustalony odcinek czasowy to sie ja zeruje i zwieksza...
W jakim jezyku? LD? Jak tak to mysle ze wystarczy dodac styk normalnie otwarty (od czujnika), za nim timer T_ON z czasem 3 sekundy, A na wyjsciu timera cewka resetujaca przenosnik. Na drugiej galezi normalnie zwarty styk, a za nim cewka setujaca przenosnik. Ew. zamiast setow i resetow mozna dac jakas zmienna, nawet chyba lepiej bedzie, bo gdzies jeszcze...
Masz błąd w procedurze wyświetlania - na wyświetlaczu będzie widać "duchy" sąsiednich cyfr. Gdybyś zamiast zmiennych s1, s1, s10 zrobił tablicę, mógłbyś wywalić switch, tak, jak Ci to pokazałem wyżej: PORTD = c[cyfra[i]]; Twoja pętla główna ciągle zamienia liczbę na cyfry, a wystarczy zrobić to jeden raz po zmianie wartości. Tablicy c nie ma sensu deklarować...
Walcze z Atmega8 i gcc. Zatrzymalem sie na przerwaniach od USART. Chce zaswiecic diodke (np na PB1), gdy z PC przyjdzie komunikat przez RS. Korzystam z przerwania od RXC i moge tylko zaswiecic (ustawic H), a nie moge zgasic (ustawic L) LEDa. Probowalem wszystkimi f-cjami, ustawianie bitow itp. Nie moge ustawic portu na 0. Czemu???? Jest tez problem...
Ten sam kod, który zaprezentowałem w pierwszym poście , natomiast przerwanie wywołane już na nodze portb.0 i działa zmienna nie jest nadpisywana. Cała reszta kodu bez zmian poza zmianą przerwania. Przerwania skonfigurowane prawidłowo. Moze przerwania masz skonfigurowane prawidlowo... ale..... Czy mozesz wyjasnic w jakim celu, w obsludze przerwania...
zmienna dword zmienna single combobox zmienna
zestaw naprawczy pompa dopisanie kluczyka podłoga samochód
fideltronik schemat fideltronik schemat
Kodowanie sterownika silnika Citroen C4 - narzędzia i proces Najlepsza płyta indukcyjna 400V - Bosch, Siemens, Electrolux