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



Teraz jest 19 kwi 2024, o 23:24


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 25 ] 
Autor Wiadomość
PostNapisane: 1 mar 2020, o 11:38 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2017
Posty: 547
Pomógł: 0

Witam.

Borykam się z pewnym problemem z wiązanym z działaniem przycisku w programie przy wykorzystaniu programu w ATTINY 13.
Przycisk podłączony jest do portu PB0

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


Wciśnięcie przycisku i włączeniu zasilania powoduje że że pewna zmienna w EPROMIE jest zerowana i to działa.
Ale jeśli w pętli while(1) wcisnę ponownie to funkcja wykonuje się cały czas pomimo że że przycisk już dawno jest puszczony???

Założenie moje jest takie żeby przy pomocy funkcji test() odczytać zmienną a program żeby wrócił do pętli i się nie wykonywał no chyba że znowu nacisnę przycisk.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 mar 2020, o 12:02 
Offline
Użytkownik

Dołączył(a): 09 lut 2017
Posty: 73
Lokalizacja: 51°03′22″N 15°45′48″E
Pomógł: 18

Kiedy wciśniesz przycisk, funkcja test() jest wywoływana wielokrotnie w pętli while do momentu puszczenia tego przycisku. Musisz dać zabezpieczenie (np. jakąś flagę), żeby funkcja nie została ponownie wywołana do momentu puszczenia przycisku plus jakąś prostą eliminację drgań styków.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 mar 2020, o 12:22 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2017
Posty: 547
Pomógł: 0

No dobra ale naciskam a potem puszczam na bardzo długi czas i czekam aż wykona się funkcja test() i przycisku nie wciskam ponownie a funkcja test wykonuje się w nieskończoność , nie ma mowy tu o drganiach
styków bo w pewnym momencie nie naciskam to dlaczego warunek wciśnięcia jest spełniany????



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 mar 2020, o 12:33 
Offline
Użytkownik

Dołączył(a): 09 lut 2017
Posty: 73
Lokalizacja: 51°03′22″N 15°45′48″E
Pomógł: 18

Pewnie adres funkcji jest po kolei odkładany na stosie i po puszczeniu przycisku funkcja jest po kolei wywoływana. Jeśli dodasz eliminacje drgań styków a funkcja zdąży się wykonać w czasie drgań, to już problem częściowo powinien zniknąć.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 mar 2020, o 12:58 
Offline
Użytkownik

Dołączył(a): 11 sty 2015
Posty: 166
Pomógł: 24

A jak podłączyłeś przycisk? Zwierasz go do masy czy do VCC?
Sprawdzałeś, czy nie jest walnięty?
I co masz w funkcji test(), bo tam też może być babol.

Adam12 napisał(a):
Pewnie adres funkcji jest po kolei odkładany na stosie i po puszczeniu przycisku funkcja jest po kolei wywoływana. Jeśli dodasz eliminacje drgań styków a funkcja zdąży się wykonać w czasie drgań, to już problem częściowo powinien zniknąć.


Nic się nie powinno odkładać na stosie bo niby dlaczego?
Dopóki nie wyjdziesz z funkcji, nie wrócisz do pętli while i nic się nie będzie odkładać na stosie.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 mar 2020, o 13:20 
Offline
Użytkownik

Dołączył(a): 09 lut 2017
Posty: 73
Lokalizacja: 51°03′22″N 15°45′48″E
Pomógł: 18

Cytuj:
Nic się nie powinno odkładać na stosie bo niby dlaczego?
Dopóki nie wyjdziesz z funkcji, nie wrócisz do pętli while i nic się nie będzie odkładać na stosie.

No fakt, coś mi się pokręciło, po wyjściu z funkcji jej adres znika ze stosu. To rzeczywiście może być problem z przyciskiem lub funkcją test().



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 mar 2020, o 13:24 
Offline
Użytkownik

Dołączył(a): 11 sty 2015
Posty: 166
Pomógł: 24

Najprędzej przycisk jest podłączony inaczej niż w definicji KEY_DOWN, ale wróżką nie jestem.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 mar 2020, o 13:54 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2017
Posty: 547
Pomógł: 0

Przycisk oczywiście zwiera do GND .
Pokaże funkcje test();

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: 1 mar 2020, o 14:16 
Offline
Użytkownik

Dołączył(a): 11 sty 2015
Posty: 166
Pomógł: 24

A sprawdzałeś ile wykorzystałeś Ram'u, może nadpisujesz stos i procek Ci się restartuje, lub idzie w maliny?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 mar 2020, o 14:36 
Offline
Użytkownik

Dołączył(a): 14 sie 2016
Posty: 905
Pomógł: 39

Po czym poznajesz że funkcja wykonuje się w kółko?
Przelatują diodki po kolei?
Czy funkcja "przerwa" to tylko delay?

_________________
Moje porady są błędne,nie czytać,zbanować od razu.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 mar 2020, o 14:54 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2017
Posty: 547
Pomógł: 0

----------------
Device: attiny13

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


diodki przelatują po kolei problem w tym że mają przelecieć , apotem pętla główna powinna normalnie działać a tu cały czas funkcja test() działa wkoło Wojtek obserwuje i liczę ile razy działają.



Ostatnio edytowano 1 mar 2020, o 14:58 przez AKSELINEK, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 mar 2020, o 14:57 
Offline
Użytkownik

Dołączył(a): 11 sty 2015
Posty: 166
Pomógł: 24

Czy masz podciąganie sprzętowe na wejściu z przycisku. Jeżeli w którejś z funkcji banglującej diodami, zerujesz PB0, to zanim przeładują się pojemności i ponownie ustabilizuje się stan wysoki już masz kolejne wywołanie funkcji i tak w kółko. Daj delaya(), albo podciągnij wejście.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 mar 2020, o 15:00 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2017
Posty: 547
Pomógł: 0

no tak ale na końcu funkcji test() jest komenda :

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


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: 1 mar 2020, o 15:05 
Offline
Użytkownik

Dołączył(a): 11 sty 2015
Posty: 166
Pomógł: 24

Cytuj:
no tak ale na końcu funkcji test() jest komenda :

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 mnie zastanowiło po co to tu dałeś.
Wywołaj za tym jeszcze _delay_ms(100);
i zobaczymy czy pomoże.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 mar 2020, o 15:25 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2017
Posty: 547
Pomógł: 0

Wywołałem i nie pomogło.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 mar 2020, o 16:07 
Offline
Użytkownik

Dołączył(a): 22 kwi 2017
Posty: 99
Lokalizacja: Piła
Pomógł: 4

A spróbuj po if-ie w pętli głównej dodać delaya. Bo jeśli w głównej pętli nie masz nic poza tym if-em to zmuś do opuszczenie funkcji test(), albo w funkcji test() na końcu sprawdź stan PB0 i break.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 mar 2020, o 16:41 
Offline
Moderator
Avatar użytkownika

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

AKSELINEK napisał(a):
PORTB = ~(zolt);

No toż przecież tutaj wyłączasz zapewne podciąganie pinu na PB0 i zaczyna się amba

_________________
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: 1 mar 2020, o 16:44 
Offline
Użytkownik

Dołączył(a): 09 lut 2017
Posty: 73
Lokalizacja: 51°03′22″N 15°45′48″E
Pomógł: 18

No ale zaraz... w funkcji przerwa() są dwa delaye po 3000ms czyli łącznie test() będzie działał 36 sekund. Dobrze widzę?

Cytuj:
AKSELINEK napisał(a):
PORTB = ~(zolt);

No toż przecież tutaj wyłączasz zapewne podciąganie pinu na PB0 i zaczyna się amba


No tak, ale jak to już wyżej kolega pisał, na końcu funkcji test() jest PORTB |= KEY_PIN; co powinno załatwić sprawę.

Pokaż cały kod bo może masz coś pomieszane w funkcjach sterujących diodami albo ich inicjalizacją. Na razie zamiast dodawać jakieś delaye to lepiej zostaw jakieś kontrolne mignięcie jedną diodą i po kolei wywalaj poszczególne funkcje z pętli while aż znajdziesz źródło problemu.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 mar 2020, o 18:50 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2017
Posty: 547
Pomógł: 0

Po ostatniej 6-tej (ostatniej) wykonanej funkcji() mierzę napięcie na pinie PB0 i jest 5V to znaczy że faktycznie PORTB |= KEY_PIN; załatwia sprawę , ale funkcja test() dalej się zaczyna wykonywać.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 mar 2020, o 19:10 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lis 2015
Posty: 1448
Lokalizacja: okolice Warszawa
Pomógł: 149

Witam,
przyjrzyj się funkcji przerwa();
w jakim celu wyłączasz na prawie całym PORTB pullup'a na wejściach?
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: 1 mar 2020, o 19:40 
Offline
Użytkownik

Dołączył(a): 27 maja 2019
Posty: 27
Pomógł: 0

Jestem bardzo początkującym, co oznacza PORTB = (1 << PB2); czy to jest stan wysoki czy niski ? Co to znaczy?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 mar 2020, o 19:44 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2017
Posty: 547
Pomógł: 0

Przepisałem program na ATMEGE 32 i odpaliłem zestaw ATB I TU WSZYSTKO HULA....



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 mar 2020, o 19:48 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lis 2015
Posty: 1448
Lokalizacja: okolice Warszawa
Pomógł: 149

PORTB = (1<<PB2);
oznacza że jeżeli port jest wejściem to ustawia na wybranym bicie "PB2" podciąganie do vcc a na pozostałych je wyłącza, natomiast jeżeli port jest wyjściem to ustawia stan wysoki na tym bicie a na pozostałych niski.
trochę inaczej ma się sytuacja gdy wpiszemy
PORTB |= (1<<PB2); wtedy ustawiany jest tylko ten jeden bit w porcie a reszta pinów pomijana.

@ "mocartp", jeżeli jesteś zainteresowany zgłębianiem języka C na AVR'ki który przydaje się także potem na innych prockach i nie tylko,
to gorąco polecam zacząć od tej lekturki. :)
_link_



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 mar 2020, o 22:51 
Offline
Użytkownik

Dołączył(a): 11 sty 2015
Posty: 166
Pomógł: 24

AKSELINEK napisał(a):
Przepisałem program na ATMEGE 32 i odpaliłem zestaw ATB I TU WSZYSTKO HULA....


Czyli sprawdź jeszcze raz czy po stronie sprzętowej masz wszystko w porządku.
Jeżeli tak, to jednak przepełniłeś stos.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 mar 2020, o 08:24 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2017
Posty: 547
Pomógł: 0

Faktycznie masz racje miałem upalony mikrokontroler.



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

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 7 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