Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 13 gru 2025, o 05:59


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 15 ] 
Autor Wiadomość
PostNapisane: 1 lip 2014, o 12:35 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 03 kwi 2014
Posty: 85
Pomógł: 4

Witam!
Jestem nowy na forum :D. Napisałem prosty program do migania diodą co 1 sekundę za pomocą TIMERA0 w ATmedze8.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Dioda podłączona do pinu PB0, program się wgrywa jednak nie działa :?: . Gdy migałem diodą za pomocą delay-ów, to dioda ochoczo migała. Jednak nie wiem dlaczego to nie działa za pomocą TIMERA0.
Z góry dziękuję za odpowiedzi.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 lip 2014, o 13:09 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sie 2013
Posty: 1154
Lokalizacja: Lublin / Kraków
Pomógł: 72

No w moim odczuciu to zmienna licznik za każdym razem po wejściu w przerwanie jest inicjalizowana zerem. Dlatego nie ma szansy dojść do 31250. Usuń to zero, zmienna static inicjuje się sama.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 lip 2014, o 13:23 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 03 kwi 2014
Posty: 85
Pomógł: 4

Tak, mój błąd z tą zmienną static, już poprawiłem. Jednak dioda nie miga. Bym zapomniał, taktowanie procesora = 8MHz.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 lip 2014, o 14:13 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sie 2013
Posty: 1154
Lokalizacja: Lublin / Kraków
Pomógł: 72

Może miga, tylko za krótko czekasz :)
Tak na oko to licznik osiągnie wartość 31250 po około 2,5 minuty. Czyli po takim czasie dioda się zapali lub zgaśnie po czym po kolejnych 2,5 minutach stan diody zmieni się na przeciwny.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 lip 2014, o 16:44 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 lut 2014
Posty: 101
Pomógł: 4

To powinno pomóc:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


ogólnie daj zmienną jako volatile i nie inicjuj jej w przerwaniu.

Kod pod Attiny 2313 ,łatwo przerobić na Atmega 8 :)


Autor postu otrzymał pochwałę

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 lip 2014, o 17:28 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 03 kwi 2014
Posty: 85
Pomógł: 4

Dzięki bardzo! Dioda już miga. Sam zapomniałem o tym, że w procedurach obsługi przerwań używa się specyfikatora volatile, przy zmiennych.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 lip 2014, o 18:04 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 lut 2014
Posty: 101
Pomógł: 4

Nie ma za co ,cieszę się że choć raz mogłem komuś pomóc.

Tym bardziej ,że sam dopiero co się uczę i nieraz korzystam również z pomocy kolegów na forum. ;)



P.S. Nie wiem czy wiesz ,ale bardzo fajnym trybem dla Timera jest tryb CTC ,który nie raz się przydaje nawet bardziej niż OVF.

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 lip 2014, o 18:09 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sie 2013
Posty: 1154
Lokalizacja: Lublin / Kraków
Pomógł: 72

Timer0 w AT8 nie ma trybu CTC, nie ma też PWM. Ma tylko normal.

Co do zmiennej volatile. To w problematycznym przykładzie zmienna licznik była używana tylko w przerwaniu. Miganie odbywało się wprost z przerwania, więc nie musi być, moim zdaniem volatile.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 lip 2014, o 18:47 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 03 kwi 2014
Posty: 85
Pomógł: 4

No ATmega8 jest trochę biedna :( , ale np. już ATmega88, lub 328, to fajne zamienniki tego wysłużonego staruszka.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 lip 2014, o 19:47 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 sty 2012
Posty: 777
Lokalizacja: Karpicko k. Wolsztyna
Pomógł: 197

sq8dsr napisał(a):
No w moim odczuciu to zmienna licznik za każdym razem po wejściu w przerwanie jest inicjalizowana zerem. Dlatego nie ma szansy dojść do 31250.

Zmienne statyczne w przerwaniach czy funkcjach są inicjowane daną wartością przy pierwszym wejściu programu w przerwanie czy funkcję. Tak więc to zero niczemu nie przeszkadzało.
Poprawiony program kolegi matiwegr z pierwszego postu
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


A program koledze nie działał bo nie zostały odblokowane przerwania Overflow.
Zamiast
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

było
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 wrz 2014, o 16:13 
Offline
Nowy

Dołączył(a): 19 wrz 2014
Posty: 11
Pomógł: 0

Witam. Mam pytanie odnośnie tego fragmentu kodu czyli wykonania podprogramu przerwania :
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Gdyż według BB i instrukcji tam zawartych głównie na temat odszukania niezbędnych informacji w nocie katalogowej na temat uruchomienia przerwania, nie zauważyłem informacji na temat trybu CTC oraz odpowiednich nazw bitów dla atmegi8 - ale okej możliwe że mój angielski i moja niewiedza mnie zaskoczyła.

Jednak bardziej chciałem się upewnić czy dobrze rozumiem co się dzieje w tym podprogramie czyli :
Przerwanie z tego co wyczytałem działa tak że leci sobie licznik jeśli osiągnie jakąś tam wartość (w BB było ona ładnie dobierana i zapisana w "OCR0" , tutaj nie wiem jaka jest ? ) następuje wyzerowanie tego licznika i wykonanie podprogramu , czyli tutaj stworzona jest jakaś zmienna która całkiem osobno liczy nam tutaj do wartości 1000 , i jeśli osiągnie wartość 1000 następuje zmiana stanu diody - zgadza się ?
I teraz tak się zastanawiam jeśli dalej sami sobie odliczamy jakiś tam czas za pomocą zmiennej "licznik" czy to jest odpowiednie wykorzystanie odliczania czasu przerwania ? Czy powszechny sposób zwiększenia możliwości czasu w jakim sie wykona przerwanie, ponieważ na 8-bitowym Liczniku chyba się nie da z tego co się nagłowiłem osiągnąć czasu 1s ?
I jeszcze jedno już krótkie pytanie, czy jest możliwość wykonania wewnętrznego przerwania w zależności od stanu zmiennej (np: wystąpienie przerwania gdy "volatile zmienna = 1") ??
Przepraszam za ten esej ale będę wdzięczny za każdą pomoc :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 wrz 2014, o 17:42 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 03 mar 2014
Posty: 580
Lokalizacja: Jastrzębie-Zdrój
Pomógł: 71

Witam,

xardes napisał(a):
Witam. Mam pytanie odnośnie tego fragmentu kodu czyli wykonania podprogramu przerwania :
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Kod:
1 linijka: Rejestrowanie zmiennej statycznej uint16_t licznik (na starcie wyzerowana, można przypisanie zera pominąć. Tak jest przy zmiennych statycznych oraz globalnych)
2 linijka: Podczas przerwania zwiększ zmienną licznik o 1.
3 linijka: Jeżeli zmienna licznik jest większa od 1000 to:
a) wykonaj MIGAJ_LED;
b) wyzeruj zmienną licznik (czyli tak jakby wracamy do punktu 1).

xardes napisał(a):
Gdyż według BB i instrukcji tam zawartych głównie na temat odszukania niezbędnych informacji w nocie katalogowej na temat uruchomienia przerwania, nie zauważyłem informacji na temat trybu CTC oraz odpowiednich nazw bitów dla atmegi8 - ale okej możliwe że mój angielski i moja niewiedza mnie zaskoczyła.


Datasheet to podstawa ;) Po pierwsze jeżeli kolega szukał przy Timerze0 to jak ktoś wcześnej napisał - Mega8 nie posiada trybu CTC w Timer0.
W Timerze1 np. można już znaleźć taki tryb w tabeli nr 39 (wg DS który posiadam) która jest opisana jako: Waveform Generation Mode Bit Description.

xardes napisał(a):
Jednak bardziej chciałem się upewnić czy dobrze rozumiem co się dzieje w tym podprogramie czyli :
Przerwanie z tego co wyczytałem działa tak że leci sobie licznik jeśli osiągnie jakąś tam wartość (w BB było ona ładnie dobierana i zapisana w "OCR0" , tutaj nie wiem jaka jest ? ) następuje wyzerowanie tego licznika i wykonanie podprogramu , czyli tutaj stworzona jest jakaś zmienna która całkiem osobno liczy nam tutaj do wartości 1000 , i jeśli osiągnie wartość 1000 następuje zmiana stanu diody - zgadza się ?


Kolega dobrze myśli tylko OCR0 - w Medze8 nie ma jak już wspomniałem. Tutaj korzysta się z TCNT0, który trzeba ustawiać od nowa w każdym przerwaniu. Odsyłam do BB - w II wydaniu strona nr 39.

xardes napisał(a):
I teraz tak się zastanawiam jeśli dalej sami sobie odliczamy jakiś tam czas za pomocą zmiennej "licznik" czy to jest odpowiednie wykorzystanie odliczania czasu przerwania ? Czy powszechny sposób zwiększenia możliwości czasu w jakim sie wykona przerwanie, ponieważ na 8-bitowym Liczniku chyba się nie da z tego co się nagłowiłem osiągnąć czasu 1s ?
I jeszcze jedno już krótkie pytanie, czy jest możliwość wykonania wewnętrznego przerwania w zależności od stanu zmiennej (np: wystąpienie przerwania gdy "volatile zmienna = 1") ??
Przepraszam za ten esej ale będę wdzięczny za każdą pomoc :)


Czas możesz uzyskać dowolny, np. przerwanie wykona się co 1 ms, czekamy aż licznik naliczy do 1000, więc dioda mignie co 1s - z dokładnością jaką oferuje źródło taktowania. Wewnętrzny oscylator nie grzeszy dokładnością, więc jak by chciał kolega na bazie tego zegarek stworzyć, to życzę powodzenia :D

Przerwanie od zmiany zmiennej nie słyszałem ;) Można w przerwaniu zmienić zmienną np. na 1 i w kodzie programu na to zareagować. Wtedy to nazywasz flagami :)

z Niebieskim pozdRowieniem,
Doman89



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 wrz 2014, o 18:19 
Offline
Nowy

Dołączył(a): 19 wrz 2014
Posty: 11
Pomógł: 0

Dzięki wielkie kolego damian89 za precyzyjna odpowiedz :) taka sobie właśnie wymarzyłem :)
A odnośnie przerwań to teraz mi do głowy przyszło że dużo bardziej praktyczne raczej są te zewnętrzne pochodządze od innych ukłądów czy przełączników, jednak "majdrowanie " tymi wszystkimi rejestrami i bitami jest niesamowicie męczące dla mnie :/ i na razie jeszcze nie mam pojęcia jak je ustawić ale będę szukał a jak nie znajde to pytał :) bo niestety w BB jak dotąd nie spotkałem się z wyjaśnieniem tego zagadnienia , chyba że w wydaniu II jest coś o tym ? (niestety jak na razie nie posiadam )



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 wrz 2014, o 18:32 
Offline
Użytkownik

Dołączył(a): 24 sty 2012
Posty: 1469
Pomógł: 56

xardes napisał(a):
Dzięki wielkie kolego damian89 za precyzyjna odpowiedz :) taka sobie właśnie wymarzyłem :)
A odnośnie przerwań to teraz mi do głowy przyszło że dużo bardziej praktyczne raczej są te zewnętrzne pochodządze od innych ukłądów czy przełączników, jednak "majdrowanie " tymi wszystkimi rejestrami i bitami jest niesamowicie męczące dla mnie :/ i na razie jeszcze nie mam pojęcia jak je ustawić ale będę szukał a jak nie znajde to pytał :) bo niestety w BB jak dotąd nie spotkałem się z wyjaśnieniem tego zagadnienia , chyba że w wydaniu II jest coś o tym ? (niestety jak na razie nie posiadam )

Oczywiście, że jest w BB i to na każdym kroku. Jednak BB to tylko "drogowskaz" a szczegóły masz w nocie. I bez połączenia jednego z drugim się po prostu NIE DA :!:

_________________
Jestem początkujący i moje porady mogą być błędne



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 wrz 2014, o 19:10 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 03 mar 2014
Posty: 580
Lokalizacja: Jastrzębie-Zdrój
Pomógł: 71

Witam,

xardes napisał(a):
Dzięki wielkie kolego damian89 za precyzyjna odpowiedz :) taka sobie właśnie wymarzyłem :)
A odnośnie przerwań to teraz mi do głowy przyszło że dużo bardziej praktyczne raczej są te zewnętrzne pochodządze od innych ukłądów czy przełączników, jednak "majdrowanie " tymi wszystkimi rejestrami i bitami jest niesamowicie męczące dla mnie :/ i na razie jeszcze nie mam pojęcia jak je ustawić ale będę szukał a jak nie znajde to pytał :) bo niestety w BB jak dotąd nie spotkałem się z wyjaśnieniem tego zagadnienia , chyba że w wydaniu II jest coś o tym ? (niestety jak na razie nie posiadam )


Kolega na przyszłość doman89 nie damian89 ;)

Przerwania są różne, bo różne są potrzeby. Lepsze przerwania mogą być do konkretnego problemu, do innego bezużyteczne ;)

Co do męczenia rejestrów to niestety, ale programowanie mikrokontrolerów to właśnie zabawa z różnymi rejestrami. Nawet ustawianie DDRx to już zabawa z rejestrem :P Wszystko z czasem przychodzi, jedna zasada, jeżeli chce się być programistą to trzeba po prostu pisać, a gdy staje się wszystko ciężkie i niezrozumiałe, to ważne aby się nie poddawać i zawsze zrobić ten jeden mały krok do przodu ;) Ja też jestem początkujący, choć jak to mówi pan Mirek, jeden kroczek przed Tobą.

z Niebieskim pozdRowieniem,
Doman89



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 15 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO