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



Teraz jest 11 cze 2025, o 13:13


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 13 ] 
Autor Wiadomość
PostNapisane: 23 sie 2015, o 18:40 
Offline
Użytkownik

Dołączył(a): 16 sty 2012
Posty: 78
Pomógł: 1

Do obsługi LCD soft Mirka i działa ok.
Funkcja zczytywania stanu klawiatury odpalona bezpośrednio w main chodzi bez zarzutu, analogicznie samo przerwanie odpalone "pojedynczo" w main działa też prawidłowo.
Po połączeniu razem przerwanie INT0 nie włącza czytania klawiatury .... Weźcie pod uwagę że to jedne z pierwszych programów więc trywialne błędy całkiem możliwe.
Oczywiście kompilować się kompiluje ok ale nie działa ....
Będę kombinował sam ale może jakaś podpowiedź chociaż ....



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



Ostatnio edytowano 23 sie 2015, o 23:04 przez tomek, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 sie 2015, o 19:00 
Offline
Moderator
Avatar użytkownika

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

No nie działa bo zakomentowałeś całą pętlę gówną w funkcji main() ... więc program po włączeniu od razu kończy działanie ... a tymczasem w totalnych podstawach C, w BB masz napisane, że taka pętla musi być - więc ją odkomentuj przede wszystkim, może być nawet pusta

no i źle listing wstawiłeś - zajrzyj tutaj: topic7402.html jak to się robi ok?


Autor postu otrzymał pochwałę

_________________
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: 23 sie 2015, o 19:04 
Offline
Użytkownik

Dołączył(a): 04 cze 2013
Posty: 517
Pomógł: 26

Kolego według mnie zły pomysł wykonywać to " scankbd()" w przerwaniu.


Autor postu otrzymał pochwałę

_________________
Przewodnik|Sterownik akwariowy



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 sie 2015, o 19:06 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 gru 2014
Posty: 1540
Pomógł: 269

Usuń tą linię nr1, bo ciężko się tak czyta kod (wszystko jest zakomentowane). ;)


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 sie 2015, o 20:00 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 17 sie 2013
Posty: 3797
Lokalizacja: Grudziądz
Pomógł: 143

a ja widzę i we while i w przerwaniu funkcję

scankbd();

co prawda we while zakomentowane ale i while(1) zakomentowane więc nie zadziała ci program

na początek zamiast odkomentowywać całe while zrób tak:

while(1);

i na samej górze 1 linia również ci broi.


Autor postu otrzymał pochwałę

_________________
Usługi druku przestrzennego - www.drumik.pl



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 sie 2015, o 23:14 
Offline
Użytkownik

Dołączył(a): 16 sty 2012
Posty: 78
Pomógł: 1

Sorka za "zakomentowaną" pierwszą linie , źle wkleiłem listing z Eclipsa ....
Już poprawiłem ... zwaliła mi się Rodzinka więc nie mam jak posiedzieć teraz , jak pójdą sobie zaglądnę ....
na spokojnie przemyślę Wasze uwagi i spróbuję poprawić uwzględniając Wasze sugestie ...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 sie 2015, o 19:28 
Offline
Użytkownik

Dołączył(a): 16 sty 2012
Posty: 78
Pomógł: 1

Wklejam jeszcze raz z małymi poprawkami. Powiem do czego doszedłem a do czego nie ....
Więc jest tak :
Po resecie i wciśnięciu dowolnego klawisza startuje przerwanie i funkcja scankbd(void) coś tam robi
ale numeru klawisza nie zwraca. I teraz uwaga... bo będzie cud :D
Jak wywołam INT0 "ręcznie" czyli dam masę na moment na pina, funkcja się "naprawia" i od tego czasu
już prawidłowo odczytuje i wyświetla na LCD numery klawiszy ....
Wydaje mi się że sam kod funkcji jest w miarę ok bo jest stosunkowo prosty i w main samodzielnie działa ok.
Tak intuicyjnie przez skórę czuję że coś może być na rzeczy z inicjowaniem zmiennych i tym co się z nimi dzieje podczas obsługi przerwania ...
Przeczytałem na ten temat parę zdań w rozdziale o sterowaniu Ledami w BB Mirka i o przedrostku "static" ale za mało wiem jeszcze, żeby to świadomie analizować.
Generalnie podsumowując mój problem można to ująć tak :
co trzeba zmienić w funkcji która samodzielnie w main działa prawidłowo ale wywołana w przerwaniu działa wadliwe ?





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



Ostatnio edytowano 24 sie 2015, o 21:19 przez tomek, łącznie edytowano 1 raz

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

Dołączył(a): 20 sie 2013
Posty: 795
Lokalizacja: Poznań
Pomógł: 59

tomek napisał(a):
uint8_t KEY ;


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

http://mirekk36.blogspot.com/2011/08/test.html



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 sie 2015, o 20:26 
Offline
Użytkownik

Dołączył(a): 16 sty 2012
Posty: 78
Pomógł: 1

z volatile i static próbowałem, niestety odczytywanie stanu klawiszy zaczyna działać dopiero po "twardym INT0" czyli zwarciu "z ręki" ....
zobaczę zaraz ten artykuł .... dam znać jak sprawdzę do czego doszedłem .... idę czytać



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 sie 2015, o 21:29 
Offline
Użytkownik

Dołączył(a): 16 sty 2012
Posty: 78
Pomógł: 1

Dziwne ... po wciśnięciu klawisza odczytywane jest jego numer ale wygląda na to że program "nie wychodzi" z tego przerwania ..... tak jakby obsługa przerwania działała jak:

while(1)
{
obsługa przerwania
}



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 sie 2015, o 23:48 
Offline
Użytkownik

Dołączył(a): 16 sty 2012
Posty: 78
Pomógł: 1

Doczytam jeszcze trochę ... a rano spróbuję napisać programik odczytujący klawisze ale bez pętli żeby wywalić zmienne ... zobaczymy jak ten będzie się zachowywał w przerwaniu



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 sie 2015, o 08:38 
Offline
Użytkownik

Dołączył(a): 16 sty 2012
Posty: 78
Pomógł: 1

Wygląda na to że kod obsługi przerwania powinien być bardzo "zwarty" i nie należy w nim umieszczać odwołań gdzieś "daleko...."



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 sie 2015, o 22:46 
Offline
Użytkownik

Dołączył(a): 16 sty 2012
Posty: 78
Pomógł: 1

Uparłem się że rozwiążę problem z prawidłowym odczytem klawiszy klawiatury matrycowej w przerwaniach i rozwiązałem.
Problem okazał się dość zakręcony i bardziej natury elektronicznej niż informatycznej, układ zachowywał się się dość dziwnie ....
Teoretycznie wszystkie bloki w mikrokontrolerze są taktowane i synchronizowane zegarem.
Okazuje się jednak że bufory portów wprowadzają jakieś małe opóźnienia przy wystawianiu i odczytywaniu stanów pinów z zewnątrz.
W przypadku programu u mnie okazało się że kiedy wystawiam bajt na port zewnętrzny B i od razu próbuję go odczytać nie dało się tego zrobić prawidłowo .....
Niestety nie znam innej metody na krótkie opóźnienie więc wykorzystałem pomysł z wprowadzeniem operacji NOP w asemblerze, wstawiłem volatile bo kompilator
kasował NOP bez volatile. Okazuje się też że różne mikrokontrolery mają to opóźnienie w buforach różne ... W ATmega 16 u mnie taktowanej 8MHz zegarem musiałem wstawić
4 NOPy żeby port czytał poprawnie a w ATmega 8 wystarczą 2 NOPy
Poniżej prosty i działający kod wykorzystujący przerwanie co ok. 1/50 sek z 8 mio bitowego timera.

Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
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  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 13 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Majestic-12 [Bot] i 17 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:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO