ad 1. Odpowiedzią jest bit FOC1A, którego ustawienie wymusza zajście zdarzenia compare, a więc jedna dioda jest o jedno zdarzenie do przodu. ad 2. Jeśli dioda przez 1s jest włączona, a przez 1 s wyłączona, to okres wynosi 2s, a więc częstotliwość jest równa 0,5 Hz.
A po co włączasz przerwania skoro nie napisałeś procedur ich obsługi? I dlaczego najpierw ładujesz część młodszą do OCR a potem starszą, a nie na odwrót jak to zalecają? I dlaczego dziwisz się, że kod potem nie działa?
... Dlaczego tak się dzieje? :/ Dlatego, że przerwanie ISR(TIMER1_COMPA_vect) jest wywoływane co 128 taktów zegara, a wykonanie procedury przerwania timera1 zajmuje ~200 taktów. Po zakończeniu wykonywania przerwania od timera, gdy uC wraca do programu głównego, ma już ustawioną flagę od OCR1 i ewentualnie flagę RXC. Ponieważ timer "stoi wyżej" w hierarchii...
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);...
Witam, mam problem z ustawieniem przerwania od timera0 na atmega8, jestem początkujący jeśli chodzi o assembler... Problem leży w tym że, uP jest taktowany z wewnętrznego zegara 1MHz, i jeśli mam ustawiony prescaler na 8 czyli rejestr TCCR0 na 2 to powinienem otrzymać obsługę przerwania co 8us a na oscyloskopie otrzymałem igiełkę co 2ms;/ nie wiem co...
Np. po to, żeby można było wyzwalać konwersję w jakiś czas od zbocza przebiegu PWM. Do tego służą timery wielokanałowe.
Jakiej wersji kompilatora używasz? Get RC5 domyślnie używa timera0 a Atmega8 to nie to samo co Atmega88 i timery są inne, inne rejestry sterujace. Zobacz do noty np. Timer/Counter Control Register TCCR0 w ATMega8 steruje preskalerem a w ATMega88 TCCR0B Timer/Counter Control Register B, dwa różne rejestry inne adresy, różne też są flagi zdarzeń timerów...
Czekaj chwilę, bo ja się już pogubiłem. Ty mówisz o pinach fizycznych czy cyfrowych? Chyba o cyfrowych (tych z komentarzy w kodzie) - wtedy wszystko pasuje. Piny cyfrowe 9 i 11 są wyjściami timerów odpowiednio pierwszego i drugiego. Z tym, że timera drugiego Atmega8 nie posiada... Tak czy inaczej, w tym wypadku nie możesz zamienić pinów jak Ci się podoba....
Co mogę na to zaradzić? Całość wykonuję w pętli while. Odpowiedź jest banalna - napisać ten kod porządnie. Przede wszystkim multipleksowanie zawsze robi się w oparciu o timer i przerwania. Nigdy nie robi się tego w pętli. Druga kwestia - obsługa DS18x20 przez bit-banging to nieporozumienie. Tak pisze się kod na szybko, w praktyce, o czym właśnie się...
Witam, bardzo proszę o pomoc. Zrobiłem układ na Atmega32 z podłączonymi diodami do całego PortuA, oraz do PortuB Pin2 (PB2) dekoder podczerwieni TSOP31236 (testowałem też na TSOP31238). Wykorzystać chciałem bibliotekę IRMP https://obrazki.elektroda.pl/6945425800_... a w załączniku spakowany cały projekt z plikami biblioteki irmp.
Albo ustawić 16 bitowy timer i w przerwaniu od jego przepełnienia zmieniać stan diody. Do tego super urządzenie pomiarowe jakim jest stoper w telefonie i już kontrola na wysokim poziomie :)
Hmm. Niektóre zagadnienia można rozwiązać na wiele sposobów. W przypadku mojego przykładu pin INT układu PCF można podłączyć do dowolnego pinu uC. W przypadku Twojego rozwiązania trzeba się podłączyć do INT0 albo INT1 i z samego opisu wynika że takich punktów w tym uC jest tylko dwa. Co jeśli komuś komplikuje to układ? Można by rozważyć ocję zmiany...
Wystarczy że dasz sobie spokój ze sprzętowym PWMx6 a zrobisz programowy PWMx6 albo nawet PWMx10 a wtedy będziesz miał wolny timer dla Getrc5 z drugiej strony może się okazać, że Bascomowe Getrc5 będzie ci co nieco zakłócać pracę programowego PWM'a Więc albo weźmiesz procka, który ma więcej PWMów sprzętowych (co może być mocno bez sensu) albo co będzie...
Oczywiście że się da. Za pomocą ATMegi genetujesz kilkumilisekundowy impuls o częstotliwości ze 40kHz. Uruchamiasz jakiś Timer czy coś, i czekasz na echo. Potem juz tylko skalowanie i masz wynik. Jest dużo o tym na elektrodzie.
Sprawdzając stan tego pinu w przerwaniu, niestety z wykorzystaniem timera. Tylko po co skoro Pin Change jest dostępny w każdym trybie uśpienia a timer praktycznie w żadnym. :arrow: seradam, uruchamiasz przerwanie od Pin Change - poprzez wpis do PCICR =&B00000111 usypiasz układ i czekasz na zgłoszenie przerwania od PCIFR.
W takim razie: w jak sposób i w którym miejscu następuje podłączenie głównego pliku irmp.c z poziomu irmp.h? W źródłach IRMP są przykłady jak używać z konkretną rodziną procków. irmp_get_data Powyższy plik mógłby być po prostu bazą dla twoich funkcji. Najważniejsze oczywiście jest to, że irmp.c musi być poddane kompilacji a potem linkowaniu. W tej...
Witam, Mam problem z timerem1 - timer pracuje w trybie CTC (4), wartość wpisywana do rejestru OCR1A jest wcześniej odczytywana z przetwornika ADC (potencjometr). Problem występuje podczas zmiany tej wartości - timer tak jakby się przycinał (ale tylko czasami) - nie zgłasza przerwania przez pewną chwile, żeby zaraz zacząć normalnie pracować. Np. po takiej...
No niby to nie błąd rzeczywiście, ale stanowczo odradzam tego typu zabiegi, tak tworzy sie kiepski i nie czytelny kod, do pełni szczęścia brakuje jeszcze tylko "GOTO". Ja z kolei stanowczo zachęcam do zapoznania się z tym plikiem nagłówkowym i przemyślenia, kiedy takie zabiegi są konieczne. W pokazanym akurat przypadku taka potrzeba nie zachodzi, bo...
Witam. Podepnę się do wątku gdyż także buduję obrotomierz.Jednak moja metoda pomiaru opiera się troszkę na innej metodzie . U mnie atmega88 z zegarem 20MHz mierzy okres pomiędzy impulsami z układu wejściowego a następnie wylicza prędkość obrotową . I tak np:przy 30 tyś obr/min timer zliczy 40000 impulsów wzorcowych , następnie wartość odpowiadającą...
Witam Potrzebuję zrobić zegar na ATMEGA8535 i nie mogę uruchomić pracy asynchronicznej. Kwarc zegarkowy podłączony do XTAL1/2. Program wstępny poniżej. Analogiczny program (ze zmianą ASSR.5 = 1) dla ATMEGA88 działa poprawnie. Proszę o pomoc. Pozdrawiam Jacek Program napisany w "BASCOM AVR" [syntax=basic4gl][/syntax] $regfile = "m8535.dat" $crystal =...
Witam Czy ktoś podpowie jak ustawić rejestry ? Jeśli konfiguruje PWM w Bascomie za pomocą Config Timer1... to działa OK Taktowanie 8Mhz, preskaler 1, tryb 8 bitowy PWM ale częstotliwość mam około 16kHz a przy trybie 9 bitowym około 8Khz co jest normalne. Ale jak ustawić PWM tak by częstotliwość była około 12kHz (oczywiście bez zmiany taktowania procka)?...
If Flaga_1s = 1then To tak ma być? Trzeba zacząć oszczędzać- może Timer jednak w innym trybie? Load Timer0 , 250 W trybie przechwytywania czy porównania oszczędzamy instrukcję podstawienia. No i LCD- w bascomie jest jakaś biblioteka obsługi LCD sprawdzająca flagę zajętości LCD- pozwala to trochę oszczędzić czasu. No i może w przerwaniu tylko inkrementować...
Potrzebuje emulator DS18B20 na atmega8 - mam na PC program do odczytu temp i chciałem w tym programie dodac inne parametry ( np wilgotnosc ) ale nie zmieniajac programu - w scrachpadzie bede wisyłał inne dane nie temperature. ( w bajtach temperatury lub bajtach uzytkownika wolnych 2szt) Aktualnie używam "lampomitari" , ale napisalem przeróbke programu...
Chyba coś masz jakiś dziwny datasheet. Tutaj masz link do tego, którego ja używam - [url=www.atmel.com/Images/doc2545.pdf]Li... Od strony 156 masz pełny opis rejestrów dla tego timera. A program spróbuj zmienić tak: [syntax=c]TCCR2A=(1<<COM2A1)|(1<... TCCR2B=(1<<CS20);[/syntax] Po tych zmianach...
Dla kwarcu 4MHz jest to prescaler 64 i początkowa wartość licznika: 193 Dla kwarcu 8MHz prescaler to: 64 i początkowa wartość licznika: 131 To pokazuje kalkulator. Chciałoby się zakrzyknąć : a nie mówiłem :-P Aby wpisać do Timer2 początkową wartość, to używamy poleceń: TCNT2=początkowa_wartosc Timer2= początkowa_wartosc Counter2=początkowa_wartosc...
Trzeba to zrobić na którymś przerwaniu. Pokaż kod. Dodano po 42 Może da się wcisnąć to do trzeciego timera.
Witam. Można np. tak :) 6 x Pwm Config Timer0 = Pwm , Prescale = 1 , Pwm = On , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down Config Timer1 = Pwm , Pwm = 8 , Prescale = 1 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down 'Konfiguracja Timera Config Timer2 = Pwm , Prescale = 1 , Pwm = On , Compare A Pwm = Clear Down , Compare B Pwm...
Jeżeli nie używasz przerwań to ich nie włączasz. Wprawdzie nie włączasz głównego, ale włączasz od timera (TIMSK1), dlaczego? Wzór z dokumentacji dla CTC: F = Fclk / (2 * N * (1+OCR1A)) = 16000 / ( 2 * 8 * 2000 ) = 16000 / 32000 = 0.5Hz Sterowanie pinem OC1A dla CTC: [syntax=c]TCCR1A = 1<<COM1A0[/syntax] .
Jak w temacie, zlecę napisanie programu w c dla AVR Atmega88. Ma to być prosty timer z dwoma wejściami które wyłączają przekaźnik po określonym czasie. Więcej info na PW.
Ale BlueDarco, IMHO można dać między procesor mały układ FPGA (np. LATTICE MachXO2-256) i zrobić tam wielokanałową sprzętową eliminację drgań styków ;) Mimo to czasem niestety programowa eliminacja nie ma sensu - np. jeśli enkoder podpinamy bezpośrednio do odpowiednio skonfigurowanego timera ;)
#define TIMER_ON_64() TCCR0A|=(1<<CS00)|(1<<CS01); Bity CS00, 01, 02 są w TCCR0B. WGM02 też jest w TCCR0B a WGM00 i 01 w TCCR0A. P.S. W ATmedze88
Nie pokazales czy ustawiasz prawidlowo taktowanie TWI, jaki adres urzadzenia ma twoj PCF, a jaki ty nadajesz, no i co znaczy, ze uklad nie reaguje. W dodatku umieszczanie tego w przerwaniu jest pomyslem takim sobie w tej formie - nadanie start condition, adresu i ew. danych + stop condition trwa wieki w porownaniu z tempem dzialania procesora. Takze...
Witam. Tak na szybko analizując kod: Dla Timer0 włączasz dwa przerwania od porównania: http://obrazki.elektroda.pl/6165324400_1...
Blokuj przerwania w pętli głównej na czas modyfikacji portu (LED2_TOG). Twój timer nie odlicza równo 1/125 s, tylko nie co dłuższe i nierówne odcinki czasu. Do równego odliczania czasu trzeba wykorzystać tryb CTC innego timera.
1. Test sprzętu. Odłącz RS485, i zrób echo w µC do terminala pokazujące co odbiera. Możesz zamiennie podpiąć drugi RS485 ustawiony na nadawanie (w sumie to już będzie RS-422). 2. Zauważone potencjalne problemy programistyczne. Powinieneś także podjąć wstępne załażenie, że transmisja nie jest idealna - odbiór do bufora w przerwaniu i dopiero po...
Cześć. Praktycznie każdy spełni Twoje wymagania, zarówno w prędkości obliczania jak i ilości miejsc po przecinku. Zrobi to spokojnie nawet ATmega8. Przykład możliwości ATmega88 (odpowiednik ATmega8 z minimalną różnicą dot. timerów): http://obrazki.elektroda.pl/8770689300_1... Przy czym jednocześnie zajmuje się generowaniem sygnału wideo,...
Zobacz tu: http://mikrokontrolery.blogspot.com/2011... jeszcze świeże :) Może coś ci to pomoże. Użyj wektora TIMER0_OVF_vect.
POWERSAVE (ATMEGA88) This mode is identical to Power-down, with one exception: If Timer/Counter2 is enabled, it will keep running during sleep. The device can wake up from either Timer Overflow or Output Compare event from Timer/Counter2 if the corresponding Timer/Counter2 interrupt enable bits are set in TIMSK2, and the Global Interrupt Enable bit...
No i mamy całą serię błędów. Po pierwsze - nigdy nie robi się odświeżania inaczej niż w przerwaniu timera. Po drugie - podejrzewam, że pod nazwą "segment" występuje u Ciebie cyfra. Ciekawe, jak nazywasz segmenty. Nie przepisuj kodu na brudno - pokaż, jaki jest naprawdę. W każdym przerwaniu timera należy kolejno: - wyłączyć poprzednią cyfrę (lub wszystkie...
Zobacz to i wyciągnij wnioski [syntax=vbnet]$regfile = "m88pdef.dat" $crystal = 1000000 $hwstack = 40 $swstack = 16 $framesize = 32 '$sim Cursor Off Cls Config Portd.0 = Output Config Timer1 = Timer , Prescale = 8 , Clear Timer = 1 , Compare A = Disconnect , Compare B = Disconnect Compare1a = 62500 On Compare1a Beep Enable Compare1a Enable Interrupts...
Źle zainicjowane wejście INT0. To jak zainicjoweać wejście INT0 dla atmegi 88?
Jeśli bez timerów to zadeklaruj 4 zmienne typu long ( dla odliczania dużych wartości - to będą czasy przerw ) i 4 zmienne typu byte (czas impulsu) zerujesz zmienne przed pętlą . W pętli incrementujesz kolejno te cztery zmienne. sprawdzasz komendą if czy kazda z nich osiągneła założoną wartośc (czas przerwy) . Jeżeli tak to : zerujesz zmienną , incrementujesz...
Generalnie w takich przypadkach nota układu twoim przyjacielem. Poczytaj to co napisałem w komentarzach. [syntax=c]#include <avr/io.h> #include <avr/interrupt.h> int main(void) { uint8_t i = 0; DDRD = 0xff; //TCCR2A |= (1<<WGM21)|(1<<WGM22); // źle ten tryb jest zarezerwowany TCCR2A |= (1<<WGM21) // CTC //TCCR2A |= (1<<CS20)|(1<<CS21)|(1<&l...
Tego nie widziałem. Znalazłem za to informację że dotyczy to rezonatora pracującego jako generator wytwarzający główny sygnał zegarowy: http://obrazki.elektroda.net/9_123515576... A po drugie, akurat w ATMega8 jest błąd w krzemie i te wewnętrzne kondensatory nie działają (tzn. FuseBit ich nie włącza). Użycie rezonatora jako źródła sygnału dla...
Przychodzi Tobie prostokąt o wypełnieniu ok. 1-2ms co kilkadziesiąt ms. Musisz podłączyć ten sygnał pod przerwanie w atmega i timerem mierzyć czas pomiędzy zmianą sygnału z "0" na "1" a zmianą z "1" na "0". Z tej informacji generujesz odpowiednie PWM. PS. Ze względu na to, że nowsze atmegi mają więcej wyjść PWM polecam np. atmega88 zamiast atmega8.
A czy timery, przerwania, komparatory i inne dodatki w procesorze były powyłączane?
U mnie w BASCOMie Timery w ATTiny2313 działają. Ale w ATMega88 nie działają. To zależy od wersji BASCOMa po prostu.
Funkcja wait w Bascom nie jest dokładna i na dobra sprawę nie należy jej stosować do odmierznia czasu. Aby dokładnie odmierzać czs należy posłuzyć się timerami. Jakie dałeś kondensatory do kwarca?
Tak, wybrałem Low Frequency, da sie jakoś ruszyć uC bez tak wolnego kwarcu ? Co masz na myśli 'ruszyc' ? Prawdopodobnie chcesz skorygowac błędnie ustawione fusebity (powrócic do default settings). W zasadzie datasheet mówi o optymalizacji oscylatora processora do 32kHz jako 'Low Freq.' , ale do komunikacji podczas programowania mozesz tu zastosowac...
brakuje instrukcji sei(); włącza ona globalną obsługę przerwań. Umieść ją zaraz przed pętlą while(true) Dodano po 5 a poprawnie jest TIMSK1 = _BV(TOIE1);
Nie napisałeś. Porównaj np. DS od ATMega88 i ATmega8. Możesz budzić timerem co powiedzmy 20ms i sprawdzać, czy klawisz naciśnięty Albert
atmega88 timer atmega88 pomiar atmega88 eeprom
uszkodzona grzałka kuchenki testy akumulatorów stawek impreza
migomat schematy przełącznik krzywkowy spawarka
Citroen C5 1.8 benzyna – dławienie i nierówna praca na zimnym silniku, diagnostyka EW7J4 Indesit – pralka nie pobiera płynu z trzeciej komory szuflady po praniu