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



Teraz jest 23 sty 2025, o 15:05


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 22 ] 
Autor Wiadomość
PostNapisane: 3 sie 2014, o 10:25 
Offline
Nowy

Dołączył(a): 19 lip 2014
Posty: 21
Pomógł: 0

Cześć, mam taki problem. Chcę dołożyć obsługę jumperka w programie do multipleksowania wyswietlacza 7 segomentowego.

Kod pierwotny - do mutlipleksowania- działa bez zarzutu.Natomiast gdy tylko dołoże kod do obslugi przycisku wywala błędy. Kombinowałem z nawiasami, srednikami, bez efektu. Może ktoś wie z czym problem jest?

W ogóle to chcę, przerobić to na licznik impulsów zliczanych z jumperka. Wystarczy mi nawet żeby liczył do 255. Lepiej zrobić to programowo czy poprostu dołożyć do Atmegi jakiś dekoder kodu BCD i z niego puścić sygnał na wyświetlacz?

poniżej program z pliku main.c:

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: 3 sie 2014, o 10:34 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 26 sie 2013
Posty: 119
Lokalizacja: Cinisi
Pomógł: 12

napisz na jaki uC to jest kod :)

------------------------ [ Dodano po: 4 minutach ]

dobra mam :) Tam gdzie masz makro KEY1 usun średnik :)

------------------------ [ Dodano po: 5 minutach ]

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


Autor postu otrzymał pochwałę

_________________
sig off :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 sie 2014, o 10:49 
Offline
Nowy

Dołączył(a): 19 lip 2014
Posty: 21
Pomógł: 0

Faktycznie, dzięki :)
Teraz działa przycisk, ale nadal rozkminiam jak zrobić z tego licznik :P



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 sie 2014, o 11:13 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 26 sie 2013
Posty: 119
Lokalizacja: Cinisi
Pomógł: 12

pomyśl trochę i się na pewno uda, to nie jest trudne :)

_________________
sig off :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 sie 2014, o 11:50 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 sty 2013
Posty: 426
Pomógł: 36

Uruchom przerwanie INTx i w obsłudze przerwanie po prostu inkrementuj zmienną i ją wyświetlaj na wyświetlaczu. Napisz coś więcej o tym liczniku.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 sie 2014, o 12:03 
Offline
Nowy

Dołączył(a): 19 lip 2014
Posty: 21
Pomógł: 0

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


Tak aktualnie wyglada kot. Narazie wrzucam tylko na 1 segment to co powinien wskazywać licznik.Niestety po naciśnięciu jumperka wyskakują przypadkowe znaki ;/



Ostatnio edytowano 3 sie 2014, o 12:12 przez MisiekZPieklaRodem, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 sie 2014, o 12:10 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 26 sie 2013
Posty: 119
Lokalizacja: Cinisi
Pomógł: 12

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


spróbuj w ten sposób:)

------------------------ [ Dodano po: 1 minucie ]

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

_________________
sig off :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 sie 2014, o 12:16 
Offline
Nowy

Dołączył(a): 19 lip 2014
Posty: 21
Pomógł: 0

Kaka licznik ma zliczać impulsy z jumperka i wyswietlic ich ilość na wyświetlaczu 7 segmentowym 4 cyfrowym. Ot cala filozofia.

Przerwan INT jeszcze nigdy w zyciu nie ustawialem.

------------------------ [ Dodano po: 21 minutach ]

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


Kot z delayem, dziala ale nie liczy.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 sie 2014, o 12:55 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 31 mar 2012
Posty: 177
Pomógł: 9

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


spróbuj tak


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 sie 2014, o 14:11 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 sty 2013
Posty: 426
Pomógł: 36

Program przez 80 ms nic nie robi. Co jeżeli w ciągu tych 80 ms klikniesz jumperka 2 razy? Program zliczy tylko jedno naciśnięcie. Także polecam zapoznać sie z notą katalogową procka i użyć przerwania INTx. Program będzie wtedy nie blokujący, przez co w czasie 80 ms bedziesz mógl kliknąć 10 razy a procek i tak to zliczy. Jak będziesz miał problemy ze skonfigurowaniem przerwania to pisz śmiało. Na pewno ktoś pomoże :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 sie 2014, o 21:42 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 31 mar 2012
Posty: 177
Pomógł: 9

kaka0204 napisał(a):
Program będzie wtedy nie blokujący, przez co w czasie 80 ms bedziesz mógl kliknąć 10 razy a procek i tak to zliczy.


oj chyba nie, bo właśnie o to chodzi, żeby tego nie zliczał. Ale fakt program będzie nieblokujący i też jako następny krok polecam zapoznanie się z timerami.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 sie 2014, o 19:19 
Offline
Nowy

Dołączył(a): 19 lip 2014
Posty: 21
Pomógł: 0

Czesc, mam taki kot, który przerobiłem dzięki NCIS. Wszystko działa, nawet dołożyłem jeszcze jeden jumperek, który zeruje i resetuje wyswietlacz. Działa on na przerwaniu timera0 Atmegi8, zatem włącza się po przepełnieniu. Tak czy siak działa to poprawnie.
Ale coś mi spedza sen z powiek.

1.Program kompiluje sie prawidłowo, bez błędów w consoli, ale w 76 linijce jest jakiś robaczek "possible assignment in condition 'licznik2=1" dlaczego tak sie dzieje i czy w przyszlości to nie bedzie stanowic jakiegos problemu?

2. Czy do obsługi jumpera mogę użyć procedury przerwania z pliku d_led.c jesli obsługuje on już multiplekser? A jesli tak to czy mogę do tego celu użyć tej zmiennej, która jest użyta w jego procedurze przerwania czy powołać nową zmienną volatile?



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: 4 sie 2014, o 20:54 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 sty 2013
Posty: 426
Pomógł: 36

Masz błąd, gdyż powinno być
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: 5 sie 2014, o 16:28 
Offline
Nowy

Dołączył(a): 19 lip 2014
Posty: 21
Pomógł: 0

A dlaczego ==1 a nie =1 ??



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 sie 2014, o 16:45 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 31 mar 2012
Posty: 177
Pomógł: 9

bo ==1 to : czy coś jest równe 1
a =1 to : zmienna = 1, czyli przypisanie wartości

___________________________

poza tym masz chyba nie tą konsole otwartą co trzeba jeżeli mówisz że nie pokazała błędów



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 sie 2014, o 18:39 
Offline
Nowy

Dołączył(a): 19 lip 2014
Posty: 21
Pomógł: 0

Jak dam ==1, to znika ten robaczek, ale za to pojawia sie jakis blad w linijce gdzie mam obsluge przerwania :/

W sumie wszystko dziala, wiec mam sie tym przejmowac i to drazyc czy olać ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 sie 2014, o 18:42 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 31 mar 2012
Posty: 177
Pomógł: 9

masz sie przejmować, powiedz jaki błąd masz jeszcze



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 sie 2014, o 19:27 
Offline
Nowy

Dołączył(a): 19 lip 2014
Posty: 21
Pomógł: 0

ISR(TIMER0_OVF_vect)
{
volatile uint8_t licznik2=1; <-- przy tej linijce mam warning: unused variable licznik2
}



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 sie 2014, o 20:01 
Offline
Użytkownik
Avatar użytkownika

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

Kompilator wywala ci ostrzeżenie bo stworzyłeś zmienną wewnątrz funkcji obsługi przerwania a nigdzie w kodzie jej nie używasz.

Zmienna utworzona wewnątrz przerwania nie jest tą samą zmienną utworzoną przed funkcją main mimo, że ich nazwy są takie same.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 sie 2014, o 07:58 
Offline
Nowy

Dołączył(a): 19 lip 2014
Posty: 21
Pomógł: 0

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


Pozmieniałem w kocie obslugę przerwania, przeczytalem jeszcze raz note aplikacyjna atmegi8 i wychodzi ze timer jest ok ustawiony , mimo to kot nie dziala. W ogole nie ma reakcji na obsluge przycisku jumper_down2. Wstawilem nawet debugrera na 1 diodzie i sie w tej obsludze nie zapala....wtf?
Anybody help?



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

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

Jeśli używasz biblioteki z BB do multipleksowania to właśnie z tego powodu nie działa ci przerwanie TIMER_OVF_wect bo ten sam timer ale w trybie CTC jest używany do multipleksowania. Obsługę przerwania Overflow zrób na np. Timerze2.

Poza tym masz w kodzie kilka baboli.
Przed funkcją main tworzysz zmienną licznik2 (linia 20) i wewnątrz przerwania też tworzysz zmienną licznik2 (linia 88). To nie są te same zmienne mimo, że mają takie same nazwy. Zwiększanie wartości licznika w przerwaniu nie będzie widoczne na zewnątrz przerwania np. w funkcji uint8_t key_down2(void). Z tego powodu warunek if(licznik2>1) nigdy ci nie zadziała.
Dlatego wywal to
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
z przerwania.

Zmienna licznik2 jest typu uint8_t a w przerwaniu masz warunek
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Ten warunek nigdy się nie spełni bo licznik2 przyjmuje wartości w przedziale 0...255.

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


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 sie 2014, o 13:29 
Offline
Nowy

Dołączył(a): 19 lip 2014
Posty: 21
Pomógł: 0

Dzięki Jacek, kot już działa. Zadziałał jak tylko wywaliłem tą linijkę ze zmienna w obsludze przrwania. Aczkowliek zostawiłem TImer0 ponieważ tak właśnie miało być, bo multipleksowanie jest zriobione na Timer2. W Atmega8 tylko Timer2 dzialać moze w trybie CTC, stad małe zamieszanie :)



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

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