Przerwanie od INT0 powinno aktywować przerwania od timera, które co 50ms będą zmieniać stan portu c: INT0: - blokuj przerwania INT0 - licznik sekwencji na portc = 0 - aktywuj przerwanie timera INT TIMERA: - switch (licznik sekwencji) ..... w ostatnik case czy default: 1) blokuj przerwania timera 2) kasuj flagę INT0 3) włącz przerwania int0
Ź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...
No nie bardzo. Pętle busy waits są w przerwaniu niewskazane. Zrób tak jak napisał (at)BlueDraco : odczyt poprzedniej konwersji-start następnej konwersji-wyjście bez czekania. [syntax=c]ISR(TIMER1_COMPA_vect) { switch(wejscie) { case 2: adc3=ADC; ADMUX = 0; ADMUX = (1<<REFS0)|wejscie; ADCSRA |= (1<<ADSC); break; case 3: adc2=ADC; ADMUX =...
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...
Skoro już używasz timera, to zrób to na timerze :) Najprościej tak, że ustawiasz timer w tryb CTC, procedura obsługi przerwania działa tak jak to wcześniej opisałem. Jeśli chcesz uzyskać przyśpieszenie po przytrzymaniu klawisza to zmieniasz tylko wartość rejestru porównania w trybie CTC na mniejsza, w efekcie kolejne przerwania będą przychodzić szybciej,...
Na Mega328 z KB RAM uruchamianie OS nie bardzo ma sens. Zrób wielowątkowość opierając cały program o maszynę stanów. Zapomnij, że istniej delay. Owszem, krótkich delay (mikrosekundy) w AVR przeważnie nie da się przeskoczyć ale nie zawsze. Na 1-Wire, można obsłużyć USARTem. Nie ma żadnych delay i 1-Wire działa na przerwaniach. Masz więc już pierwszy...
Nie podoba mi się twoje rozwiązanie. Ja bym to zrobił tak - timer odmierzający takty w rytm podstawowego okresu PWM (czyli przerwania np. 1kHz). Teraz zamiast tych porównań z licznikami, wrzuć wartość licznika do rejestru compare register. Dzięki temu masz przerwanie po przepełnieniu timera (nowy okres) - w tym przerwaniu inicjujesz wysyłkę danych po...
Włączasz timer przed skonfigurowaniem go - to nie jest dobry pomysł. Popatrz, jak pracuje Twój switch w przerwaniu timera. W pewnym momencie wys_ ma wartość 4 i z taką zostaje do następnego przerwania. Po co? zrób na końcu wys_ ++; wys_ &= 3; i usuń etykietę default. Dlaczego zmienne ewidentnie 8-bitowe mają u Ciebie typ int? - zmień obie tablice, cyfra...
Najprościej odpalić timer i w przerwaniu wystawiać dane i przełączać segmenty przykład: ISR(TIMER1_COMPA_vect) { switch(wysw) { case 0: PORTD = 0b1111110; PORTB=cyfra[jednosci]; wysw++; break; case 1: PORTD = 0b1111101; PORTB = cyfra[dziesiatki]; wysw++; break; case 2: PORTD = 0b1111011; PORTB =...
Witam ! Tworzę mały sterownik do auta i mam problem. Dotyczy on pomiaru częstotliwości (a właściwie czasu trwania stanu niskiego lub wysokiego) na Atmedze 128, która po dalszych przeliczeniach będzie mierzyć obroty silnika. Sygnał , który będzie mierzony to prostokąt o wypełnieniu 50% i częstotliwości w granicach 15-150Hz. Jak w tytule pomiar ma się...
Dziękuję za propozycje :) Niestety nie do wykonania przeze mnie, z uwagi na poziom moich umiejętności programowania, jak zaznaczyłem na wstępie :) Kwestia drgań i zakłóceń nieistotna, tact switch dobrej jakości. Poproszę o kawałek kodu, pasujący do oryginalnego, sprawdzający przycisk w przerwaniu timera co np. 50 ms oraz dodający niewielkie opóźnienie...
Wytłumacz mi jedno: Oba przerwania nie korzystają ze wspólnych zasobów. A ja tam w obu widzę: [syntax=c]SPI2_IRQ_State = 0;[/syntax] W tym, że pierwsze przerwanie pokazałeś jakieś okrojone. Jaki parametr ląduje do instrukcji switch - case ? Niech zgadnę, ... SPI2_IRQ_State ?
Nie czaję ;) Dodano po 10 A próbowałeś wszystko wrzucić do przerwania od Timera0? #pragma vector=TIMER0_A1_VECTOR __interrupt void Timer0_A1(void) { switch(TA0IV) { case 0x0A : // TA0OVF przepełnienie Timer0_state++; if (Timer0_state >= 12) { Timer0_state = 0; if(play_sample == 1) { one_byte...
Pokaż schemat połączeń, to po pierwsze. Po drugie nie potrzebujesz żadnej funkcji, ani instrukcji switch, tylko zwykłej tablicy : const uint8_t obraz_cyfry[10] = {0x7E, 0x30, 0x6d, itd...}; PORTD = obraz_cyfry[czas]; Na AVR short int ma taką samą długość jak int, a tutaj wyraźne chodzi o bajt - użyj uint8_t z stdint.h. Samo wyświetlanie multipleksowane...
Zakładam, że przyciski są podłączone do pinów i zdefiniowane jako KLIK_MENU itd. Nie sprawdzaj w pętli głównej stanu przycisków tylko wrzuć sprawdzanie do przerwania od któregoś timera z ustawianiem wartości jakiejś flagi a w pętli głównej wykorzystaj funkcję switch - case. Poza tym nie widzę inicjacji portów.
(...) odczytu temperatury. Jaki zaproponowałbyś kod (AVR GCC), aby nie trzeba było używać delay'a (może pooling lub maszynę stanu) ? Przy okazji przedstaw optymalną (bez zmiennoprzecinkowych liczb) konwersję danych ze scratpad'a na stopnie (może być złożeniem liczb całkowitych jako stopnie i części ułamkowe). Do obsługi termometrów DS18B20 bez blokowania...
Warto zacząć od uwzględnieniu sytuacji awaryjnych: 1. Co jeśli czujnik się odczepi, uszkodzi. Brak światła? 2. Co jeśli bateria pod wpływem wstrząsów chwilowo straci kontakt a mikrokontroler zasilanie. 3. Skoro to mikrokontroler, to może warto dodać stan baterii? Natomiast kolejne wciśnięcie switcha podczas ściecenia LED nie resetuje licznika czasu....
Nie wiem jak wygląd biblioteka wyswietlacze.h i co dokładnie robi cyfra(). Zakładam że są dobrze napisane To co niżej napisałem powinno działać. Napisane jest to dla pierwszych czterech wyświetlaczy od góry. [syntax=c] #define F_CPU 8000000L #include <avr\io.h> #include <avr/interrupt.h> #include <inttypes.h> #include <util/delay.h>...
Problemy są dwa: błędna konstrukcja kodu i użycie przerwania od przycisku. Zacznij od zaprogramowania timera tak, żeby zgłaszał przerwania z częstotliwością np. 100 Hz (tryb CTC). Zrób pustą pętlę główną. W przerwaniu timera sprawdzaj programowo stan przycisków i reaguj. Przyda się konwencja automatu: [syntax=c]switch (stan) { case S_START: if (P1)...
1. Ustaw timer tak, by bez pomocy oprogramowania generował przerwania w stałych odstępach czasu. 2. Użyj tablicy zamast instrukcji switch, która w każdym case robi to samo, tylko z inną wartością stałej. Switch zdecydowanie nie do tego służy. pozycja ++; pozycja &= 3; PORTC = tab[pozycja];
1. Disable the Timer/Counter2 interrupts by clearing OCIE2 and TOIE2. 2. Select clock source by setting AS2 as appropriate. 3. Write new values to TCNT2, OCR2, and TCCR2. 4. To switch to asynchronous operation: Wait for TCN2UB, OCR2UB, and TCR2UB. 5. Clear the Timer/Counter2 Interrupt Flags. 6. Enable interrupts, if needed. DS pod tym względem trochę...
Przykładowy szkielet programu: [syntax=c]while(1) { znak = uart_receive(); // pobranie znaku z bufora odczytu UART if(znak) { }// procedura jeśli odebrano znak switch(stan_swiatla) { // automat zmiany świateł case 1: red=0; yellow=0; greek=0; if(czujnik) stan_swiatla=2; break; case 2: // zmiany świateł w kolejnych stanach } _delay_ms(200); // cykliczne...
Mimo, że mogę zmieniać wartość rejestru(sprawdzałem przez rs232) to ISR (TIMER2_COMP_vect) włącza się chyba przy wartości 0, bo czas pulsu wynosi 4ms- czyli przy 8MHz prescalerze 128 wychodzi ok. 250. Nie mam pojęcia co się dzieje. Po resecie mikrokontrolera wszystko działa ok, a gdy tylko zmienię wartość zmiennej choose wszystko się sypie... Prawdę...
Tak nie powinno się robić ale to wstaw w przerwanie od Timera [syntax=cpp] switch(wysw){ case 1: if(minus!=0){ PORTA=~LED_minus; PORTB=~0x01;} break; case 2: PORTA=LedLookup[(temp/10)]; PORTB=~0x02; break; case 3: PORTA=LedLookup[(temp%10)]|~LED_DP; PORTB=~0x04; break; case 4: PORTA=LedLookup[temp_ulamek]; PORTB=~0x08; break; } [/syntax] W temperatura()...
Witam! Na wstępie chciałem zaznaczyć, że od niedawna dopiero poznaję procesory z serii ARM. Bardzo dawno temu miałem styczność z 51- jedynką i keilem. Moje doświadczenie w programowaniu C też nie jest oszałamiające, natomiast asembler na ARM jak na razie jest przeze mnie mało zrozumiany. Proszę o wyrozumiałość przy pisaniu ewentualnych odpowiedzi, za...
Domyślam się, że chodzi o efekt nr 2 z tymi losowymi kolorkami. To chyba jeden z najprostszych efektów :) Co 20ms losowana jest nowa pozycja i nowy kolor. Dla większej ilości led warto przyspieszyć efekt (zmniejszyć wartość "speed"). [syntax=c] //pętla główna . . . if(!tspeed) //timer w przerwaniach z taktowaniem 1ms { tspeed = speed;//Prędkość efektu...
PWM mógłbyś użyć do sterowania silnika prądu stałego, ale nie silnika krokowego. W Twoim przypadku żeby zmienić prędkość musiałbyś zmienić opóźnienie pomiędzy impulsami podawanymi na uzwojenia silnika. Na początek napisz coś takiego: uint8_t predkosc = 0; for (int i = 0; i < 4; ++i) { PORTB = _BV(k); switch (predkosc)...
Ja staram się w przerwaniach zrobić wszystko co możliwe bez zbędnego oczekiwania. Na podstawie uzyskanych w przerwaniach kompletnych danych, w głównej pętli aktualizowany jest stan wyświetlaczy. Na przykład w przerwaniu od ADC odczytuję wynik konwersji, ustawiam kolejny kanał i uruchamiam konwersję. Jeśli wynik jest alarmujący, np. za wysoki prąd lub...
Witam, ostatnio zabrałęm się za projekt prostego zegara. Układ wyświetla godzinę na 4 cyfrach wyświetlacza LED wspólna anoda. Oto wyniki mojej pracy: schemat: http://obrazki.elektroda.pl/9370666700_1... Do mikrokontrolera Atmega8A podłączony jest kwarc 8MHz. A to program [syntax=c]/* * zegar.c *F_CPU 8000000UL zewnetrzny kwarc częstotliwość...
1wire da sie oprogramować czysto na przerwaniu. Dokladnie dwoch, w tym timer i external interrupt na oba zbocza, maszynę stanu na switch-u w przerwaniu tego external interrupt-a. 1wire zrealizowany w taki sposob zuzywa dokladnie 2...10% czasu procesora :] Okazuje się, że można urównoleglić wiele kanałów (optymalność zależy od tego czy procesor dysponuje...
Mam taki oto program: while (1) { ....... //ciag bardzo wielu instrukcji w tym delaye w postasi petli for itp ....... } void T0_int (void) interrupt 0 using 1 //przerwanie od timera 0 { if (P1.0==0) {} //I tu jest wlasnie problem: za pomoca jakiej funkcji //gdy wcisne switch podpiety pod P1, przerwanie // spowoduje przerwanie dzialania petli while????...
W kwestii timerów i przerwań, to mozesz przeczytać o tym na mojej stronie: Timery: http://wkretak.pl/readarticle.php?articl... Co do tych dipów to miałem ich trzy czyli mogłem sobie wymyślić 8 różnych zakresów. Powiedzmy ze przełączniki te podepniesz pod PB0, PB1 i PB2. I potem robiłem coś w stylu: zakres = (PINB.0) + (PINB.1 * 2) + (PINB.2 * 4);...
Nie chce mi się analizować zbytnio tego kodu, z powodu rażąco rażących błędów... Na pierwszy rzut oka delay-e zamiast wszystko oprzeć o przerwanie jakiegoś timera... Po drugie, jakoś tak dziwnie napisany switch?... W książkach każą używać klamer o ładnych kształtach "}" "{" wokół kodu w case o ile jest w nim więcej niż jedna instrukcja... Po trzecie,...
W kodzie jest mnóstwo błędów, ale to, co Ty uważasz za błąd akurat błędem nie jest. Zacznijmy od tego, że prawdopodobnie masz ciągle zgłoszone i nieobsługiwane przerwanie nadajnika, bo zupełnie nie wiadomo po co kazałeś UARTowi wysłać 0. Timer generujący szybkość transmisji jest źle zaprogramowany - pierwszy okres będzie inny, niż następne, a te następne...
Każda aplikacja osadzona na ogół zawiera w sobie zestaw funkcji. I nawet najprostsza, na przykład do regulowania temperatury, obejmuje szereg zadań, takich jak odczytywanie danych wejściowych od użytkownika lub z czujnika temperatury/wejścia ADC, wyświetlanie zasobów na wyświetlaczu LCD i sterowanie wyjściem zarządzającym pracą wentylatora/grzałki itp....
Typ tranzystora jest praktycznie bez znaczenia - dowolny nie za duży pnp. Mylisz częStotliwość przerwń z częstotliwością zegara timera. Zegar ma w tym przypadku częstotliwość 1000000 / 64, a ty dzielisz to timerem przez 254, co daje jakieś marne 64 Hz - sporo za mało, wyświetlacz wibruje jak wściekły. Powinno być ok. 1200 Hz, a minimum 600 Hz. Przy...
Program jest rozbudowany i złożony z kilku plików żródłowych i nagłówkowych ten main był tylko przykładowy. Rozchodzi mi się głównie o procedurę liczenia, tak jak radził kolega wrzuciłem ją w procedurę przerwania [syntax=c] ISR(INT0_vect) // wykryj przerwanie { sreg = SREG;//save global interrupt flag cli(); //disable interrupt czas = TCNT1/192;//zczytaj...
Ja bym to zrobił takim schematem: Zmienna LicznikWcisniec jest domyślnie zerem Pierwszy aktywny sygnał z przycisku (wtedy, gdy LicznikWcisniec jest zerem) ustawia zmienną LicznikWcisniec na jeden, oraz zeruje i włącza jeden z timerów, który ogranicza ramkę czasu do okresu, w którym spodziewamy się czterech kliknięć (praktycznie okolo jednej sekundy)....
mam następujący problem: mam napisaną funkcję w której zastosowana jest kilkukrotnie komenda _delay_ms, następnie w programie musiałem zastosować Timer0 w trybie przepełnienia który jest odpowiedzialny za wyświetlanie(7-seg led) i przyciski, po naciśnięciu przycisku wywoływana jest funkcja zawierająca _delay_ms, co sprawia żę wyświetlanie się rozjeżdża(tzn...
Zmieniony program sterownika. dodałem przerwanie timera a w nim: obsługę klawiszy w przerwaniu co 50ms uaktualnienie zegara oraz synchronizacje z wewnętrznym RTC co godzinę pustą funkcję timerIntervalHalfSec w której proponuję odczytywać stan wejść analogowych, nie na raz tylko po jednym. dodatkowo masz przerobioną funkcję switch reagującą na nacisnięcie...
Teraz trochę inna kwestia. Chcę zrobić zewnętrzne przerwanie, które reaguje na wciśnięcie przycisku i wtedy dopiero ma się uruchomić w nim generowanie tych 2kHz (działa tylko przy wciśniętym switchu, . Częstotliwość jest obecnie generowana non-stop, tak jak kolega wspomniał nie potrzebne są przerwania. Tylko jak teraz do tego napisać w/w przerwanie...
Potrzebuję zliczać godziny i nie musi być do dokładnie. Jeśli zamiast godziny, będę miał godzinę i minutę, albo 59 minut, to nic się nie stanie. Mam już uruchomiony jeden timer do multipleksowania: ISR(TIMER2_COMP_vect) Jak dodać drugi, żeby się to nie gryzło? Po wyzwoleniu przerwania zewnętrznego przez switch, zamiast temperatury wyświetlić się ma...
I kolejny krok do przodu :) Kondensator 100nF na pinie kwarcu zapewne wpływa bardzo na częstotliwość pracy timera2, ale tego jesteś świadomy. Należy więc najpierw rozwiązań problem niestartowania Timer2, by pozbyć się kondensatora i palucha :) Tutaj funkcja projektu który niebawem opublikuję: [syntax=c]void dd_timer2_rtc_ini(void){ //Funkcja inicjująca...
Podziałam dzisiaj wieczorem i dam znać co z tego wyszło. Kod do analizy/weryfikacji poniżej: /* * Atmeta4808_PomiarSily.c * * Created: 24.02.2025 23:00:58 * Author : Waldek */ #define F_CPU 20000000UL // wewnętrzny kwarc 20Mhz #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> #include <util/atomic.h>...
Witam sprawdź ten kod co prawda są inne numery portów i inny procek ale jak zmienisz powinno działać. Problem jest jeden w momencie jak naciskasz przycisk i zmieniasz końcówkę na WYJŚCIE to stan tego pinu Musi być (0) Niski , żeby nie zrobić zwarcia. '$sim $regfile = "attiny2313.dat" $crystal = 11059200 $baud = 9600 enable interrupts 'włącz...
Piszę program, do czasowego wyzwalania migawki: Na pokładzie mam attiny13, tact-switcha, oraz diodę led i transoptor. Układ ma wysyłać impuls ok 300ms co określony czas. Czas ustawia się poprzez wciskanie przycisku - jedno wciśnięcie = 0.5s więcej. Dłuższe przyciśnięcie (pow. 3s) powoduje ustawienie minimalnego czasu(0.5s). Problem jest taki, że im...
Wow, zadziałało. Tzn, diody się palą takim światłem jak powinny, i kolejno zapalają się i gaszą co trochę więcej niż sekundę. Siedzę i się szczerzę do tych diod jak mysz do sera :D Ale mam jeszcze kilka pytań: volatile _Bool utflag = 0; while(1) { if (utflag) { utflag = 0; ( . . . ) ISR(TIMER0_COMPA_vect) { static uint16_t utimer = 0; ( . . . ) if (++...
Witam, Pisze kod do projektu termometr na czujniku LM35 i Atmega8. Wartości zmierzonego napięcia z czujnika zapisuję w zmiennych TEMP oraz DZIESIATKI i JEDNOSCI. Mój problem polega na tym, że nie wiem jak mam zadeklarowac zmienne DZIESIATKI i JEDNOSCI aby mozna było te wartości przekazywać do obsługi przerwania ISR(TIMER0_OVF_vect) w którym chcę wyświetlać...
https://obrazki.elektroda.pl/5718944600_... Przedstawiam efekty mojej próby zmierzenia się z tematem sterowania bramą garażową. Taka potrzeba pojawiła się po awarii oryginalnej elektroniki napędu. Zamiast kupować następną identyczną płytkę sterującą (która znowu padnie po jakimś czasie), można przecież zrobić swoją, prostszą, i potem...
Wybacz, spiszy mi sie i wyskakuja mi literówki, miałem na mysli switch. Jutro wykombinuje jakieś opóźnienie, tymczasem dziękuje za udzieloną pomoc. Wydaje mi sie ze jestem coraz blizej sukcesu, brakuje mi tylko wiedzy jak włączyc timer w trybie CTC :P
Dziękuję za odpowiedź. Oczywiście o volatile pamiętałem, a cały środek przerwania w C mam już napisany tylko tutaj nie wrzucałem. Problem z dziwnym działaniem programu już rozwiązałem. Okazało się, że przyczyną nie był timer tylko brak dodania break w pętli switch. Tak banalna rzecz, że aż mi głupio :D W każdym razie dziękuję za pomoc. Dodano po 2 Pozwolę...
Chodzi o to, że przerwanie powinno tylko być małym produktorem (lub konsumentem) informacji, i popychać/czytac te informacje z/do jakiegoś bufora (kołowego lub nie), a interpretacja/składanie danych z bufora powinna byc w petli głównej . Doszczętne przetwarzanie danych w samym przerwaniu to śmierć kliniczna procesora. Mam rozne kody do obsługi różnych...
Pierwsze, to nie możesz kuglować włączaniem i wyłączaniem przerwań. Silnik musisz zatrzymywać w inny sposób. z stepCounter zrób tablicę stepCounter[4]; Przerwanie zmodyfikuj mniej więcej tak [syntax=c] ISR(TIMER0_COMP_vect) //funkcja obsługi przerwania { for(char l=0; l<4; x++) { // lepiej for(char l=0; l<LSILNIKOW; x++) // i zrobić #define LSILNIKOW...
Jestem elektronikiem i jest to na tyle prosty układ, że obyło się bez schematu. Na ten czas wyglada to tak: [syntax=c] ////////////////////////////////////////... // Alarm otwartych drzwi // Wywolanie przerwania z magnetu INT0 // Regulacja dip-switch czasu bez pikania (5s, 15s, 30s...) // Taktowany...
Witam. Widze, ze wielu fachowcow juz sie podejmowalo tlumaczenia, ale jakos bez rezultatu. Po wciśnięciu jednego z przycisków, uC ma "wpadać" w nieskończoną pętlę. ... chciałbym zmieniać tryb pracy mojego uC bez względu w jaką pętlę wpadł ... ... Dwa switche będą wykonywały dwie różne od siebie nieskończone pętle, które będą trwały do momentu odłączenia...
Naprawdę smutne, zbyt wiele kłopotów dla niektórych ściemniaczy. Wracam więc do home depot. Czy ktoś wie, dlaczego używają dodatkowego esp lub pochodnej 8051 do implementacji funkcji ściemniacza? Czy ESP (może też tuya) nie ma wystarczających możliwości (przestrzeń, przerwania, timery) itp. Aby łatwo zaimplementować ściemnianie? Mój 3-drożny ściemniacz...
zrobiłem pomiar ADC na 2 kanałach a wynik wyświetlam na LCD mam ale problem z tym że adc jest 10 bitowy i gdy chce wyświetlić wynik licząć na to że bedzie od 0 do 1023 okazuje sie że wyświetlą jakies brednie powyżej 4200 ... nie rozumie czemu. jezeli wyswietle sobie wynik tylko z ADCH ( rejest 8 bitowy 0-255) to pokazuje poprawie od 0 do 255 na lcd...
Hej, z ciekawości zajrzałem do kodu nadajnika i wydaje mi się, że znalazłem małego robaka. Otóż, uruchomiłeś przerwanie zewnętrzne dla zmiany stanu wejść PCINTx celem wybudzenia kontrolera z trybu uśpienia, a konkretnie z głębokiego trybu Power Down. Jednak w kodzie brak jest procedury obsługującej to przerwanie. Wystarczy że pod adresem wektora przerwania...
Witam ,napisałem sobie następujący program który ma pełnić funkcję prowizorycznego zegarka. W obsłudze przerwania timer inkrementuję sobie sekundy , ale gdy chce wyświetlić je w main ciągle wyświetla zero na led. Natomiast gdy ostatnią linijkę kodu zamieszczę w obsłudze przerwania działa ok . W związku z tym moje pytanie jak zrobić, żeby przekazywać...
Próbowałem ustawiłem tam np wyświetlenie częstotliwości z funkcji przelicz i działa. Z moich obserwacji i testów wynika że przed wysłanie ramki częstotliwości układ przyjmuje wszystkie dane a po odebraniu częstotliwości i wyświetleniu jej na LCD już nie przyjmuje. Dodano po 1 Kolejne spostrzeżenie - po wykonaniu metody ustaw_timer() przerwanie USART_RXC_vect...
Niekoniecznie "hardkorem", jak dzisiaj sobie złożyłem i napisałem dla zabawy prosty termometr elektroniczny na ATmega48, multipleksowanych wyświetlaczach 7-segmentowych i czujniku LM35 (timery, ADC, przerwania), spojrzałem w kod, to z "wysokopoziomowych" rzeczy miałem trzy zmienne modyfikowane w sumie w czterech miejscach, kilka #define, jedną instrukcję...
Ok trochę poprawiłem, na coś takiego: [syntax=c]#define F_CPU 8000000L #include <avr/io.h> #include <avr/interrupt.h> //***********************Zmienne Globalne**************************// char Dioda = 1; //************************Funkcja Główna***************************// int main(void) { //*******************Ustawienia Portów*************************//...
Witam. Otóż mam taki problem ;) Dwa czujniki DS18b20 podłączone są do osobnych pinów Atmegi168, PINB0, PINB1. Chciałem to zrobić w ten sposób aby w przerwaniu ustawiana była flaga (co sekundę) która realizowana była w pętli głównej while(1), w ten sposób, aby co sekundę na zmianę wykonywany został convert oraz odczyt. Wydaje mi się, że wszystko zrobiłem...
Witam. Kłopot mam następujacy... walczylem dziś z modelarskim servo. Znalazłem program "gotowca" na AVRFreaks. kod poniżej: #include <stdio.h> #include <avr/io.h> #include <avr/interrupt.h> /**************** Globale variable **************/ static enum {av1,paa1} servo1=paa1; static enum {av2,paa2} servo2=av2; unsigned...
Witam. Potrzebuję pomocy z dostosowaniem kodu napisanego na atmegę8 na attiny13. Domyślam się że największym problemem będą tutaj timery, ale jestem w ich temacie puki co zielony, a potrzebuję koniecznie(i niestety pilnie) odbiornika IR który zmieści się i będzie działał na attiny13. Jak całość kodu działa rozumiem(jest świetnie opisana komentarzami)...
Witajcie!! Mam taki problem: ponizej załączam mój plik źródłowy main.c , programik jest prosty, zawiera dwa przerwania jedno od timera 0 (przerwanie na narastajace zbocze CAP0.0 pin P0.2) drugie przerwanie to przerwanie zewnetrzne od przycisku (przerwanie na narastajace zbocze). Do pinu P0.2 dołączam przebieg prostokątny o częstotliwości okolo 80Hz...
Nie no tak myślałem że może przerwanie zewnętrzne i od timera na raz mogło by coś mieszać, ale raczej nie. Mam inny problem, bo układ to enkoder MHK40 i wyświetlacz siedmiosegmentowy, i program wygląda następująco: http://obrazki.elektroda.pl/8963329200_1... Czy da się coś zrobić aby to poprawnie działało?
Nie ma jeszcze sterownika RF Recv. Musimy to wkrótce dodać. Zasadniczo potrzebujemy sterownika dla pojedynczego GPIO, który będzie miał podłączony odbiornik RF i będzie mógł drukować otrzymane kody? A potem możemy odwzorować te kody na zdarzenia, takie jak IR? Hmmm, wygląda na to, że Tasmota używa do tego biblioteki RC-Switch: https://github.com/sui77/rc-switch/...
Witam mam dość dziwny problem z przerwaniami w tym procesorze. Jestem jeszcze zielony jeśli chodzi o przerwania i dlatego będę wdzięczny za każdą pomoc. otóż problem pojawia się z takim kodem: #include "lpc213x.h" #include "clcddisp.h" #include "armint.h" CLcdDisp cout;//utworzenie obiektu klasy do wyswietlania void IrqTimerHandler(void)...
Cześć, Platforma: STM32F769I-DISCO OS: FreeRTOS Środowisko: System Workbench for STM32 Próbuję zaimplementować PTP na podanej platformie, jednak od dłuższego czasu męczę się z regularnie pojawiającym się Hard Faultem. Jak zdołałem wybadać, błąd pojawia się prawdopodobnie, gdy upłynie czas jednego z timerów programowych, które są tworzone. Tworzonych...
Ten program jest taki, że nie wiadomo od czego zacząć poprawiać. Najlepiej byłoby go napisać od nowa :D Niemniej poprawiłem to co ewidentnie musiało być poprawione. Tak na marginesie to nie wiem co za magik wymyślił te ponowne włączanie przerwań w obsłudze przerwania po to tylko by odebrać kod RC5 w przerwaniu. Ludzie to małpują i kłopoty gotowe. Sprawdź...
Witam, W mikrokontrolerze AtMega16 mam do portu PC.3 podlaczony przycisk, chcialbym od niego odebrac przerwanie. Jednak nie wiem jak ustawić rejestr maski TIMSK? Mam taki przykaldowy programik: #include <avr/io.h> #include <avr/interrupt.h> #include <avr/signal.h> #define D1_ON PORTC &= 0x02 //0xBF #define D2_ON PORTC &= 0x03...
Witam. Podepnę się pod temat. Kolega "sulfur" mógłby podać link do tematu? Chciałbym zliczyć ilość obrotów na minutę ( max 250 ). Są 2 wyjścia. - Jedno, to zliczanie impulsów przez zewnętrzne przerwanie oraz obróbka w programie na rpm. - Drugie to zliczanie czasu między impulsami przez timer oraz obróbka w programie. Impulsy będą generowane przez zwieranie...
1. W silniku krokowym normalnie sterowanym zawsze pracują dwa uzwojenia - teraz w Twoim kodzie z grubsza tak jest. Gorzej, że u Ciebie pracują chwilami trzy uzwojenia, w tym dwa naprzeciw sobie - bo najpierw załączasz nowe, a potem wyłączasz stare. 2. Zastanów się, cz zmienna kr może mieć równocześnie dwie różne wartości -Twój kod jest napisany tak,...
Już lepiej w każdym przerwaniu z timera sprawdzaj czy jest coś do wysłania na LCD (np. globalna flaga odświeżania ekranu) i cykaj po 1 znaku co 1ms. Dla małych LCD (4x20) uzyskasz odświeżanie ekranu co <100ms i będzie ok. Po wywołaniu np. LCD_Clear, w tym samym przerwaniu, odliczasz 4 kolejne wywołania i przechodzisz do przesyłania znaków. Proste,...
Witam. wcześniej w mikrokontrolerach avr korzystałem z assemblera (co pomogło mi dobrze poznać ukłądy "od środka"). Jednak nadszedł czas aby skorzystać z dobrodziejstw języka C (w tym języku pisałem wcześniej programy komputerowe). schody zaczęły się już na początku. po napisaniu kolejnych fragmentów kodu uruchamiałem symulator żeby zobaczyć czy poprawnie...
Brakuje mi tylko jedenej rzeczy. W jaki sposób mam wykrywać, że nadeszły jakieś dane z I2C i ile ich nadeszło? Próbowałem tak, że po prostu w przerwaniu I2C przypisuję jakiejś zmiennej wartość TWI_bufPtr. I w przerwaniu timera sprawdzam, gdy ta zmienna (w moim przypadku received_len) jest różna od 0 to wywołuję funkcje TWI_Get_Data_From_Transceiver(rec_data,....
Witam; jestem początkującym, więc proszę nie śmiejcie się z pytania. Ale ledwo co w miarę dobrze zrozumiałem pojęcie wskaźników i zaczełem je używać a teraz chciałbym zrozumieć wskaźniki na funkcję. Tyle tylko, że kompletnie nie mogę zrozumieć ich sensu, do czego służą, kiedy się przydają. Czy mógłby któryś kolega podać mi jakiś uproszczony przykład...
Chciałbym na timerze0 zrealizować ciągły odczyt czterech niezależnych liczników w trybie obsługi przerwań za pomoca kanałow porównująch, MR0, MR1, MR2, MR3. Timer1 jest zajęty. Czasy to 100 msec, 60 sekund , 100 sekund oraz dowolny inny. tick dla timera0 wybrałem na 1 msec. Licznik działa poprawnie bez włączenia przerwań od timera0, liczy te 1000 Hz....
Witam Otóż mam taki dylemat ... Mam taki prosty programik robiący mi za licznik modulo 8. Samo liczenie odbywa się w przerwaniu timer'a ale to nie jest kwestia którą chce poruszyć. Po wywołaniu zewnętrznego przerwania, nie da się go przez czas paru/parunastu sekund wywołać. Czego to może być wina ? (pomijając że moja). Czy przypadkiem nie powinno to...
Dzięki za informację. Udało mi się zrobić multipleksowanie w ten sposób: Timer 1 w tryb CTC, tryb porównania W main dodałem TCCR1B |= (1 << WGM12); // Ustawia timer1 w tryb CTC OCR1A = 10000; // Ustawia wartość pożądaną na 100Hz dla preskalera 1 TCCR1B |= (1 << CS10); // Ustawia timer z preskalerem Fcpu/1 //TCCR1B |= (1...
Witam. Mam problem z przetwornikiem A/C w ATmega16. Chciałem aby wyniki były wyświetlane tylko w momencie kiedy wartość w timerze 0 zrówna się z wartością w OCR0 - ale tylko co drugi raz. Dlatego też dałem switch(cykl). Wyjście OC1A jest podpięte do wejścia timera 0. Wiem że to dziwnie, ale jest to część większego programu i tak musi być. Pomiar napięcia...
Umieść obsługę przycisków w przerwaniu timera. Pomogło. Tzn. nie do końca ponieważ nie mam możliwości uruchomienia sygnałów PWM jeżeli timer nie pracuje (czyli f wcześniej nie jest zadeklarowane na 10, 20, 30, 40 lub 50) - wtedy nie działa obsługa przycisku znajdująca się w przerwaniu. A jeśli ustawisz na stałe 10 lub 30? Ostatnio mam problemy z jasnowidzeniem...
Witam! (Dobry wieczór?) Przeczesałem "cały internet" i znalazłem wiele rozwiązań mojego problemu, ale żadne spośród tych, które zastosowałem nie przyniosło oczekiwanych rezultatów. A problem - może się wydawać - jest banalny, gdyż chodzi o obsługę zewnętrznego przerwania ze zwykłego tact switcha. Mikrokontroler steruje za pomocą PWM jasnością diody....
Zaznaczyłem breakpoint na linijce: Dodano po 2 Czy w ogóle jest możliwe zdebugowanie programu (kodu źródłowego) z podłączonymi urządzeniami peryferynymi (np. przełączniki) do płytki LPCXpresso w taki sposób, aby móc obserwować reakcję programu w zależności od włąśne położenia przełączników (wchodzenie w warunki "if", wartości zmiennych zależących od...
Cześć, po analizie działania enkodera obrotowego (mechanicznego) i ilości problemów, jakie on dostarcza, postanowiłem skonstruować prosty układ elektroniczny, który "wygładzi" impulsy enkodera. Układ posiada dwie wersje. Obie są na przerzutnikach Schmitta. Pierwszy na pojedynczych układach TI SN74LVC1G17: https://obrazki.elektroda.pl/5101546100_...
Witam od dobrych paru dni męczę się z wyświetleniem temperatury na wyświetlaczu 7-segmentowym. Sam wyświetlacz działa bez najmniejszych zarzutów :[syntax=c] #include<avr/io.h> #include<util/delay.h> #include<avr/interrupt.h> #define wyjA (1<<PB0) #define wyjB (1<<PB1) #define wyjC (1<<PB2) uint8_t tab[]={0x40,0xf9,0x24,0x30,0x19,0x12,0x0...
Witam. Kilka dni temu popełniłem takie "ustrojstwo". Zrobiłem to tak(jestem straszny marnotrawca miejsca i timerow): -robię zmienne dla każdego kanału (kanały 1-3) -dla każdego kanału timer(mówiłem że jestem marnotrawca) petla glowna: -instrukcja switch a w niej zal/wyl timerow oraz zal/wyl kanałów po uprzednim porównaniu wartości odczytanych i zadanych...
Witam Potrzebuje program na mikrokontroler Attiny 13 który po wciśnięciu przycisku załączy przekaźnik na 7 godzin. Nie potrafie go sam napisać a jest mi bardzo potrzebny. Pozdrawiam Sprawdź ten program, nie sprawdzałem nie mam Attiny13. [syntax=basic4gl]'Timer 7godzin $regfile = "attiny13.dat" $crystal = 128000 'ustawić w Fuse Bitach 'wyłączyć bit...
Napisałem program (po części korzystając z podobnego programu kolegi) zmieniający natężenie lampy bezdotykowo. Idea jest następująca: jeśli w pewnej odległości od czujnika (koło 10cm) umieścimy rękę ma załączyć się timer odliczający 2s, po których ma zmienić się natężenie światła. Gdy natężenie osiągnie maksymalny stopień ma wrócić do pierwszego. Sterowanie...
Napisz to od nowa, z tablicami i bez żadnych switch ani if. Nie używaj delay. Po prostu zapisz w tablicy dane do wyświetlenia w kolejnych krokach. Dlaczego deklarujesz dane o małych zakresach jako int? W Twoim kodzie zaświecanie kolejnych diod nie następuje równocześnie. Po zaświeceniu ostatniej czekasz podobno 5us i zaczynasz gasić. Po co? Zgasić i...
Witam mam problem z uruchomieniem Timera 2, chcę go wykorzystać do wyświetlenia cyfr na 4 wyświetlaczach 7 segmentowych. Timer0 jako licznik czasu sprawuje się. Jest taki myk, że jeśli zrobię Timer2Init(); po Timer0Init(); to gra drugi timer a 0 stoi. [syntax=c] #include <avr/io.h> #include <avr/interrupt.h> #include <avr/pgmspace.h>...
Atmega 32, program obsługujący klawiaturę - 4 przyciski, odczytywane co 20 ms ( co któreś przerwanie timera 1), przyciski podpięte pod PC), PC0,PC1,PC2,PC3. jeżeli w programie wykorzystuję PC0 i PC1 to jest ok , ale jeśli w pętli obsługi przerwania odczytującego klawiaturę sprawdzam stan przycisków PC2 i PC3 to zgłoszenia przerwania są w każdym odczycie...
Witam. Przymierzam się do budowy regulatora modelarskiego i mam problem ze zliczaniem długości trwania impulsu. Impuls trwa zazwyczaj od 1ms do 2ms w stanie wysokim (wyzwalany przerwaniem INT0) FCPU = 1 MHz (8MHz z preskalerem 8 (bit 7 ustawiony)) Licząc, że jeden impuls trwa dokładnie 1 us i przy timerze zliczającym do 10 (startuje od 246 - Timer0)...
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);...
Witam. Mam drobny problem i nie wiem jak go ugryźć. Atmega32 kwarc 16mhz W przerwaniu odczytuję klawiaturę ps2 i w między czasie robię wyświetlanie na matrycy w Timerze z preskalerem 64. I jeszcze mam uruchomione PWM. Jesli wyświetlanie zrobie w pętli głównej i wyłaczę timer to klawiatura czyta się prawidłowo ale jeśli uruchomię timer to wówczas czyta...
Niestety dalej nie działa :/ Dalej jest efekt echa. Pomrugują następne kolumny. Idzie to wyelyminować, ale trzeba idealnei zgrać timery ten od zmiany kolumn i ten od przesowania. W timerach jest tylko ustawiana jedna zmianna typu bit więc podprogram przerwania wykonuje się bardzo szybko. Elektronika jest ok bo jak podreguluje się te timery to niby idzie...
Wrzucam moją wersję programu do obsługi 4 serw. W ostatnim tygodniu zakupiłem swoje pierwsze dwa serwa, więc mogłem się pobawić problemem ich sterowania. Z powodu, że mam tylko dwa, jedynie dwa kanały są sterowane z przetworników ADC. Pozostałe są obsługiwane przez przerwania, ale nie ustawiane. Wartości dla serw wpisuje się w tablicy serwa_val[]. Doświadczalnie...
Tak samo jak można robić "równocześnie" wiele rzeczy na uC, z punktu widzenia człowieka - odczytywać czujniki, przyciski, wyświetlać dane na ekranie, tak samo można realizować dwie pętle for. W komputerach mamy to na co dzień, przydziałem mocy obliczeniowej do wszystkiego zajmuje się system operacyjny, już od czasów jednordzeniowych 486 nie ma problemu...
http://obrazki.elektroda.pl/9838687700_1... Trochę z obawą prezentuję kolejny już na elektrodzie sterownik oświetlenia, no bo ileż tego już tutaj było? A jednak nie znalazłem rozwiązania mnie zadowalającego, dlatego też powstał niżej prezentowany układ, powstał ponieważ klasyczne lampy z czujnikami ruchu mają pewną zasadniczą wadę:...
timer switch atmega32 przerwania timer stm32 przerwania timer
puknięcie pomaga philips naklejka czyszczenie zbiornika
flash extractor flash extractor
Kod błędu DF226 w Renault Master - przyczyny i rozwiązania Schemat triaka do silnika jednofazowego 300W