Uwaga! 1) Jeżeli zmienną licznik będziesz miał zadeklarowaną wewnątrz funkcji obsługującej przerwanie to przykładowa deklaracja powinna wyglądać tak: static uint8_t licznik = 0; 2) Jeżeli natomiast zmienną licznik zadeklarujesz gdzieś w programie głównym, wtedy powinieneś ją przykładowo zadeklarować jako: volatile uint8_t licznik = 0; po co te "przedrostki"...
Witam, 1. W postach używaj znaczników kodu tak aby kod był czytelny i wyróżniony 2. W programie brak inicjalizacji stosu. 3. Rozkaz skoku do obsługi przerwania od SPI masz pod złym adresem. Adresy wektorów przerwań są co 2 słowa (4 bajty), a rozkaz RJMP zajmuje tylko 1 słowo (2 bajty) tym samym RJMP SPIIntVecror znajduje się pod adresem 0x000A (0x0014...
gdyby to było takie proste to nie pisałbym o tym na forum, ja potrzebuję czytać pozycje przy pełnej prędkości i to bezbłędnie bez żadnych przekłamań... Maksymalnie schrzaniłeś hardware, teraz to już Cię nic nie uratuje. Do zliczania trzeba było wykorzystać ten większy Timer, a do wykrywania zmiany kierunku przerwanie. Pięknie by to chodziło a procek...
Witaj. WGM12 jest w ATmega16 w rejestrze TCCR1B. W rezultacie masz ustawiony tryb NORMAL, a nie CTC.
A czy nie powinna być skasowana flaga przerwania? Bo być może Ty z tego przerwania nigdy nie wychodzisz.
TMF: inni twierdzą, że procedura - to fragment kodu przeznaczony do WIELOKROTNEGO użycia, co oznacza, że nie ma sensu tworzenie procedur wywoływanych w jednym miejscu programu. ;) To tak z podstaw teorii programowania strukturalnego... Rozbijanie kodu na jednokrotnie wywoływane procedury może lekko zwiększa czytelność, ale zwiększa zajętość pamięci...
a co jest nie tak z pętlą while(1) bo nie mogę się dopatrzeć To, że jest pusta. Stan zmiennej flaga sprawdzasz tylko raz na początku programu, po czym zapętlasz go w pustej pętli. Poza tym sprawdzanie if(flaga=1) jest błędem, zapewne miało być if(flaga==1) - przeczytaj ostrzeżenia kompilatora generowane w czasie kompilacji.
rozumiem, że gdy przerwanie bedzie miało taką postać: ISR(INT0_vect){ // np. inkrementacja globalnego licznika _delay_ms(1000); } to przy jednym naciśnięciu uzyskam zwiększenie licznika o jeden? Jeszcze jedno pytanie. Czy przy taktowaniu zegara wewnętrznego 1MHz dla mC Atmega16 będzie to delay równy dokładnie jednej sekundzie?
Nie za bardzo mi sie chce anlizowac te dwa listingi, ale mozesz sprobowac zaldowac to do avrstudio i debugowac. Po drugie , wylacz optymalizacje kodu w makefile.
Jak to nie. Przez sekwencję sei+sleep nigdy nie wychodzisz z obsługi przerwania, tzn. rozpoczynasz obsługę następnego przerwania zanim skończysz poprzednią. W efekcie przepełnia Ci się stos. Takich rzeczy po prostu się nie robi. Ogólnie rzecz biorąc, wyświetlanie z poziomu obsługi przerwania też jest niezgodne ze sztuką, chociaż tutaj nie spowoduje...
Ależ on to ma na timerze chyba, ta flaga flag_timer2, to jest pewnie globalna dla przerwania i funkcji.
Problem dalej istnieje, zakreskowuję obsługę przerwania ISR(TIMER0_COMP_vect}, poprostu je wywalam i w momencie startu timera 0 wiesza się program, a wtedy przecież nie robi żadnych obliczeń. Bo nadal masz włączone to przerwanie, a nie masz funkcji jego obsługi.
Witam, walczę z tym cały dzień i nie potrafię zrozumieć dlaczego program nie działa. Próbuje poprostu "uruchomić" przerwanie podczas przepełnienia timera0. Jak widać niżej jest bardzo prosty kod który powinien zapalać i gasić diodę. Preskaler ustawiony na 1024, ustawiona odpowiednia flaga w rejestrze TIMSK ...i nei działa. Jeśli w pętli while wrzuce...
Witam, Napisałem program do odpytywania stanu klawiszy na Atmega16, kwarc-16MHz. Według wyliczeń przerwanie powinno sie pojawiać co 2,5ms, jednak tak nie jest, jest o wiele wolniej (ponad 1s). Analizowałem program i sam juz nie wiem co może być źle. Pomóżcie Preskaler clk/1024=16000000/1024=15625 1/15624=0,064ms 40*0,064ms=2,5ms #include <avr/io.h>...
Pętla jest, ale zanim w nią wejdziesz blokowane są przerwania :( To while(1) z tego powodu jest niezbędne.
Witam Koledzy mam taki "program" który zapala i gasi diodę led w odstępach około 1sekundowych: Do Set Porta.3 Wait 1 Reset Porta.3 Wait 1 loop end I taki programik działa jak należy ale dlaczego po dodaniu przerwania od timera0 które zmienia stan portu z określoną częstotliwością polecenie wait 1 trwa ponad minutę? Mam taki program: $crystal = 4000000...
Witam ,\za zadnego nie moge zmusic by zareagowal na przerwanie... listing programu ponizej .... jest to przyklad. bardzo prosze o pomoc. p.s. wylaczony JTAG listing: $regfile = "m16def.dat" $crystal = 8000000 Config Pind.3 = Input Set Portd.3 Config Portd.5 = Output Config Portd.6 = Output Led Alias Portd.5 Led2 Alias Portd.6 Enable Int1 Config...
Witam Utknąłem z moim kodem i plątam sie w koło ciągle, dlatego proszę o pomoc. W podprogramie "przyciski" przerwania od timer0 mam zrealizowany odczyt przycisków i zrobiłem sobie "flagi czasowe" przyciski: 'przerwanie co 26ms . kod sprawdzania przycisków . incr licz if licz=19 then ' flaga co ok 0,5 s flaga_500ms=0 ' w warunkach początkowych flaga_500ms...
Witam, z góry dzięki za pomoc otóż borykam się z następującym problemem muszę napisać program na atmegę 16 który korzystał będzie z 2 przerwań zewnętrznych INT0 oraz INT1 [syntax=cpp] void Start() { DDRD = 0b11110011; //konfiguracja pinu 2,3 jako wejście PORTD |= _BV(PORTD2); //ustawienie rezystora podciągającego PORTD |= _BV(PORTD3); MCUCR &= ~((1<<ISC11)|(1<<ISC10)|(1&l...
witam. Mam taki problem ponieważ sygnał który dostaje z akcelerometru muszę scałkować podwójnie i do tego jest mi potrzebny przedział miedzy próbkami i mam problem z wyznaczeniem tego czasu. żeby mieć stałe odstępy próbkowania wymyśliłem żeby próbkowanie odbywało się w przerwaniu i teraz problem polega na tym ze w trakcie wykonywania przerwania od timera2...
Witam, pracuję na atmedze16A i wewnętrznym clocku 4Mhz. Próbuję wygenerować przerwanie z częstotliwością 80kHz, które spowoduje negacje jednego z bitów portu B(PORTB 0). Rozumiem, że dzięki takiej operacji wygeneruję sygnał o częstotliwości 40kHz, który pozwoli mi generować ultradźwięki w nadajniku. Napisałem taka obsługę przerwania, ale coś mi nie...
Mam problem z uzyskaniem oczekiwanego działania przerwań INT0 i INT1. Procesor to ATMEGA 16 z zewnętrznym taktowaniem 16MHz. PD2, PD3 są skonfigurowane jako wejścia z podciągnięciem do 1. W obu przerwaniach jedyną czynnością jest inkrementowanie zmiennych zdefiniowanych jako volatile uint32_t. ISR(INT0_vect) { N_T++; } ISR(INT1_vect) { N_F++; } Przerwania...
Mam do zrobienia program o następującym działaniu: przerwaniem zewnętrznym (INT0) uruchamiam całą machinę - czas zaczyna być mierzony, kolejnym przerwaniem zewnętrznym (INT1) robię STOP, i w tym momencie wynik powinien być wyświetlony na wyświetlaczu LCD. Niestety jak chce odpalić program już na płytce to się nic kompletnie nie dzieje. Zapewne coś jest...
Witam W projektowanym urządzeniu popełniłem pewien błąd, niestety płytki zostały już wytrawione i polutowane a znalezienie przyczyny nieprawidłowości zajęło mi dość sporo czasu, więc wolałbym uniknąć ponownego składania układu. Mam kilka przycisków połączonych z bramką NAND. Wciśnięcie któregokolwiek generuje na wyjściu bramki stan wysoki, który dalej...
Są to moje pierwsze próby z programowaniem przerwań więc nie wiem co mogę robić źle. Próbuję uruchomić procedurę przerwania dla INT1. Podciągnąłem do tego pinu 5v przez rezystor i triggerem jest mikrostyk podłączony do GND. Najważniejsza część programu: unsigned int l1=0; int main (void) { MCUCR = (1<<ISC10); GICR = (1<<INT1);...
Witam, od pewnego czasu borykam się z pewną trudnością, a mianowicie obsługą dwóch przerwań zewnętrznych, z czego jedno ma byc wykorzystywane podczas obsługi drugiego. Projekt to odcięcie zapłonu z zamkiem szyfrowym. Po krótce: W momencie załaczenia stacyjki na on, ma wyśwoietlać się komenda podania pinu itd, po wpisaniu na tranzystor sterujący przekaźnikiem...
Napisałem najprostszy program do obsługi zewnętrznych przerwań, niestety nie działa. [syntax=c]#include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> int main(void) { DDRB=0x01; //wyjście dla diody //MCUCR|=(1<<ISC01)|(1<<ISC0... //zbocze narastające GICR|=(1<<INT0); sei(); while(1) { PORTB |= 0x01;...
Twój sposób odczytywania jest ciekawy ale nie jestem pewny czy praktyczny. Program przy takim przerwaniu i odczytywaniu kodu RC5 dość dużo czasu będzie spędzał na pętlach delay. W związku z tym, że będziesz wykorzystywał też różne inne przerwania nie jestem pewny czy program się nie pogubi i poprawnie odczyta kod RC5.
Build started 6.4.2014 at 00:25:04 avr-gcc -mmcu=atmega16 -Wall -gdwarf-2 -std=gnu99 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT Proba_10.o -MF dep/Proba_10.o.d -c ../Proba_10.c avr-gcc -mmcu=atmega16 -Wl,-Map=Proba_10.map Proba_10.o -o Proba_10.elf avr-objcopy -O ihex -R .eeprom -R .fuse -R .lock -R .signature...
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...
zapewne to wina wewnętrznego kwarcu i liczenia zmiennoprzecinkowego. A propos ta obsługa przerwania jest zdecydowanie za długa. I zmiennoprzecinkowe po co? PS. taką metodą RTC nie wyjdzie najlepszej jakości. Timer 2 asynchronicznie z kwarcem 32,786.
Nie wiem jaki to uP ale np. dla ATmega16 wygląda to tak: Włączasz przerwanie: UCSRB|=(1<<TXCIE); sei(); //dostępne globalne przerwania A tu jest podprogram obsługi przerwania: ISR(USART_TXC_vect) { cbi(PORTB, PB2); //0 na pinie PB2 } aha i jeszcze musisz włączyć bibliotekę: #include <avr/interrupt.h>...
Kwarc powinien być naj najbliżej układu ... wsadzając trymetr powiedzmy 33pF możesz minimalnie zmniejszyć lub zwiększyć częstotliwość kwarcu, ale musisz to zrobić eksperymentalnie. Swoją drogą miło, że kolega pomyślał o takim rozwiązaniu, a nie korzystaniu z innych układów typu PCF ;) Ja w swoich prockach miałem w TCCR2 ustawione jeszcze CS22 ;) Odchylenia...
Przecież twój kod się nawet nie powinien kompilować, więc jest faktycznie zły :) Jak sobie wyobrażasz zagnieżdżenie ISR? Mieszasz nowe makra (ISR) ze starymi (SIGNAL). Poza tym ATMega nie ma czegoś takiego jak priorytety przerwań. Przerwanie TIMER1_COMPA_vect nie zostanie przerwane, chyba, że jawnie odblokujesz wszystkie przerwania co zapewne doprowadzi...
Panie Dasej co do Pańskiego układu to wtedy to ma być przerwanie od ADC czy wtedy zostawić tak jak mam i od przerwania INT0? Ta propozycja nie jest zła, ale ma pewną wadę. Napięcie za mostkiem będzie się zmieniać od 0V do napięcia szczytowego podanego na mostek. W efekcie na pinie będą generowane cyklicznie przerwania, z częstotliwością 100 Hz. W efekcie...
Oj, przejrzałem pobieżnie kod - uwierz mi - skasuj go. W C jest coś takiego jak funkcje - wykorzystaj to, kod, który masz jest kompletnie nieczytelny. Każdy normalny promotor by to coś uwalił chociażby za to. Co do szybkości działania - pokaż kod funkcji odpowiedzialnych za komunikację z czujnikami. Z kodu, który masz: - funkcjie piszące do LCD są zapewne...
Witaj Kolego. Z zegarkami RTC philipsa to jest tak: 1. dobrze popatrz czy podłączyłeś przez diodę bateryjkę czy Ci jej nie rozładowuje. 2. Sam napisałeś procedurę I2C czy skopiowałeś od kogoś - dlaczego pytam - otóż jeśli masz jakieś przerwania i masz źle skonfigurowane te nóżki to w momencie kiedy Ty nie zdążysz ich przekonfigurować (mam na myśli SDA)...
Wiesz, mam książkę Baranowskiego 'ATmega w praktyce'. A to co było??? oczywiście mi pomylił się autor ale tytuł ten sam ;) więc ją masz Co do wydajności prądowej to chyba też dostałeś już odpowiedzi różne, albo drivery ULN albo zwykłe tranzystory żeby ją zwiększyć i po ptakach Żeby nie robić na jednej nodze jednej diody nawet przez te tranzystory to...
Drogi kolego , popełniłeś szkolny błąd :D W procedurze obsługi przerwania Timer0 masz ... SIGNAL(SIG_OVERFLOW0) //obsługa multipleksowania wyswietlaczy { //extern unsigned char wyswietl[7]; unsigned char licznik;//<-- ********** błąd !!!!!!!!!!! ... zmienną licznik , tyle że jest to zmienna lokalna , czyli istnieje w pamięci...
ADMUX=0b10000000; //kanał 7 ADC Zamiast 7 ustawiasz zerowy kanał ADC, a ten pin wykorzystujesz jako wyjście na wyświetlacz przecież... nic dziwnego, że bzdury wychodzą. O co chodzi z tym mnożeniem przez 100 (i dlaczego w przerwaniu, do tego jeszcze na zmiennej globalnej)? Jeśli już to powinno być przez 2 (wtedy wystarczą liczby 8-bitowe) albo (na 16-bitowych)...
Druga sprawa. Skoro ma być reset np. BORF: flaga resetu przy obniżonym napięciu sieci, to czy można wcześniej zapisać do EEproma jakieś ważne dane? Zdecydowanie nie należy nic zapisywać do EEPROM przy obniżonym napięciu. Poza tym BOD nie wystawia żadnej flagi przerwania którą mógłbyś wykorzystać. On po prostu resetuje układ o ile jest włączony a następnie...
#include <avr/io.h> // dostęp do rejestrów #include <avr/interrupt.h> // funkcje sei(), cli() #include <avr/delay.h> ISR(TIMER1_OVF_vect) { TCNT1=50; } ISR(TIMER2_OVF_vect) { TCNT2=0x50; } int main() { // Ustawienie licznika 2 TCCR2=_BV(CS20); // Ustawienie licznika...
Witam, Pomysł dobry ale sypie się najprawdopodobniej z powodu zbyt dużej ilości przerwań. Proponuje projekt sterownika "równoległego", taki wykorzystałem w mojej pracy inżynierskiej. Wprawdzie korzystałem tylko z 8 serw ale 16 też obsłuży po drobnej modyfikacji. Program zabiera większość mocy procesora do obsługi przerwań ale tylko przez czas 2ms potem...
A jak ustawić ten licznik żeby generował takie przerwania ??
a jesli powiem ze tak tez próbowałem tylko ze odczyt z kodów z rc5 trwa z przerwą 600ms która musi byc pomiedzy odczytem a konwersją temperatury z ds1820 :( Jakoś nie widzę problemu. Przecież Int0 ma wyższy priorytet niż DS. Jerśli istnieją jakieś konflikty to należy zablokować przerwanie Int0 na czas inicjacji DS'a i odczytu temperatury. W trakcie...
Przedstawię Ci kolego przykład zastosowania Pulsein żebyś miał jaśniej. Myślę że będzie "rzeczowiej". To przykład dla dekodowania transmisji pilotów podczerwieni. Sygnał podłaczony jest do zewnetrznego przerwania INTx i w momencie zmiany na pinie program skacze do tej procedury. Mierzy impuls i poddaje rozwadze jego długość. [syntax=basic4gl]Int_1isr:...
No to zaczynamy po raz kolejny. Coś takiego jak stworzyłeś to niestety za szybko nie będzie działać. Mega z kwarcem rs 14 z groszami działa naprawdę szybko i można zrobić bardzo dużo w jedna sekundę. Do odbierania i wysyłania danych można sobie napisać własną procedurę - nawet w bascomie i jest ona sporo szybsza i działa rewelacyjnie. Deklarujemy przerwania...
Na podstawie artykułu: http://mikrokontrolery.blogspot.com/2011... chciałem spróbować nastawić timer1 (16 bitowy) w ATmega16. Robię to w ten sposób: [syntax=c] #include <avr/io.h> #include <avr/interrupt.h> #define LED1 PC0 #define LED2 PC1 volatile uint8_t cnt=0; void main(void) { DDRC |= (1<<LED1) |...
dwa przerwania?? dlaczego nie bardzo to rozumiem mogę prosić o jaśniejsze wyjaśnienie
hmmm, chyba sie troche zle zrozumielismy, albo ja problemu nie rozumiem. W mojej AtMega16: int0 jest na PD2, a int1 na PD3. I chodzi mi o to ze w moim zestawie uruchomieniowym nic tam nie jest podlaczone, a chcialbym potrenowac sobie przerwania ktore by przychodzily z innego portu, np. z PC2- poniewaz tam mam przycisk podlaczony. Jak to zrobic? Dodam...
siema, napisalem probny progamik zeby nauczyc sie wprowadzac procka w rozne stany uspienia,..., chyba cos mi sie nie wlacza ten POWER DOWN, prosze o podpowiedzi. Nie masz przerwania INT0 , bo go nie włączyłeś.Pondto , "nasadziłeś" w kodzie takich "kwiatków" , że głowa mała ;) GIFR=0x00; // co chcesz osiągnąć wpisując 0x00 do GIFR ??? tryb=++tryb; //...
Nie, po prostu nie możesz ciągle odczytywać ADC. Robisz int x=ADC i potem odwołujesz się do x. A dioda mruga bo program w przerwanie ADC wchodzi i coś tam miesza. Swoją drogą używasz M128, nie masz JTAGa?
http://obrazki.elektroda.pl/7114210100_1... Witam wszystkich serdecznie ! Z racji tego, że zbliżają się święta postanowiłem podzielić się z wami projektem elektronicznego drzewka szczęścia. Urządzenie powstało prawie rok temu i było prezentem urodzinowym dla mojej dziewczyny którą serdecznie pozdrawiam !!! :D Założenia do projektu:...
kolega Freddie zasugerował jedno z możliwych rozwiązań, mianowicie: zamiast deklarować jakiś wskaźnik do bufora, spróbuj zadeklarować tablicę, np: unsigned char bufor[10]; nie jestem pewien co z tą funkcją dtostrf(), może to ona nie działa...
Myślę, że źle podszedłeś do tematu. Wypadałoby wykorzystać przerwania z UARTu i zrobić sobie jakąś ramkę wymiany danych z sumą kontrolną by wiedzieć, że odebrane dane są poprawne, a jeśli nie to żądać powtórki lub je odrzucić.
Witam, Mam pytanie odnośnie obsługi przerwań w mikroprocesorze Atmega16. Procesor ten ma możliwość pracy z trzema przerwaniami zewnętrznymi. Powiedzmy, że aktywuję wszystkie trzy przerwania. Występować one będą średnio co 3,33ms i będą spowodowane detekcją zera na trzech kolejnych fazach zasilania trójfazowego. Czas trwania przerwania będzie się wahać...
http://obrazki.elektroda.pl/8592196000_1... Witam, Od zawsze marzył mi się zegar na lampach NIXIE. Jednak nie chciałem żywcem kopiować jakiegoś projektu, tylko samemu coś zbudować. Długo szukałem inspiracji, najbardziej martwiła mnie obudowa bo u mnie z tym zawsze najgorzej. Zainspirowała mnie obudowa zegarka od electoNIXclock więc...
Witam uruchomiłem ten program na atmega16 innej niż ta co wcześniej i jak na razie liczy tak jak powinno czyli zasłonie szczelinę transoptora i dodaje 1 tak jak miało to być. A na tej drugiej dalej nie działa tak jak powinno nie wiem czy czasem nie jest problem z płytka pcb która dodam wieczorem
Uśpiłeś procesor w przerwaniu. W przerwaniu jak wiadomo są blokowane przerwania więc kolejne przerwanie wybudzające już nie wystąpi. Stąd Twój problem. sleep_cpu nie może znajdować się w obsłudze przerwania.
Nie ma żadnych warrningów. Kod normalnie się kompiluje i delay działa poprawnie. Ciekawe, bo u mnie jest: Build started 12.11.2011 at 12:13:32 avr-gcc -mmcu=atmega16 -Wall -gdwarf-2 -std=gnu99 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT Proba_22.o -MF dep/Proba_22.o.d -c ../Proba_22.c In file included...
Witam forumowiczów, Sytuacja wygląda tak, że z jednostki nadrzędnej słane są ramki danych, Po każdej ramce jest szczelina czasowa tak aby nasza ATmega zdążyła odpowiedzieć, Mamy Atmega16 kwarc 16MHz i transmisje 57600 (w przybliżeniu), Gadamy przez RS485 tak, że między ramkami jeszcze przełączam linie bufora, Steruje równocześnie buforem wejścia i wyjścia...
Rejestry konfiguracyjne możesz zmieniać w każdej chwili ;) więc nie ma problemu aby w obsłudze przerwania napisać Config INTx = Rising Pozdrawiam
Umieść odbiór danych w obsłudze przerwania od URXC.
Jak już kolega Dr_DEAD napisał w obsłudze przerwania możesz zezwolić na inne przerwania niezależnie od priorytetów.
atmega16 przerwania atmega16 przerwania usart przerwania zewnętrzne atmega16
usterki berlingo pralka zdjąć obudowa siemens schematu projektora laserowego
bosch wan2825epl bosch wan2825epl
Amplituner buczy po włożeniu anteny - przyczyny i rozwiązania Szczotki węglowe w odkurzaczu Zelmer Jupiter ZVC425HT: wymiana i objawy zużycia