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



Teraz jest 28 mar 2026, o 01:07


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 7 ] 
Autor Wiadomość
PostNapisane: 5 gru 2014, o 18:58 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 05 gru 2014
Posty: 6
Pomógł: 0

Cześć. Próbuję ogarnąć w jaki sposób działają przerwania. Podłączyłem sobie pod PIN PB1 diodę. I teraz chcę zrobić żeby ona migała. Sposób podłączenia jest oczywiście OK, bo dioda świeci gdy zaprogramuje mikrokontroler, żeby świeciła cały czas. Problem jest natury programistycznej.

Opisze krótko co zrobiłem.
1.Działam na Atmedze8. Częstotliwość taktowania to 8MHz
2. Wybrałem sobie preskaler 1024. Czyli 8Mhz/1024=7812
Obsługa przerwań;
3. tworze zmienna licznik
4. w każdym przerwaniu ta zmienna ma zwiększać się o 1
5. jeżeli licznik osiągnie 7812 ( czyli po upływie 1 sekundy) ma nastąpić zmiana na pinie PB1 oraz wyzerowanie licznika.

Poniżej wklejam mój kod:

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



Ostatnio edytowano 5 gru 2014, o 19:42 przez fourfeeter, łącznie edytowano 3 razy

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 gru 2014, o 19:19 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

Weź jeszcze pod uwagę, że przerwanie wystąpi dopiero, gdy licznik timera0 się przekręci, czyli po zliczeniu 256 impulsów taktujących timer. Wzór na częstotliwość przerwań jest zatem następujący 8 MHz/1024/256 = 30 Hz.
W kodzie programu dodaj na końcu funkcji main pętlę while(1){}

PS.
Kody wkleja się przy pomocy SYNTAX wybierz -> C
Post możesz edytować klikając edytuj

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 gru 2014, o 19:38 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 05 gru 2014
Posty: 6
Pomógł: 0

Dzięki, za odpowiedź. Jasne, że problem tkwił w braku pętli while(1) {}. Ale tak początkujący mają, że nie pamiętają o rzeczach oczywistych.

PS
Gdy wklejam za pomocą znaczników syntax ucina mi fragmenty kodu
np.
"DDRB|=(1< " a powinno być "DDRB|=(1<<PB1);"
Da się to jakoś naprawić?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 gru 2014, o 19:40 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 16 mar 2014
Posty: 745
Lokalizacja: Warszawa
Pomógł: 32

Witamy :-)
Widzę, że kolega nowy, więc ja się pokuszę o wklejenie prawidłowego kodu dla Kolegi :-)
Poprawki zgodnie oczywiście z uwagami kolegi Krauser, który był szybszy :D

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

To jak Kolega początkujący, zresztą tak jak ja, to zachęcę do ładnego formatowania listingów, zdecydowanie lepiej się je czyta.
Przy okazji zobacz jak wygląda wstawiony kod poprzez opcję Syntax -> C.
Przyznasz, że wygodniej się czyta?

_________________
.



Ostatnio edytowano 6 gru 2014, o 20:19 przez MikieMan, łącznie edytowano 5 razy

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 gru 2014, o 19:44 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 05 gru 2014
Posty: 6
Pomógł: 0

Dzięki. Już potrafię też tak ładnie wklejać kod jak wy. :D



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 gru 2014, o 20:13 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

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

Jeszcze jedna uwaga do tej linii, bo ona wyzeruje cały port. 0 czyli 0b00000000 przesunięte w lewo o PB1 (które ma wartość 1) daje 0b00000000 i po iloczynie logicznym (czyli po kolei każdy bit) da w efekcie 0b0000000. Musisz na to uważać, bo można przypadkiem odpalić rakietę przy okazji zapalenia kontrolki.
Prawidłowo:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Jak PORTB = 0b10101010 to otrzymasz:
0b10101010 & ~(0b00000001 << 1) = 0b10101010 & ~(0b00000010) = 0b10101010 & 0b11111101 = 0b10101000

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 gru 2014, o 20:22 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 16 mar 2014
Posty: 745
Lokalizacja: Warszawa
Pomógł: 32

Krauser napisał(a):
Prawidłowo:
PORTB &= ~(1 << PB1);

Bardzo ważna uwaga. Dziękuję koledze za czujność. Poprawiłem kod w swoim poście powyżej.

_________________
.



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: 7 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

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


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:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO