Konfiguracja prescalera jest w TCCR0 B a nie TCCR0A.
Jak np mam kilka innych procedur które zabierają dużo czasu. Np pomiar ds18b20 albo wyświetlanie na LCD a chciałbym je wykonywać co pewien ściśle określony czas.
Witaj. 1. Nie znam VMLAB, ale czy prawidłowo definiujesz F_CPU? 2. Czy symulator nie potrzebuje osobnej definicji częstotliwości do prawidłowego określania czasów symulacji? Tak jest w symulatorze w Atmel Studio. 3. Volatile: http://mikrokontrolery.blogspot.com/2011... Posklejałeś ten program z kilku - no ale każdy kiedyś zaczyna...
kolejny temat, na ktory odpowiedzia jest 'volatile' - bylo o tym milion razy. 4\/3!!
// ================= PROCEDURA OBSŁUGI PRZERWANIA COMPARE MATCH ISR(TIMER0_OVF_vect) Błąd. To jest przerwanie od przepełnienia licznika. Przerwanie od porównania to: TIMER0_COMP_vect . W nagrodę Pomógł od mniej spostrzegawczych użytkowników i moderatorów :) A co do tranzystorów, to oczywiście lepsze by były PNP, ale z NPN też będzie działać (trochę...
Dzięki teraz działa wszystko działa
DDRD|=(_BV(PB5) | _BV(PB6) | _BV(PB7)); DDRD|=(_BV(PE3) | _BV(PE4) | _BV(PE5)); Widzisz tu subtelną różnicę...? Działające wstawki dla pwm na Tim1 i Tim2: [syntax=c]void Timer0Init(void) { DDRB|=(1<<4); TCCR0 |= (1<<WGM01)|(1<<WGM00)|(1<... OCR0=0; } void Timer2Init(void) {...
... Ma ktos jakis pomysl dlaczego? Twój program zatrzymuje się na pętli while ... char pomiar(void) { ADCSRA |=0x40; //wykonanie pomiaru while(! (ADCSRA & (1<<ADIF))); return ADCH; } ... by pozostać w niej do ...wyłączenia zasilania :( Pomyśl dlaczego tak się dzieje , gdy włączysz przerwania od ADC...
Witam Serdecznie Na początek kod: [syntax=c]#define F_CPU 4000000UL #include <avr/io.h> #include <avr/iom128.h> #include <util/delay.h> #include <avr/interrupt.h> volatile uint8_t i=0; int main(void) { DDRA = 0xFF; ASSR &= ~(1<<AS0); TCCR0 |= (1<<CS01) | (1<<CS02); TIMSK |= (1<<TOIE0); TCNT0 = 131;...
W jakim środowisku działasz? Jesteś pewny nazwy tego wektora? Nie ma żadnych ostrzeżeń? Bo mnie się tu coś nie zgadza: [syntax=c]ISR(TIMER0_COMPA_vect){}[/synt... Tak chyba powinno być prawidłowo: [syntax=c]/* Timer/Counter0 Compare Match */ #define TIMER0_COMP_vect_num19 #define TIMER0_COMP_vect _VECTOR(19) #define SIG_OUTPUT_COMPARE0 _VECTOR(19)[/syntax]
No fabrycznie nowa Mega128 wychodzi z zegarem 1MHz. Jeśli masz taką nową to przy przestawianiu na 8MHz nie zapomnij wyłączyć JTAG i koniecznie wyłącz bit M103C bo to jest bit który ją "cofa w rozwoju" ahahaha czyli robi kompatybilną ze starszą Atmegą103 i tam jest kilka zmian w rejestrach i sprzęcie przez co program na pewno dobrze działać nie będzie...
2 serwa można zrobić całkowicie sprzętowo TCCR1A = _BV(WGM11); /* Fast PWM, ICR1 is top */ TCCR1B = _BV(WGM13) | _BV(WGM12) /* Fast PWM, ICR1 is top */ | _BV(CS11) /* div 8 clock prescaler */ ; OCR1A = 3000; // to jest chyba dla zegara 16 Mhz - to by odpowiadało impulsom 1.5 ms OCR1B = 3000; ICR1 = clockCyclesPerMicrosecond()*(...
W tym kodzie jest błąd: Load Timer0 = 250 jest niepoprawnie zapisane bascom nie krzyczy błędem ale ta składnia nie działa. Powinno być Load Timer0, 250 Ta funkcja ładuje do timera wartość 256-wartość, czyli w twoim wypadku 6.
Po Config Timer0 wpisz dodatkowo TCCR0 = 4 Config Timer0 = Timer , Prescale = 256 Tccr0 = 4 Tylko musisz coś zrobić z START TIMER0 i STOP TIMER0 bo one przywrócą wartość po CONFIGu i program dalej nie będzie działał. Najprościej będzie usunąć te instrukcje. dodano 20 Sie 2008 08:05 Mail z opisem błędu poszedł już do MCS Electronics. Zbaczymy jaka będzie...
http://mikrokontrolery.blogspot.com/2011... Jest to ten artykuł. Cały kod? On ma ponad 700 linii. Czy oszczędzić czasu i wyciąć konkretne fragmenty i je wrzucić te które mogą zawinić. Typu inicjalizacja timerów itp. Dodano po 3 Ok problem rozwiązany [syntax=cpp]ISR(TIMER0_OVF_vect) { sei(); static uint8_t stan_przyciskow_najstarszy,...
Czy komuś udało się uruchomić prostą obsługę od przepełnienia TIMERA 2 w Atmedze 8. Mi się udało.
[syntax=c]Iuint8_t h, m ,s; char datetime[8]; int main(){ sei(); LCD_Initalize(); twi_init_master(); rtc_init(); TIMSK |= (1 << TOIE0); TCCR0 |= (1 << CS00) | (1 << CS02); while(1){ } return 0; } ISR(TIMER0_OVF_vect) { LCD_WriteText("gg"); rtc_get_time_s(&h, &m, &s); sprintf(datetime, "%02d:%02d:%02d", h, m, s); DDRB =...
Bity CS00 i CS02 od preskalera są w rejestrze TCCR0B, a nie TCCR0A. Masz preskaler na 0 więc timer nie zlicza.
Zmienna count powinna być volatile .
Witam. Tak na szybko analizując kod: Dla Timer0 włączasz dwa przerwania od porównania: http://obrazki.elektroda.pl/6165324400_1...
ATMEGA88 jak i ATMEGA168 ma wewnętrzy preskaler sygnału zegarowego który jest domyślnie włączony. ATMEGA 8 go nie ma.
Istnieje jeszcze jedna możliwość. Jakiego używasz AVR-GCC? Możesz mieć jakąś starszą wersję z błędem, który właśnie objawia się poprzez niepoprawne działanie przerwań COMPARE. Wystarczyłby jeden błąd w adresie wektora TIMER0_COMP_vect i "po zawodach". ps. Nie rzekomo działającego, tylko działającego. Niestety nie mogę ci strumieniowo przesłać video...
A dlaczego tu się czepiasz Timera NUMER JEDEN :?: :-P
No i nie będzie działać. Dwa razy zmieniasz ten sam rejestr(TCCR2A), a używasz tam operatora przypisania:[syntax=c]=[/syntax] zamiast operatora sumy bitowej:[syntax=c]|=[/syntax]więc poprzednia wartość rejestru jest tracona. Edit: W dodatku nie spojrzałeś do datasheetu, w którym jest wyraźnie napisane, że bity CS20,CS21,CS22 należą do rejestru TCCR2B.
Po pierwsze nie podoba mi się zapis: Pinc.1 = not Pinc.1 Powinno być raczej: Portc.1 = Not Portc.1 Albo jak ktoś się bardzo uprze: Portc.1 = Not Pinc.1 Ale ogólnie do rejestru Pinx raczej nie zapisujemy. Ponadto... zegar 4MHz, dzielnik w timerze przez 256, timer0 (8 bitowy) ładowany wartością 250.... to daje podział przez 6*256 = 1536. To częstotliwość...
Programowe generowanie sygnału video w jakimkolwiek standardzie jest zadaniem krytycznym czasowo, dlatego bez asemblera niewiele zwojujesz. Nawet w asemblerze trudno uzyskać więcej niż 100 punktów w linii. Zresztą zerknij na: Rejestrator przebiegów cyfrowych - przystawka do TV z EP Rejestrator przebiegów analogowych - przystawka do TV z EP Nie jest...
TCCR0=0x07; // port G jako wejście Że co? int main(void) { char digit } Funkcja main obejmuje nawiasem kilka funkcji przerwań. To się w ogóle kompiluje? Pół biedy że funkcja main. Pętla while(1) to obejmuje! Po za tym to SIGNAL pozamieniaj na ISR. ISR jest nowsze i przez to zalecane (choć w sumie kodu wynikowego pewnie to nie zmieni). I przy okazji...
Ja to podłączyłem już wczoraj...M644P z rzeczonym kwarcem. http://obrazki.elektroda.pl/3806989300_1...
Jest tu co najmniej kilka błędów. Pierwszy to taki, że funkcja uart_getc nie jest atomowa. W ogóle kolejka jest zrealizowana źle - nie uwzględnia, że odczyty/zapisy następują asynchronicznie, w związku z tym pewne operacje (np. uaktualnienie wskaźników początku i końca) muszą być robione atomowo. Przypadkowo to działa przy zapisie, bo ISR jest wykonywane...
I o to właśnie chodzi - 2 takty na bit, czyli 16 taktów na bajt, reszta funkcji wykonuje się porównywalną ilość czasu, w efekcie za 50% odpowiada samo SPI. Druga rzecz - kompilator ma pewną dowolność w tworzeniu kodu asemblerowego, a to znaczy, że nie jesteś w stanie dokładnie powiedzieć ile ten kod się wykonuje. Dokładniej - jesteś w stanie, ale tylko...
Widzicie gdzieś problem w kodzie? Zobacz rozwinięcie asseblerowe czy na pewno istnieje obsługa:[syntax=c]ISR(TIMER0_OVF_vect)[/... Kompilator AVT-GCC nie sygnalizuje próby stworzenia obsługi wektora, który nie istnieje a o bład łatwo, bo w nazwach wektorów jest "mały" nieład. Możesz tez sprawdzić debugerem. Jeśli przerwanie nie istnieje nie da...
Problem leży w sposobie działania biblioteki TWI_Master i miejsca, skąd jej pośrednio używasz. TIMER0_OVF_vect, jak i każde inne przerwanie, uruchamia się z czasowo wyłączonymi przerwaniami, dlatego ani sonar_request, ani sonar_gets_distance nie zadziała z tego miejsca. Polecenia zostają zakolejkowane, i może tylko TWI::START zostaje wykonany. Możesz:...
Wysyłasz procesor pod przerwanie którego niema. To jak myślisz co biedny procesor ma robi jak tam niema nic. [syntax=c] ISR(TIMER0_COMP_vect) { }[/syntax] To musi być dodane. Resztę zrobi kompilator i przestanie się zawieszać.
Dziękuję kol niveasoft !!! Działa świetnie!! Config Timer0 = Timer , Prescale = 1 , Timliłoer = 34 - chyba to mnie zmyliło bo czytałem że trzeba na 26kHz timer do odbiornika IR ustawić
jak miałem kompatybilność z atmega 103 ustawioną to działało na odwrót Timer 1 działał a 3 nie jak w fusebitach zmieniłem to Timer 3 działa a 1 nie...
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,...
Zakładam że kompilujesz w takim GCC jak ja. Spróbuj tego: #include <avr/io.h> //#include <stdio.h> niepotrzebne, bez tego też działa #include <avr/interrupt.h> //#include <avr/signal.h> tej biblioteki się nie stosuje - patrz gcc-libc ISR(TIMER0_OVF_vect) //po co tam miałeś INT0_vect? { PORTD ^= 0xFF; //będziemy mieli...
Programuję mikrokontroler Atmega 128 w Bascomie i mam problem z ustawieniem tego trybu dla timera3. Posiada on trzy wyjścia na których mogę ustawić PWM, jednak nie potrafię tego zrobić. Ustawiając PWM na timerze 1 wszystko działa. Bascom podświetla PWM1a oraz PWM1b na niebiesko natomiast z PWM1c nic się nie dzieje, tak samo dzieje się z timerem3. Bardzo...
Dzięki za szybką odpowiedź. Pewnie w tym zapewne będzie problem, wieczorem sprawdzę, o zapisie do Timer1 to sobie przypomniałem, nie wiedziałem że odczyt działa odwrotnie. Pozdrawiam
(at)tmf - podejrzewam, że pobór jest całego układu w tym podświetlenia LCD więc może pobierać 0.2A; Hero - czy procek się grzeje? Czy masz watchdog timer wykorzystywany? Czy masz BOD?
No to jest źle podłączony. Powinien być podłączony do pinów TOSC1 i TOSC2. Dlatego zamiast takich tekstów: Kwarc jest podłączony do odpowiednich nóżek i jest sprawny lepiej od razu pokazać schemat :D W Atmega8 XTAL1/2 to te same nóżki co TOSC1/2 (dlatego tam Ci jeszcze działało), w ATMega16 już nie.
Niestety wbudowana w bascoma funkcja do odbioru RC5 może działać tylko na timerze 0 lub 2 (koniecznie musi być to timer 8-bit) lub na timerze 1 (lub 3 - nie wiem czy działa) w trybie ICP. Przejrzyj helpa bascoma pod hasłem Config RC5.
Oczywiście, przeczytaj o module ICP timera. W momencie wystąpienia zdarzenia, licznik timera jest przepisywany do rejestrów ICP. Rozdzielczość jest zależna od częstotliwości taktowania timera. Twoje rozwiązanie nie może prawidłowo działać, bo czas liczysz w pętli, a ta z kolei ma różny czas wykonywania (zakładam, że korzystasz z przerwań).
A change of the COM1x1:0 bits state will have effect at the first compare match after the bits are written. For non-PWM modes, the action can be forced to have immediate effect by using the FOC1x strobe bits. Być może w tym jest problem. OC1A jest prawdopodobnie inicjowane z wartością 0 do momentu wystąpienia pierwszego "compare match". W trybach "set...
Działa. Pewnie o czymś zapomniałeś na wstępie. Mój działający kod: .include "m128def.inc" .cseg .org0x0000 rjmpreset ;skok po resecie systemu .org0x0018 rjmpdata ;skok po wykryciu zgodności reset: ldi r16, high(RAMEND) out SPH, r16 ldi r16, low(RAMEND) out SPL, r16 rcallKONFIGURACJA_TIMER1 sei loop: nop rjmploop ;......
(at)jareklnx Przez ponad 40-lat pracy z elektroniką, uszkodziłem poprzez ESD tylko jeden układ. Atmega 8, układ ogólnie działa. Da się odczytać i zaprogramować, jednak pobiera za duży prąd i się grzeje. Ponieważ pracuje raczej krótko (timer naświetlarki UV do płytek) to nie zmieniałem na nowy.
Witaj, Pobieżnie patrząc na program, wygląda prawidłowo. Może podłącz do jakiegoś pinu LED i zmień: [syntax=c]ISR(TIMER1_COMPA_vect) { PORTTESTOWY ^= (1<<pin_testowy); //zmień stan LED na przeciwny }[/syntax] i sprawdź czy co 1sek się zmienia. Oczywiście ustaw pin jako wyjście.
Tak, przy czym jeśli ISR jest wywoływany co 1ms, to wystarczy po prostu inkrementować zmienną timer0_milis, bez tych cudów, które masz.
Po niewielkich zmianach powinno działać też na Attiny85. Wrzucam kod dla Attiny85 (nie testowany; nie mam jak): [syntax=c]//############################... // SPWM implementation for Attiny85 // Clock frequency 8MHz internal clock oscillator // High Fuse: 0xFF, Low Fuse: 0xE2 // // Signals generated: // - SPWM...
witam, napisałem dwa kody na obsługę i2c master(atmega644p): /* * main.c * * Created on: 16 lut 2018 * Author: Mirosław Kardaś * web: www.atnel.pl */ #include <avr/io.h> #include <avr/interrupt.h> #include <string.h> #include <util/delay.h> #include <avr/wdt.h> #include <avr/pgmspace.h> #include <avr/eeprom.h>...
Witam. Zapis (składnia) Load Timer1 jest zły. Sprawdź w pomocy Bascoma.
Działa cały program. Tak jak pisałem wcześniej problem polegał na tym że program w pętli głównej nie nadążał z odczytem zawartości tabeli danych. W symulatorze działał, nie miałem żadnych skoków przysłowiowe maliny ale na płytce już nie. Myślałem że jest problemem jest program w pętli głównej a konkretnie odczyt danych przez LOOKUP a okazało się że...
A co na to symulacja programu? Taki program wgraj: .nolist .include "m32def.inc" .list ; ## START ########################################... .cseg ;=======================================... ;= WEKTORY PRZERWAŃ = ;=======================================... .org 0x0000 rjmp reset_vector ; po...
Jeśli chodzi o mechanizm przerwań, to wszystko masz ładnie opisane w formacie pdf na stronie Atmela . Wywoływanie przerwania w procedurze obsługi jeszcze innego to porażka. Przerwania są kolejkowane i po powrocie z jednego jest wywoływane drugie, dlatego procedury obsługi powinny być jak najkrótsze (polecam asm ;)). W procedurze timera możesz sobie...
Jak ustawiać preskalery według tabelki z #27 podanej przez excray .Jak wygląda preskaler 32 i 128 jak to się ustawia. W internecie jest taki preskaler , TCCR1B |= (1<<CS12)|(1<<CS10); // preskaler = 1024 Jak czytałem preskalera 32 i 128 nie obsłuży Attiny 2313 i Atmega 8. Co obsłuży wszystkie preskalery podane w tej tabelce. Bo patrzysz...
zobacz na stronę http://www.avrbeginners.net/ Dobrze udokumentowane przykłady i opis dziania AT90S i ATMEGA Timery,UART,rejestry itp.
Czy RTC (zegar czasu rzeczywistego) używający Timera 2 w trybie asunchronicznym , działa nawet wtedy gdy wyłączone sa przerwania globalne ? ... kwarc, preskaler oraz Timer2 nie potrzebuje przerwań ale to nie wystarcza do zrobienia całego RTC to wystarcza do zrobienia przerwania co 1 sekundę a reszta zegara musisz zrobić programowo i to właśnie na przerwaniu...
Może wstaw kondensatory 33p. Mi z 22p nie działało.
Kurdę no przerwanie jest wywoływane co 310us a to jest bardzoooo wiele cykli zegara na to by mogła się wykonać cała pętla while, cały czas nie rozumiem czemu na atmega 16 działa a na atmega128 nie chce działać :/ sprawdzałem bity ustawiające timer i przerwanie, są one takie same dla mega 16 i 128 więc nie wiem w czym jest problem :( Ten program działa...
Timer1 = Wynik tak sie wpisuje daną do timera1 a tak powinno być Wynik = Timer1 teraz Timer1 bedzie wpisywał wartość do zmiennej Wynik bedzie działać
Może się pomyliłem, ale chyba przerywasz sobie odbiór co 2ms. Dlaczego nie użyjesz wyższego preskalera? Np. 1024? Możesz nawet po ustawieniu Flagi wyłączyc Timer i po odbiorze włączyć ;) Timery można dowolnie konfigurować podczas pracy programu. Druga sprawa ustaw sobie odbiór do bufora w tle (Config Serialin = Buffered, Size..)
Wielkie dzięki! O to właśnie chodziło! Pięknie i prosto. Da się, da się no da się odpowiedzieć normalnie? Wszystko działa jak należy piękne dzięki oby więcej takich dobrych ludzi na elektrodzie.
Witam, nie znam się, ale możesz na szybko spróbować na jednym timerze liczącym do 2.5ms z przerwaniem porównania przy wartośći dla serwa gdzie ustawiasz stan niski i przepełnienia, gdzie zmienisz serwo na kolejne, ustawiając wyjście serwa na wysokie i nową wartość porównania. W pętli głównej zmieniasz tylko wartości dla serw. Pewnie słaby sposób, ale...
256 to inna wartość preskalera wybrana w Twojej książce. 250 to wartość porównania dla licznika T0. Licznik T0 jest 8-bitowy, nie da się na nim ustawić 15625. Dla wartości porównania powyżej 256 musisz użyć T1. Idea działania jest taka sama: 8000000Hz/256/250=125Hz 1000000Hz/64/15625=1Hz
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?
No to kawa na ławę. Instrukcja Getrc5 w czasie działania używa jest licznika TIMER0 i związanego z nim przerwania. Licznik ten jest służy do generacji wymaganych opóźnień podczas próbkowania sygnału. TIMER0 może być dalej używany przez program, lecz należy się liczyć z wynikłymi opóźnieniami, gdy wykonywana będzie funkcja GETRC5(). Jest tylko jeden...
Witam mam problem z ustawieniem timera w mojej atmedze. Oto kod: [syntax=c] #include <avr/io.h> #include <avr/pgmspace.h> #include <avr/interrupt.h> #include "LCD/lcd44780.h" volatile int a=1; int main(void) { TCCR1A |= (1<<WGM12); TCCR1B |= (1<<CS12)|(1<<CS10); OCR1AH = (unsigned char) 1800; TIMSK1 |= (1<<OCIE1A);...
Używam Timera1 z Atmega164P w trybie CTC, Atmega ma kwarc 16MHz, interesujący kawałek programu wygląda tak: Konfiguracja Timera: void Timer1_Init(void) { DDRD |= (1<<PD7); // PD7 wyjście PORTD |= (1<<PD7); // PD7 <= 1 TCCR1B = (1<<WGM12)|(1<<C...
To czy ktoś się nauczy czy nie to już indywidualna sprawa każdego z osobna - nie mogę oceniać Twoich umiejętności nie znając Cię... A Bascom, jak sam widzisz, jest naszpikowany błędami. Jedne znikają, inne się pojawiają... Ba, raz nawet program kompilowany w 1.11.9.8 nie działał po kompilacji 2.0.7.6 - trzeba było modyfikować logikę, mimo poprawnej...
A w jakim celu wchodzisz z main do obsługi przerwania? Przecież tak to dziwacznie napisałeś.
Z tym procesorem czy problem konkretnie jest to nie wiem, ale przy wielu procesorach (m. in. m644p, m1280, m2560) na pewno są problemy z tym timerem. Ale do rzeczy, bo cały program nie ma prawa działać... 1. If W1 = 0 And Portb.i = 0 Then A cio to? rozumiem, że tu mają być sprawdzane stany pinów skonfigurowanych jako wejścia? Jeśli tak to czemu masz...
http://obrazki.elektroda.pl/3637756900_1... http://obrazki.elektroda.pl/6313868300_1... Zrealizowałem w tym roku swoje postanowienie jeszcze sprzed zeszłej zimy i zrobiłem sobie wreszcie własny sterownik pieca CO. Na początek pytanie "dlaczego"? Otóż oryginalny dostarczony z piecem przede wszystkim miał 6 poziomów nadmuchu...
Dzięki za odpowiedzi. Zasilacz mam 7.5V 4A od jakiejś drukarki lub skanera. Napisałem prosty program do testów i wyniki mnie zadziwiły. Program najpierw wysyła na wyświetlacz napis "reset" który świeci się przez 1 sek, a potem program wykonywany jest dalej. Zamiast silnika zamocowałem żaróweczkę, aby pobór prądu był mniejszy. Jeżeli zamieszczę:[syntax=cpp]PORTD...
Zastanów się nad swoją pętlą główną. Odczytujesz B (czyli ADC) tyle razy na sekundę ile razy wykona się ta pętla. A tempo jej wykonywania się determinuje szybkość wysyłania znaków przez UART. W efekcie twoje "samplowanie" jest zależne od prędkości UART. Piszę w cudzysłowiu bo prawdziwe samplowanie masz 8kHz, tyle, że samą zmienną B odczytujesz inną...
No jest kretyński :) TIMSK = _BV(TOIE1); // wlacz obsluge przerwan T/C1 TIMSK = _BV(TOIE0); //jw dla T/C2 TIMSK = _BV(TOIE1) ; // wlacz obsluge przerwan T/C1 TIMSK |= _BV(TOIE0); //jw dla T/C2 albo TIMSK = _BV(TOIE1) | _BV(TOIE0) ; ;)
Opczytaj o działaniu operatorów. & to operator iloczynu logicznego, czego się spodziewasz? Ma być PORTC^=0xFF;
odpaliłem dwa timery jeden miał dawać sygnał 20 Hz a drugi miał odświeżać mi wyświetlacz 7 segmentowy 100 Hz i niestety nie działa, zrobiłem dwa różne przerwania... ISR(TIMER1_COMPA_vect) // przerwanie dla porownania { PORTD ^= 0x01; // zapalić/zgasić diode ICR1 = 1000000/(16*(0.0234*ADC + 0.9765)); // oblicza nowy szczyt...
Właśnie o to mi chodzi. Trudno analizować program do odbioru protokołu, którego nie znamy, a komentarze tego nie ułatwiają, a wręcz przeciwnie. Natomiast co do działania rzeczonej instrukcji kompletnie się mylisz. Zerknij do jakiegokolwiek podręcznika C. Ciekawe jest też spostrzeżenie natury ogólnej, a nie tylko Twojego problemu. Większość kodów przewijających...
generalnie nie wczytując się w kod za bardzo, to nie podałeś funkcji main i nie wiadomo co tak w ogóle tam jest. Ogólnie kod działa na przerwaniach - zewnętrznych czujnika i timerów. Co mogę napisać nie widząc funkcji main, to: - podłącz czujnik podczerwieni pod IN1 (PD3), - wywołaj w main rc5_init(); - później włącz przerwania przez sei(); ogólnie...
16 bitowe timery w tym modelu mają trzy rejestry OCRxA/B/C i są dostępne trzy przerwania w trybie CTC nazywające się ISR(TIMER4_COMPA/B/C_vect){ Ale z noty katalogowej wynika że tryb CTC porównuje liczbę zliczeń z wartością zapisaną w OCRxA i tego nie da się zmienić więc jak wykorzystać pozostałe dwie funkcje wywołujące przerwanie (TIMER4_COMPB_vect...
Pojutrze rok szkolny się zacznie to ze szkoły coś wypożyczę, więc nauka pójdzie od przodu, a co może być nie tak, że nadal timer nie działa? Jak zrobiłem tak jak mi tadzik kazał to działał drugi a 0 już nie ;/
A niby czemu ma program skakać do procedury obsługi przerwania od przepełnienia? Przecież on się nie przepełnia, tylko po doliczeniu do wartości OCR lub ICR , natychmiast się zeruję ( przy okazji może ,ale nie musi zmieniać stan pinu OC). Musisz uruchomić przerwanie od tego właśnie porównania - czyli od Compare, tak jak wspomniał kolega wyżej. Tylko...
Teraz zrobiłem tak i wygląda na to, że niby działa. Czy takie coś ma sens działania, czy tylko tak mi się wydaje, że działa: [syntax=c] volatile uint16_t licznik = 0; volatile uint16_t licznik1 = 0; volatile uint16_t licznik2 = 0; volatile uint8_t OCR0; int main(void) { pinMode(2,"OUTPUT"); pinMode(3,"OUTPUT"); sei(); TCCR0|=(1 << CS02)|(1<<CS00);...
Przyczyna jest w tych linijkach Trzeba też pamiętać, że jeżeli zdefiniujemy tablicę n elementową i spróbujemy zapisać coś pod indeksem równym lub większym n to kompilator nie zgłosi błędu, ale skutkować to może nieprawidłowym działaniem programu.
Witam. Pierwszy Twój wzór dotyczy: Phase Correct PWM Mode drugi to: Fast PWM mode
W praktyce działa albo nie. Zadaj sobie proste pytanie - gdyby każda ATMega działała na 18 MHz, to myślisz, że dział marketingu Atmela nie ogłosiłby całemu światu, że M128 działa na 18 MHz! Te 16 MHz raczej nie dali przez skromność.BTW, twój problem nie wymaga "większego" procka tylko wyższej częstotliwości taktowania timera. Czyli jest dokładnie taki...
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 (++...
Nie pokazałeś całości, a problem może właśnie tkwić w rzeczach, których nie pokazałeś. Ale kilka uwag - po pierwsze przyciski drgają, w efekcie nie dostajesz jednego przerwania tylko dziesiątki. Twoja procedura obsługi to eliminuje, bo jest strasznie długa, ale i tak co najmniej 2 razy zostanie wywołana. Przyciski jak rozumiem masz podciągnięte rezystorem?...
Wydaj mi sie że brakuje ci polecenia => gate=internal Sprawdź: Config Timer1 = Timer , Gate = internal, Prescale = 1 Enable Interrupts : Enable Timer1 Aha, jeszcze => Start Timer1 hmmm... nie ustaliłeś trybu pracy licznika a instrukcja Load jest dla timera w trybie z automatycznym przeładowaniem
Wersja D nie ma tego problemu. Od kiedy jest produkowana wersja D to ci nie powiem bo Atmel jakoś nie raczy tego jawnie napisać w DS. Może ktoś jest w posiadaniu takiej informacji. Czy to odnosi się do ATMEGA 328 czy ATMEGA324 (W datasheet 324 nie zauważyłem informacji o niestabilności)
Wejście w przerwanie trwa co najmniej 15 taktów, czyli dla 48 MHz będzie to 0,3125 us (zapewne dłużej, bo FLASH będzie wymagał pewnie 1WS). I nagle się okaże, że mamy ten sam problem co w AVR - zaledwie kilka instrukcji do dyspozycji, zanim nie przekroczymy granicy 1 us. No dobra, niech nawet będzie 0.4us. Zostaje 0.6us, a więc jakieś 28 cykli - to...
ja to robie tak: if NACIŚNIĘTY_GUZIK { while (!NACIŚNIĘTY_GUZIK); ... } W ten sposób masz wstrzymaną pracę do momentu w którym nie puścisz guzika. Oczywiście w przerwaniu to nie będzie tak działać bo ono się wykonuje przy każdym impulsie ale może warto sprawdzić.. Albo zamiast w przerwaniu INT dać w jakimś innym (timer?) pozdro
Halogeny też będą zabronione ?? a co do projektu, właśnie zakończyłem projekt na uczelnie gdzie wykorzystuję sterowanie halogenem. jest to zrealizowane w ten sposób, że mam 100 poziomów jasności (0-100%). Sterowanie fazowe oczywiście i triak załączany impulsem. Logicznie, program działa tak: 1) system detekcji zera (transoptor) wykrywa moment w którym...
To bedzie działac tak jak piszesz. Program wróci do miejsca przerwania czyli po wykonaniu B do przerwania A a potem do programu głównego. Ja to stosuje w większosci programów bo to nawet konieczność np przy stosowaniu UART .
Albo tryb CTC i przerwania od niego albo normalny tryb pracy i przerwanie od przepełnienia. W porównaniu do ostatniej wersji zmieniłem ISR (TIMER0_OVF_vect) na ISR (TIMER0_COMP_vect) i działa. Po prostu w zestawieniu nazw wektorów przerwań z których korzystałem nie było TIMER0_COMP_vect i stąd te zamieszanie. Dzięki wielkie :) Problem rozwiązany
Tak na szybkiego możesz sprawdzić to: Wstaw w odpowiednich miejscach w swoim programie. int second=0; SIGNAL (SIG_OVERFLOW2) { second++; } int main(void) { LCD_Initalize(); LCD_Clear(); while(1) { char t1[2]; itoa(second,t1,10); LCD_WriteText(t1); } }
To co napisał kol. Krauser jest bardzo istotne, ponieważ włączasz przerwanie od porównania (1<<OCIE1B), a nie masz funkcji jego obsługi, co de facto powoduje skok do adresu 0000h, czyli rozpoczęcie działania programu od początku.. Drobna uwaga do komentarza: [syntax=c]TCCR1B |= (1<<CS12)|(1<<WGM12) ; // prescaler 512[/syntax] W Atmega8...
Kod piszę "na sucho", więc lepiej sprawdź czy działa.[syntax=c] #include <avr/interrupts.h> void timer0_init(void){ TCCR0 = _BV(CS02); //Mode 0, normal operation, prescaler 64 TIMSK |= _BV(TOIE0); //Timer/Counter0 Overflow Interrupt Enable } volatile unsigned long millis=0; volatile unsigned int okresy_migania_ledow[4] = {100,200,300,400}; ISR(TIMER0_OVF_vect)...
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.
Spróbuj zakomentowac jak najwięcej peryferii a później jeśli będzie ok po kolei je dołączać i sprawdzić w którym momencie wystąpi błędne działanie. Wtedy będzie wiadomo co zakłóca komunikację. Być może coś związane z RS232 albo Timer1.
timer działa przykłady timer działa szybko timer atmega przerwa
creative t6060 drukarka sharp komunikat zasilacz przegrzanie
cadillac escalade kosiarka listwowa
Odzyskiwanie kodu radia Hyundai Santa Fe 2007 Błąd 2742 i migający klucz w Renault - diagnostyka i naprawa