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



Teraz jest 13 lut 2025, o 17:32


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 22 ] 
Autor Wiadomość
PostNapisane: 28 sty 2013, o 11:41 
Offline
Użytkownik

Dołączył(a): 20 sty 2012
Posty: 101
Pomógł: 5

Witam,
Jestem w trakcie kończenia projektu trzykanałowego sterownika RGB z użyciem wyświetlacza opisanego w drugiej książce Mirka. Napotkałem na duży problem: timer od progamowej generacji PWM powoduje zawieszanie się komunikacjii I2C, tzn. następuje brak reakcji na dotyk; po zakomentowaniu wszystkich elementów odpowiedzialnych za działanie timera (włącznie z jego konfiguracją) wyświetlacz śmiga aż miło :)
Domyślam się, że zrobiłem jakiś głupi błąd w programie, ale sam nie jestem w stanie tego rozwiązać. Proszę o pomoc ;)
Poniżej kod programu:


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


Kod programu w C umieszczamy w znacznikach 'syntax=c'...




Edit:
Zapomniałem dodać, że jako sterownika ekranu używam STMPE811 ;)



Ostatnio edytowano 28 sty 2013, o 14:24 przez coolpablos, łącznie edytowano 3 razy

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 sty 2013, o 12:39 
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

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

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

A w konfiguracji timera 0 używasz bitu WGM21 z rejestrów timera 2. Kompilator nic nie powie, ale jak czasem taki bit będzie na innej pozycji w to nie wiadomo o co chodzi. Oczywiście trudniej się sprawdza. Komentarze niezgodne z prawdą to też utrudnianie sobie roboty.

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 sty 2013, o 12:50 
Offline
Użytkownik

Dołączył(a): 20 sty 2012
Posty: 101
Pomógł: 5

Ale babol. Poprawiłem i bez zmian :(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 sty 2013, o 12:53 
Offline
Moderator
Avatar użytkownika

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

Krauser napisał(a):
Komentarze niezgodne z prawdą to też utrudnianie sobie roboty.


Jak widać nie tylko sobie ale i innym, do których się zwraca z pytaniem

_________________
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: 28 sty 2013, o 13:00 
Offline
Użytkownik

Dołączył(a): 26 lip 2012
Posty: 291
Lokalizacja: okolice Opola
Pomógł: 20

Ja proponuje zobaczyć w pliku lss w przerwaniu, czy aby na pewno zmienna cnt jest alokowana w ram a nie np. w rejestrze, niby static powinien to załatwić, jednak wolałbym sprawdzić, albo jeszcze lepiej zadeklaruj ją jako globalną volatile.

------------------------ [ Dodano po: 2 minutach ]

Druga rzecz to nie pilnujesz aby zmienna cnt się nie przepełniła, a wystarczy jeden if().

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 sty 2013, o 13:04 
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

1. Swój post możesz edytować. Wtedy inni (chętni do pomocy) nie będą zagubieni. Polecam również znaczniki syntax=c
2. Ten timer to ma mieć preskaler 1024 ?
3. Masz zewnętrzne rezystory podciągające na magistrali I2C ?

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 sty 2013, o 13:46 
Offline
Użytkownik

Dołączył(a): 20 sty 2012
Posty: 101
Pomógł: 5

Krauser napisał(a):
A w konfiguracji timera 0 używasz bitu WGM21 z rejestrów timera 2. Kompilator nic nie powie, ale jak czasem taki bit będzie na innej pozycji w to nie wiadomo o co chodzi. Oczywiście trudniej się sprawdza. Komentarze niezgodne z prawdą to też utrudnianie sobie roboty.


W zamyśle miał być timer0. Nie wiem dlaczego wpisałem WGM21 :oops: Co dziwne generowanie PWM działało poprawnie na programie który wklejiłem (fakt sprawdzony oscyloskopem)

krafin napisał(a):
Ja proponuje zobaczyć w pliku lss w przerwaniu, czy aby na pewno zmienna cnt jest alokowana w ram a nie np. w rejestrze, niby static powinien to załatwić, jednak wolałbym sprawdzić, albo jeszcze lepiej zadeklaruj ją jako globalną volatile.


PWM działa, co wydaje mi się, jest potwierdzeniem poprawności tej linijki kodu.

krafin napisał(a):
Druga rzecz to nie pilnujesz aby zmienna cnt się nie przepełniła, a wystarczy jeden if().


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

cnt jest deklarowany jako zmienna 8 bitowa, inkrementacja wartości cnt=255 powoduje przypisanie cnt=0 (chyba :)) jeżeli się mylę poprawcie mnie ;)

Krauser napisał(a):
1. Swój post możesz edytować. Wtedy inni (chętni do pomocy) nie będą zagubieni. Polecam również znaczniki syntax=c

Zrobione.
Krauser napisał(a):
2. Ten timer to ma mieć preskaler 1024 ?

Wg założeń teoretycznych miał być taki, jednak nie zgadzały się częstotliwości generowanego PWM-a, dlatego zacząłem kombinować (aktualnie jest ustawiony na 8). Naniosłem poprawki do wklejonego kodu.
Teraz to wogóle jestem zaskoczony, że generownie PWM działało.
Krauser napisał(a):
3. Masz zewnętrzne rezystory podciągające na magistrali I2C ?

Tak, 4,7k



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 sty 2013, o 16:36 
Offline
Użytkownik

Dołączył(a): 26 lip 2012
Posty: 291
Lokalizacja: okolice Opola
Pomógł: 20

To ja bym proponował wywalenie (zakomentowanie) obsługi buttonow na lcd, a zostawić pwm, i odczyt dotyku a jego dane wyświetlać gdzieś na lcd, aby było wiadomo czy faktycznie i2c i dotyk zaczynają szwankować, czy to jednak obsługa tych buttonow nie działa.

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 sty 2013, o 17:44 
Offline
Użytkownik

Dołączył(a): 20 sty 2012
Posty: 101
Pomógł: 5

krafin napisał(a):
To ja bym proponował wywalenie (zakomentowanie) obsługi buttonow na lcd, a zostawić pwm, i odczyt dotyku a jego dane wyświetlać gdzieś na lcd, aby było wiadomo czy faktycznie i2c i dotyk zaczynają szwankować, czy to jednak obsługa tych buttonow nie działa.


Właśnie o to chodzi, że program z "czystą obsługą" wyświetlacza działa. Mam na myśli przesuwanie suwaczków, wciskanie buttonów, zapis do EEPROM. Dopiero w momencie gdy dołączam część z PWM komunikacja się I2C się zawiesza kilku wykrytych dotykach, tzn. włączam urządzenie dotykam kilka razy wyświetlacza, zmieniam nastawy i boom - reakcja na dotyk zanika. Czasami zawiesza się po piewszym dotyku, czasami po 20.
Odczytywanie flagi przerwania działa - sprawdziłem to na prostym programiku który zmienia kolor tła przy każdym dotyku z czarnego na biały i odwrotnie.
Sam procesor też działa i o dziwo timer działał również, pomimo błędów w programie na które koledzy wyżej zwrócili uwagę. Sprawdziłem to robiąc prosty licznik - dodałem kilka linii kodu który zliczał sekundy. Stan licznika wyświetlany był na ekranie. Dodałem to do programu, który wkleiłem w pierwszym poście i to działało.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 sty 2013, o 20:20 
Offline
Użytkownik

Dołączył(a): 26 lip 2012
Posty: 291
Lokalizacja: okolice Opola
Pomógł: 20

Timer zawsze będzie działać bo wykonuje niezależnie od reszty programu, ja bym spróbował, wywalić na razie zapis do eeprom, albo zwiększyc prescalera timera do 64 (oczywiście jeśli nie będzie migotanie występowało), może być również tak, że brakuje miejsca na stos, chociaż nie masz tam dużych tablic, struktur więc raczej w to wątpię, ale zawsze taka możliwość istnieje.

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 sty 2013, o 20:43 
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

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

Kasowanie flagi jest na końcu, a nie na początku.

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 31 sty 2013, o 12:55 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 14 lut 2012
Posty: 598
Lokalizacja: Warszawa
Pomógł: 13

Bry ;)

A ja się z ciekawości zapytam z jaką częstotliwością popędzasz uC ? Bo 9 programowych timerów to nie w kij dmuchał .........



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 31 sty 2013, o 19:22 
Offline
Użytkownik

Dołączył(a): 20 sty 2012
Posty: 101
Pomógł: 5

Malutki_27 napisał(a):
Bry ;)

A ja się z ciekawości zapytam z jaką częstotliwością popędzasz uC ? Bo 9 programowych timerów to nie w kij dmuchał .........


Atmega128A@16MHz na zewnętrznym kwarcu

Krauser napisał(a):
Kasowanie flagi jest na końcu, a nie na początku.

To również nie przyniosło żadnych efektów.

Dziś zrobiłem pomiary oscyloskopem i zauważyłem, że STMPE811 nie generuje przerwania, tzn. generuje tylko kilka imulsów i koniec. Ilość tych impusów ściśle zależy od ustawionej częstotliowści PWM - im większa częstotliwość, tym szybciej układ się "zawiesi".

Sprawa ma się całkowicie inaczej gdy umieszczam w komentarzach konfigurację licznika:

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


Po załadowaniu tak skompilowanego programu przerwania od STMPE811 są generowane normalnie.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 31 sty 2013, o 19:41 
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

coolpablos napisał(a):
Dziś zrobiłem pomiary oscyloskopem i zauważyłem, że STMPE811 nie generuje przerwania, tzn. generuje tylko kilka imulsów i koniec. Ilość tych impusów ściśle zależy od ustawionej częstotliowści PWM - im większa częstotliwość, tym szybciej układ się "zawiesi".


Sprawdź co się stanie jak wyłączysz linie kodu odpowiedzialne za ustawianie wyjść:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 31 sty 2013, o 19:48 
Offline
Użytkownik

Dołączył(a): 20 sty 2012
Posty: 101
Pomógł: 5

Krauser napisał(a):
Sprawdź co się stanie jak wyłączysz linie kodu odpowiedzialne za ustawianie wyjść


Układ działa bez zmian ("zawiesza się")



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 31 sty 2013, o 19:54 
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

Jeszcze tylko sprawdź czy pomaga zmniejszenie prędkości I2C
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Mam ten wyświetlacz to sprawdzę to, ale na atmega644PA.

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 31 sty 2013, o 20:37 
Offline
Użytkownik

Dołączył(a): 26 lip 2012
Posty: 291
Lokalizacja: okolice Opola
Pomógł: 20

A spróbuj ustawić prescaler timera na np. 64 lub 256.

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 31 sty 2013, o 21:30 
Offline
Moderator
Avatar użytkownika

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

Krauser --> mam pytanie - czy ty gdy pisałeś swój sofcik na taki LCD to korzystałeś z jakiegoś timera ??? bo tu jest dziwna rzecz - rozmawiałem z kolegą przez Skype i oglądałem kod na żywo ... rzeczywiście nawet pusta procedura timera powoduje że po prostu jakby STMPE nie generował przerwań na linii IRQ - sprawdzane oscylem ponoć. A procek nie jest zawieszony - działa sobie dalej

więc interesuje mnie czy ktoś korzystał właśnie z jakichś przerwań od timerów przy takich LCD - dziwna rzecz - albo coś sprzętowo nie tak ?

_________________
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 lut 2013, o 13:02 
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

Odpaliłem kod u siebie na ATB z procesorem 644PA i kwarcem 16MHz. Działa w porządku. Może kolega pokaże ten fragment kodu z stmpe811.c i stmpe811.h, gdzie konfigurowane jest przerwanie.
Plik 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.

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

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

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


Załączniki:

Aby zobaczyć załączniki musisz się zalogować. Tylko zalogowani użytkownicy mogą oglądać i pobierać załączniki.

_________________
Dragonus Cracovus: Biomagia



Ostatnio edytowano 5 kwi 2013, o 16:34 przez Krauser, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 lut 2013, o 13:56 
Offline
Użytkownik

Dołączył(a): 20 sty 2012
Posty: 101
Pomógł: 5

Krauser napisał(a):
Odpaliłem kod u siebie na ATB z procesorem 644PA i kwarcem 16MHz. Działa w porządku. Może kolega pokaże ten fragment kodu z stmpe811.c i stmpe811.h, gdzie konfigurowane jest przerwanie.


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


Plik stmpe811.c:

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.


Działam na ATmega128A.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 lut 2013, o 14:14 
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

Z tego co tu widzę to jednak masz niski poziom, a nie opadające zbocze i tu jest problem.
Linię:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Zamień na:
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łę

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 lut 2013, o 04:01 
Offline
Użytkownik

Dołączył(a): 20 sty 2012
Posty: 101
Pomógł: 5

Zatrybiło. Wieeeeelkie dzięki Panowie ;) ;)



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