daj ISR (TIMER0_OVF_vect)
Opczytaj o działaniu operatorów. & to operator iloczynu logicznego, czego się spodziewasz? Ma być PORTC^=0xFF;
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!!
Witam, Z racji tego ile już zrobiłem na atmegach to aż wstyd pisać taki post, ale ręce już mi opadają.... Mam układ ATmega1284p, na który przenoszę kod obsługi modbus'a RTU który już skutecznie odpaliłem na kilku innych atmegach. Ta jednak jest oporna. Drogą śledztwa doszedłem, że winny jest niedziałający timer0. Zacząłem więc go rozbierać na czynniki...
Dzięki teraz działa wszystko działa
Nie istotne co program robi, wazne ze przerwanie mi nie dziala:) Program ma 400 lini i nie ma sensu go wklejac. ale można daodać jako załącznik jeśli się nie myle, ... mniejsza z tym, kolega poszuka wróżki :)
Ale która konkretnie, czy Enable interrupts, czy Enable Timer0, czy oba na raz? Moim zdaniem to kolejny bug bascoma, znów może jakieś pokręcone rejestry, itp. Dokładnie problemu zidentyfikować nie mogę, bo takich procesorków nie mam, ani czasu tez zabardzo na takie badania. Jedyne co mogę doradzić to: a) zrobienie własnoręcznie przejściówki m8515/m32...
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...
Słuszna uwaga. Czyli po włączeniu optymalizacji poprzedni kod działa OK?
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.
// ================= 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ę...
Dzień dobry, Mam problem z klawiszami. Zedytowałem do własnych potrzeb fragment kodu znaleziony na http://mikrokontrolery.blogspot.com/ [syntax=cpp]ISR(TIMER0_OVF_vect) { sei(); static uint8_t stan_przyciskow_najstarszy , stan_przyciskow_stary , stan_przyciskow_nowy; stan_przyciskow_najstarszy = stan_przyciskow_stary; stan_przyciskow_stary = stan_przyciskow_nowy;...
ATMEGA88 jak i ATMEGA168 ma wewnętrzy preskaler sygnału zegarowego który jest domyślnie włączony. ATMEGA 8 go nie ma.
... sorry ale to kolejne pytanie na forum z serii "dla jasnowidzów - magia i mistyka" ;) ... no jak można zadać pytanie "... dlaczego mi nie działa Timer1 w ATmega8???" i koniec! (no nie przepraszam kolega autor podał jeszcze wg niego garść dodatkowych informacji dzięki którym jasnowidzowie z forum mogą się rzucić na rozgryzanie tematu - a mianowicie...
Bity CS00 i CS02 od preskalera są w rejestrze TCCR0B, a nie TCCR0A. Masz preskaler na 0 więc timer nie zlicza.
[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 =...
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) {...
Nienawidzę czytać datasheetów... Ooojo joj ... to będzie bolesna droga przez mękę ta nauka programowania :( W książce mam napisane że do TCCR1B jest przypisany OCR1B, ale jak widać niezbyt to działa... No to hmmm książek też nienawidzisz czytać ? tak by wynikało skoro piszesz, że ktoś tak napisał w książce. Coś chyba mało uważnie czytałeś. Nikt tak...
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ść...
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) ; ;)
Poi pierwsze. Do BASCOM-a jest pomoc - także po polsku, której to zresztą jestem autorem. Wersję on-line (beta) znajdziesz na mojej stronie WWW. Jak one działają? Zliczają impusy. Albo z prescalera, albo z zewnątrz. Patrz nota katalogowa. W którą stronę zliczają? Zwykle liczą w górę. W trybach PWM liczą też w obie strony. Patrz nota katalogowa. Jak...
Zamieszczam przyklad programu napisanego na kolanie, zmienia stan lini PC3 co okolo (LicznikMax*10ms ) - wychodzi co ok. 100 ms Gdybyś miał wątpliwości to podniosłem moje kości z krzesła przed komputerem po płytkę z AtMega32 i sprawdziłem w ukladzie - DZIAŁA! Kompilowany pod ICC626, polecam "Wizarda" ,pomaga w minute ustawić co potrzeba bez sięgania...
Chcialbym napisac najprostrzy program aby sprawdzic czy progra mi wogole wchodzi w przerwanie czyli czy zapali diode. Ale zupelnie nic sie nie dzieje. Zarówno symulacja programowa w AVR Studio, jak i program uruchomiony na realnym sprzęcie działa poprawnie. Albo się pomyliłeś co do podłączenia diody, albo procesor jest uszkodzony. Po drobnej zmianie...
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...
- czy praca równoległych timerów nie będzie jakoś na siebie wpływać (program przerywa pracę na skutek działania timera1 by precyzyjnie wyznaczyć czas, a tu w tym samym momencie dochodzi kolejne przerwanie od innego timera, i co wtedy) Timery działają niezależnie, ponieważ realizowane są sprzętowo. Nie będą na siebie wpływać. Program niestety (w tym...
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ć.
... ale niestety mądrala nie przytoczył jak powinno się to zapisywać... ) Oj, uważaj bo ktoś może poczuć się urażony i raportować post :) Na temat F_CPU w sieci można znaleźć wiele: F_CPU – gdzie definiować? Chciałbym dowiedzieć się co znaczą te TCCR2, OCR2, TIMSK, jak liczyć te przerwania i dlaczego timer po skopiowaniu tego kodu nie liczy faktycznie...
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,...
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ć
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
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 .
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...
Witam, czy poniższe funkcje działają w sposób prawidłowy z logicznego punktu widzenia? Jeżeli ustawiam timer i OCR0 ręcznie to układ działa jak trzeba a po wykonaniu tych funkcji nie. tablica_uart jest to tablica charów o rozmiarze 5. np. "00064" czyli 100. Dodano po 47 I czy można zaininicjować timer w pętli glównej programu? Jeżeli robię to przed...
(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?
Wyrzuć te delay'e. Zmienną licznik jak radzili koledzy zmień na volatile. Zmień sei(); na SREG |= (1<<7); Jeśli będzie działać, to zapytam jakiej wersji avr studio używasz? [syntax=cpp] #include <avr/io.h> #include <avr/interrupt.h> volatile uint8_t Count = 0; ISR(TIMER0_OVF_vect) { Count++; TCNT0 = 0; } int main(void) { DDRB = 0xFF;...
Po pierwsze to mega dziwnie ustawiasz ten oscyloskop, ale to detal. Po drugie, powiem szczerze, nie do końca rozumiem działanie trybu 15 TIMER1. W tym trybie licznik liczy do wartości ustawionej w OCR1A, ale kiedy następuje przełączenie wyjścia? Karta katalogowa podaje, że "Setting the OCR1x equal to TOP will result in a constant high or low output...
(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.
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.
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 ;......
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...
A tam czasem nie brakuje operatora przed znakiem przypisania? TCCR1B | = (1<<WGM12)|(1<<CS12)|(1<&...
Nareszcie działa. Marek
OK, już działa. Nie wiem czemu, ale Programmers Notepad i A pisałem abyś zainstalował AVR Studio 4.
W tym trybie timer po prostu zlicza impulsy zegarowe do niego doprowadzone, jeśli przekroczy zakres to zgłasza przerwanie overflow (nadmiaru) i rozpoczyna zliczanie od nowa. Funkcja obsługi tego przerwania zlicza je zwiększając liczniki f - przechowujący czas z rozdzielczością <1ms i m przechowujący liczbę milisekund. W programie należy korzystać...
while(1) { AD(); //obsluga ADC if(ADC>630) { PORTC=0X00; //wlacza,wylacza diode TIMSK |=1<<TOIE2; //ZEZWOLANIE NA PRZERWANIE OD T0 } } } Moze tak?
Witam. Zapis (składnia) Load Timer1 jest zły. Sprawdź w pomocy Bascoma.
Kolejność wpisywania pary rejestrów ma znaczenie, przynajmniej pod ASM. co ciekawsze własnie sprawdzałem, port wcale nie musi wczesniej być ustawiony jako wyjście, timer nim steruje niezaleznie od DDRB, ale oczywiście lepiej zadeklarować go jako wyjscie :) edit: być może avr studio sam deklaruje (przy nastawie bitów generujących PWM) DDRBx jako wyjścia.......
Na szybko: W kodzie przerwań masz _delay_ms(). Zmień kod tak aby w przerwaniach tylko przechwytywać zaistnienie zdarzenia i całą obsługę zrób w głównej pętli. Jeśli masz tak równe odcinki czasu (50ms i 500ms), to zamiast głównej pętli możesz też zrobić przerwanie timera. Ogólnie: Przerwania to nie procesy :) Update: Jeśli chodzi o Twoje pytanie: jak...
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.
Dołącz bibliotekę <avr/interrupt.h>
Przecież pisze jak na tacy: 1. Licznik nie doliczy do 5000 w trybie CTC - zatem logicznie myśląc trzeba ten tryb wyłączyć . 2. Jeśli licznik ma pracować w trybie CTC to wartość z OCR1B musi być mniejsza niż OCR1A.
A co na to symulacja programu? Taki program wgraj: .nolist .include "m32def.inc" .list ; ## START ########################################... .cseg ;=======================================... ;= WEKTORY PRZERWAŃ = ;=======================================... .org 0x0000 rjmp reset_vector ; po...
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...
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.
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 ;/
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...
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...
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...
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...
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...
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...
Ustawiasz bit WGM13 w dwóch rejestrach,a on jest tylko w jednym - TCCR1B. Za to niepotrzebnie ustawiasz bit WGM12, co powoduje, że nii działasz w trybie PWM, a w trybie CTC (tryb 12 zamiast 8).
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...
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.
$regfile = "m8def.dat" Config Pinb.1 = Output $crystal = 1000000 Config Timer1 = Timer , Prescale = 64 Config Timer0 = Counter , Edge = Rising On Timer1 Odmierz_1s Dim Licz As Byte , I As Byte Enable Interrupts Enable Timer1 Start Timer1 Timer1 = 65535 - 15625 Do Loop End Odmierz_1s: Timer1 = 65535 - 15625 Incr Licz If Licz = 5 Then Licz...
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, 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...
Zmienna count powinna być volatile .
Witam, Popełniłeś kilka błędów: - aby odblokować przerwania od przepełnienia timera 1 trzeba ustawić bit 2 a nie 5 w rejsestrze TIMSK - wektor przerwania od przepełniania timera 1 to nie 0x12 a 0x24 Dobrze jest przy pisaniu w C korzystać z funkcji dostarczanych wraz z kompilatorem "intrinsic function" takich jak __interrupt_enable, __interrupt_disable,...
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...
Powinieneś mieć trzy ODDZIELNE procedury - main, obsługę przerwania INT0 i obsługę przerwania timera. W kodzie powyżej z main przchodzisz do obsługi int - błąd pierwszy. Obsługa obu przerwań zamazuje rejestr R16, którego używa main - błąd drugi. Przycisków nie obsługuje się na przerwaniach int, a w przerwaniu timera (który to temat powraca tu kilka...
Działa ;-) Ustaw Breakpoint na linijce (prawy myszy Toggle Breakpoint) [syntax=avrasm]com LED[/syntax] naciśnij F5 (Run) jak zatrzyma się na Breakpoint wykonaj kod przerwania krokowo F11 naciśnij F5 (Run) jak zatrzyma się na Breakpoint wykonaj kod przerwania krokowo F11 itd. Zamiast 15625 ładuj do OCR1A 15624. Wieczorem wrzucę inny sposób migania tym...
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...
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.
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...
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
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...
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...
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...
TCCR1B |= (1<<CS12) | (1<<CS10); :D ok. działa. Dodano po 17 Mam problem jeszcze z przetwornikiem ADC w trybie free Run. Zrozumiałem to tak, że pomiar ciągły jest włączany ustawieniem 1 na ADATE i inicjowany ustawieniem 1 na ADSC. Co źle ustawiam? Może po kolei: ADEN: ADC Enable – (1/0) - włącza lub wyłącza układ ADC; jeżeli nie używany,...
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...
Już działa. Żeby było ok, trzeba ustawić bity wrejestrze TCCR2 : Config Timer2 = Pwm , Async = Off , Prescale = 1024 , Pwm = On , Compare Pwm = Clear Down Reset Tccr2.com20 Set Tccr2.com21 Enable Interrupts Enable Timer2 Compare2 = 20 I teraz jest dobrze. Ale teraz - jak ustawić timer 0 jako PWM ? Bo config timer0 = pwm wywala mi błąd kompilatora.
Faktycznie aktywnym stanem jest zero i wtedy ten fragment kodu nie powinien dać żadnego rezultatu, ale co dziwne cokolwiek nacisnę i tak się wykona. Znaczy, dlaczego nie. Jak wcisnąłeś przycisk 0, a sprawdzasz 2, to przerwanie sie wygeneruje, ale na dwójce jest stan wysoki, to warunek (pierwszy) zadziała. Jak sprawdzam czy stan jest równy zero to też...
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...
Ponieważ z elektrody otrzymałem wiadomość o zamknięciu tematu, chciałem na zakończenie napisać dwa słowa. System pomiaru czasu rzeczywistego z użyciem timera2 na procesorze atmega324 działał u mnie bez zarzutu (większość czasu procesor spędzał w powerdown z włączonym rtc). Jako ciekawostkę dodam, że jest możliwe zrobienie dokładnego cyfrowego strojenia...
I wcale nie trzeba go zaraz fusami wyłączać bo po co? ... Wyłączyć go po prostu trzeba programowo. W takim razie nie bardzo rozumiem treści tabelki ze strony 53 Safety Level 2 In this mode, the Watchdog Timer is always enabled, and the WDE bit will always read as one. A timed sequence is needed when changing the Watchdog Time-out period. Ja to rozumiem...
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...
Witam. Najpierw wysyłasz rozkaz pomiaru temperatury, później z pomocą timera lub nawet zmiennej zwiększanej w pętli odliczasz czas pomiaru lub większy (mikroprocesor w międzyczasie normalnie wykonuje program). Po tym odczytujesz wynik pomiaru z DS1820, co nie trwa zbyt długo. Pozdrawiam. EDIT: Uzupełniłem posta
Sprawdzałem Twój kod inicjalizacji timera + przerwanie -> wszystko jest ok. Musisz mieć błąd w zliczaniu sekund lub w wyświetlaniu. Tak na marginesie to po co ustawiasz bit OCF2 w TIFR? Nie korzystasz z porównania (compare match), więc nie potrzebnie robisz to ustawienie. Wystarczy TIFR=(1 << TOV2);
Witam, próbuje wykonać prosty odtwarzacz midi w oparciu o mikrokontroler atmega8535. Bazując na przykładach z internetu udało mi się temat jakoś wstępnie ogarnąć. Niestety na atmedze nie uruchamia mi się zegar o który oparte mają być programy. Wszystko jakby "wisi". Dodam że programuję w C w środowisku Code Vision AVR. W celu zlokalizowania problemu...
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...
timer działa szybko timer atmega przerwa programować timer atmega
stabilizacja punktu pracy zasilanie manipulatorów integra instrukcja serwisowa zmywarki
światła dzienne podłączenie polonez kierunkowskazy centralny
Problemy z przełącznikiem świateł w samochodzie - brak świateł mijania i długich Brak powietrza w prawym miechu zawieszenia DAF 55-250 LF