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ę...
Zmienna count powinna być volatile .
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ć.
Ł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?
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.
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...
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)...
Jak jest zadeklarowana zmienna Flaga?
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ł.
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...
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...
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...
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.
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"?
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;...
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 :)
Na screenach zmienna MW20 przyjmuje wartość 0, 10 i 20 jednocześnie? Sprawdź gdzie i jaką wartość wpisujesz do tej zmiennej.
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:...
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,...
.. 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?
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.
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
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.
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.
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ś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...
.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.
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...
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.
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...
_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.
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...
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ś.
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...
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...
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...
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...
(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...
[syntax=c] #define Button (1<<PB0) #define Button_PORT PORTB #define Button_PIN PINB #define Button_DDR DDRB volatile _Bool Key_Pressed = 0; // flaga wciśniętego przycisku [/syntax] [syntax=c] Button_DDR &= ~(Button); //port - wejście Button_PORT |= (Button); //włącz pull up [/syntax] [syntax=c] ISR(TIMER0_OVF_vect)//przerwanie wywoływane...
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
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?
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...
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.
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...
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...
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...
Ź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...
Przede wszystkim musisz zacząć kolego od poznania timerów. Do odmierzenia czasu używamy timerów ponieważ zlicza nam czas w tle działania procesora. Używając polecenia wait zatrzymujesz kompletnie uC na ten czas. Konfiguracja dla AtMega8 8Mhz u mnie wygląda tak: Config Timer1 = Timer , Prescale = 256 ''''konfiguracja timera On Timer1 1s ''''przy przerwaniu...
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,...
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
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...
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...
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...
[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
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) ))...
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...
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)......
(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;...
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...
Dopowiem 2MHz bo $crystal = 2000000 Timer jest 16bitowy czyli liczy do 65535 Timer jest wstępnie ładowany wartością 3035 65535-3035=62500 2000000Hz/62500=32Hz Prescaler ma 8 -> 32Hz/8=4Hz 4Hz*60s*7min=1680ticks Zmienna A jest typu bajt czyli do 255 bierzesz Windowsowy kalkulator, przełączasz w tryb programisty, klikasz 1680 MOD 255 i wynik/reszta=150
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);...
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...
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...
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...
(at)georgeporge Myślę że chyba zrobię tak jak mi podpowiedziałeś (na zenerce - transoptor odpada), zastanawiam się tylko czy program mi to obsłuży... Coś może jeszcze dorzucić? Dioda LED (bez znaczenia jaki kolor) ma napięcie około 3,5V. generalnie dobrze by było wyciągnąć z układu stan logiczny 0-5V i przy okazji sterownika nie usmażyć, dlatego pytałem...
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>...
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...
zmienna dword zmienna single combobox zmienna
grzałka zużyta gniazdo przyczepki podłączenie uszczelniacz zaworowy wymiana
Odpowietrzanie hamulców Ford Fiesta 2009 - krok po kroku Odpowietrznik układu hamulcowego Ford Fiesta 2009 1.4 benzyna