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

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA w 2025? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 19 kwi 2025, o 22:38


    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 ] [ Zaznacz wszystko ]
    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: 27375
    Lokalizacja: Szczecin
    Pomógł: 1043

    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: 27375
    Lokalizacja: Szczecin
    Pomógł: 1043

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