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



Teraz jest 19 mar 2026, o 08:04


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 7 ] 
Autor Wiadomość
PostNapisane: 29 lip 2013, o 20:47 
Offline
Nowy

Dołączył(a): 29 lip 2013
Posty: 6
Pomógł: 0

Mam pewien problem z obsługą przerwania;/ Chce wyświetlać na 2 wyświetlaczach LED powiedzmy ,,stoper,,. zaczynamy od zera i co sekunde zmieniamy i dochodzimy ze na jednym (tym bardziej z lewej) jest cyfra 5, a na drugim (prawym) cyfra 9, czyli liczba 59 i nastepuje wyzerowanie i od nowa naliczamy. Napisałem kod, będąc dumny z niego (gdyż rozpoczynam dopiero programowanie mikrokontrolerów) nieco musiałem sie rozczarować gdyż cały czas na dwóch wyświetlaczach widnieją cyfry 0. Tak jakby nie wykonywane było przerwanie. Wie ktoś gdzie popełniłem błąd? Bo przyznam szczerze że nie mam juz siły walczyc z tym kodem;p
Oto kod:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Kody umieszczamy w znacznikach syntax=c Anty.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 lip 2013, o 21:21 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 sie 2012
Posty: 245
Lokalizacja: Kielce
Pomógł: 6

Te zmienne globalne (static) zadeklarowane na początku przerwania powinny być volatile.

Czyli tak:
volatile static int pomocnicza_glowna; //raz na poczatku zainicjalizowana zerem
volatile static int pomocnicza_jednostki; //raz na poczatku zainicjalizowana zerem
volatile static int pomocnicza_dziesiatki; //raz na poczatku zainicjalizowana zerem

_________________
1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 lip 2013, o 21:31 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 sie 2012
Posty: 245
Lokalizacja: Kielce
Pomógł: 6

nie zauważyłem

_________________
1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 lip 2013, o 21:32 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27450
Lokalizacja: Szczecin
Pomógł: 1045

Wojtek001 napisał(a):
Te zmienne globalne (static)


zmienne te (w przerwaniu) opatrzone specyfikatorem static nie są zmiennymi globalnymi tylko lokalnymi (chociaż tworzone są w obszarze zmiennych globalnych i dzięki temu inicjalizowane są zerem) a to jest różnica spora. Bo widoczne są TYLKO w ramach procedury obsługi przerwania.

A to powoduje, że tak jak wspominał wyżej Anty - w ogóle nie ma tu zastosowania specyfikator volatile

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 lip 2013, o 21:42 
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

Podsumowując specyfikator volatile powinny mieć zmienne globalne zmieniane w przerwaniu:
jednostki_sekund
dziesiatki_sekund

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 lip 2013, o 21:48 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 sie 2012
Posty: 245
Lokalizacja: Kielce
Pomógł: 6

mirekk36 napisał(a):
Wojtek001 napisał(a):
Te zmienne globalne (static)


zmienne te (w przerwaniu) opatrzone specyfikatorem static nie są zmiennymi globalnymi tylko lokalnymi (chociaż tworzone są w obszarze zmiennych globalnych i dzięki temu inicjalizowane są zerem) a to jest różnica spora. Bo widoczne są TYLKO w ramach procedury obsługi przerwania.

A to powoduje, że tak jak wspominał wyżej Anty - w ogóle nie ma tu zastosowania specyfikator volatile

Rzeczywiście, "sprzężenie zwrotne" podziałało ;)
Po prostu nie pomyślałem ze autor zastosował jakąś dziwną metodę z przepisywaniem do innej zmiennej (i odruchowo napisałem o tamtych zmiennych), i właśnie chodziło o te inne zmienne jak napisano w poście wyżej.

------------------------ [ Dodano po: 14 minutach ]

Oprócz tego co napisał Krauser pętla while w której robisz multipleks jest trochę dziwnie napisana (to nie jest twój aktualny problem ale kolejny jeśli się nie mylę):

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

IMHO to nie będzie działać przy innych cyfrach .
Co to jest za zapis?
PORTC = (~ PORTC) | jednostki_sekund;
powinno być:
PORTC = 0 | jednostki_sekund;

Zwróć uwagę że za pierwszym razem działa ci to dobrze bo masz przecież w PORTC na poczatku 0xff więc ~(oxff) to to samo co 0 ale przecież w PORTC może być cokolwiek.

_________________
1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 lip 2013, o 09:52 
Offline
Nowy

Dołączył(a): 29 lip 2013
Posty: 6
Pomógł: 0

Działa jak dałem volatile w tych dwóch zmiennych zmienianych w przerwaniu jednostki_sekund, dziesiatki_sekund. Dzieki wielkie;) Mam jeszcze pytanie. Antystatyczny napisał, że mój kod jest taki dogóry nogami ;) Czy naprawde powinno się w przerwaniu odświeżać i wyświetlać cyfry? W sumie zaczynając zabawe z przerwaniami, czytając co nie co stwierdziłem, że w przerwaniu powinno być możliwie jak najmniej kodu i np. dlatego zrobiłem wyświetlanie w pętli nieskończonej w main. Czy takie rozwiązanie to błąd początkującego? W sumie lepiej żebym teraz się podowiadywał i teraz zaczął poprawiać swoje błędy i pisał kod poprawnie zgodnie z jakimiś umownymi ,,estetycznymi,, normami niż później mając jakieś swoje wypracowane standardy pisanie kodu męczyć się ze zmianami;p I jeszcze Wojetk001 napisałeś, że: ,,Zwróć uwagę że za pierwszym razem działa ci to dobrze bo masz przecież w PORTC na poczatku 0xff więc ~(oxff) to to samo co 0 ale przecież w PORTC może być cokolwiek,,. Tam mam makrodefinicje WYGAS_SEGMENTY która ustawia stan wysoki na PORTC także jest ok:) Dzięki jeszcze raz wszystkim za pomoc i nie omieszkam zaglądać tu częściej ;)



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 0 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