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



Teraz jest 29 mar 2024, o 11:54


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 8 ] 
Autor Wiadomość
PostNapisane: 22 lip 2016, o 22:47 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 cze 2013
Posty: 137
Lokalizacja: Kraków
Pomógł: 0

Cześć!
Od kilku dni męczę się z dziwnym zachowaniem programu. Używam timera0 do odmierzania timeoutu dla odbierania ramek po UART, i jednocześnie na pinach OC0A i OC0B mam wpięte ledy sygnalizacyjne. Z początku szukałem bugu w programie, później myślałem o zakłóceniach na zasilaniu podczas migania ledami, przeprogramowywałem nawet czas startu procka i wartość BODa.

Ostatecznie problemem okazały się być same piny OC0 - co dziwniejsze, nie ma znaczenia czy są tam wpięte diody czy nie. Po prostu samo miganie na tych pinach powoduje jakieś bliżej nieokreślone cuda wewnątrz timera0. Sam timer skonfigurowany jest tak że teoretycznie piny te pełnią funkcję zwykłych GPIO. Całość wygląda tak:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Czy któryś z szanownych forumowiczów spotkał się kiedyś z czymś takim? Osobiście skończyły mi się już pomysły...

_________________
Więcej dziwactw na: www.youtube.com/user/mopsiok



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 lip 2016, o 00:03 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 sty 2013
Posty: 1760
Pomógł: 196

Witam
A da się to jakoś zdefiniować?:
mopsiok napisał(a):
...powoduje jakieś bliżej nieokreślone cuda wewnątrz timera0.

Może jakieś przerwania "nachodzą na siebie"?
Jaki uC?
Taka szczypta kodu...

Pozdr.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 lip 2016, o 00:47 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 cze 2013
Posty: 137
Lokalizacja: Kraków
Pomógł: 0

Całość śmiga na atmedze168. Timer0 uruchamiany jest w momencie wykrycia początku ramki i odlicza czas po którym odebrany ciąg bajtów jest analizowany pod względem zgodności z protokołem. Gdy ledy są wpięte na wyjścia OC0A i OC0B, timer zaczyna wariować. Nie wiem dokładnie co mu się dzieje, ale moduł nadrzędny co chwila wyrzuca błędy że odbiornik nie odpowiada. Gdy tylko przepnę diody na dowolne inne piny, wszystko momentalnie ustaje i całość działa tak jak powinna bez żadnych błędów.

_________________
Więcej dziwactw na: www.youtube.com/user/mopsiok



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 lip 2016, o 20:56 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 mar 2014
Posty: 1475
Pomógł: 167

Gdy masz odpięte piny od timera to nie ma prawa być między nimi żadnych zależności.
Sprawdź dokładnie jak masz napisane sterowanie diodami, bo tutaj może masz jakiś błąd i coś nadpisujesz.

--
Pozdrawiam,
Robert



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 lip 2016, o 21:01 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 sty 2013
Posty: 1760
Pomógł: 196

kicajek napisał(a):
Taka szczypta kodu...
;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 lip 2016, o 02:40 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 cze 2013
Posty: 137
Lokalizacja: Kraków
Pomógł: 0

rskup napisał(a):
Gdy masz odpięte piny od timera to nie ma prawa być między nimi żadnych zależności.

I właśnie dlatego tak bardzo mnie zdziwiło gdy to wyszło na jaw... Sterowanie diodami to w zasadzie żadna wymyślna filozofia:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Diody załączam kiedy chcę a kasuję po krótkim czasie w pętli głównej przy pomocy leds_off().


kicajek napisał(a):
Może jakieś przerwania "nachodzą na siebie"?
Jaki uC?
Taka szczypta kodu...

Całość lata na atmedze168, a jedyne przerwania w programie to 2 timery i obsługa UARTu. Timery odpowiadają za generowanie opóźnień i są odpalane w kompletnie niezwiązanych "wątkach". Już pojęcia nie mam co tu może być nie halo... skonfiguruję ledy na dowolne inne wyjścia i wszystko śmiga, a po przeniesieniu na OC0A/B całość po chwili się sypie. Jedyne co mi przychodzi do głowy to że timer jednak jest skonfigurowany nie tak jak trzeba, ale piąty raz patrzyłem do noty i ewidentnie przy tej konfiguracji piny są odłączone...

_________________
Więcej dziwactw na: www.youtube.com/user/mopsiok



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 lip 2016, o 12:28 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 mar 2014
Posty: 1475
Pomógł: 167

Bez kompletnego kodu to ciężko jest coś poradzić. Na pewno masz gdzieś jakiś błąd.
O tyle ciekawe jest, że piny OC0x są pinami wyjściowymi i jedynie jak je podepniesz do timera to będziesz miał tylko na ich wyjściu inne funkcje niż zwykłe piny i/o. Więc nawet w takiej postaci nie będą one wpływały na działanie timera.
Czy przypadkiem jak zamieniasz diody to nie przepinasz także innych funkcjonalności z tych zamienianych pinów i dlatego działa?
Patrząc się na kod zwróć uwagę, że piny USART i OC0x są na porcie D, może coś masz nie tak w związku z tym. Czy jak diady lądują na innych pinach portu D to program działa?
Czy sprawdzałeś czy jak nie włączysz timera to masz nadal wyrzucanie błędów na komunikacji UART przy podłączonych diodach na OC0x? Może sam timer nie ma wpływu na problem a źródłem jest inny moduł?

Proponuję Ci zrobić kopię projektu i na nim usuwać kolejne funkcje i patrzyć kiedy zacznie działać.

A tak ode mnie, to ja jakoś zawsze "zatrzymuję" timer poprzez wyłączenie jego przerwania a nie przez zatrzymywanie zegara taktujące (np. ustawienie i kasowanie bitu TOIE0 w TIMSK0 - tylko pamiętaj przed włączeniem przerwania, a po załadowaniu wartości, musisz wykasować flagę przerwania TOV0 w TIFR0 poprzez wpisanie jedynki). Może zmień na takie zatrzymywanie i sprawdź czy to coś zmieni.

--
Pozdrawiam,
Robert



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 lip 2016, o 13:09 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 cze 2013
Posty: 137
Lokalizacja: Kraków
Pomógł: 0

rskup napisał(a):
A tak ode mnie, to ja jakoś zawsze "zatrzymuję" timer poprzez wyłączenie jego przerwania a nie przez zatrzymywanie zegara taktujące (np. ustawienie i kasowanie bitu TOIE0 w TIMSK0 - tylko pamiętaj przed włączeniem przerwania, a po załadowaniu wartości, musisz wykasować flagę przerwania TOV0 w TIFR0 poprzez wpisanie jedynki). Może zmień na takie zatrzymywanie i sprawdź czy to coś zmieni.


Ja też tak zawsze robiłem ;). Kod nie jest mój, a jedynie wykorzystuję go w projekcie żeby mieć pewność kompatybilności z całym systemem, dlatego też nic tam nie ruszałem póki co. Ale chyba pora się pobawić, zrobię tak jak sugerujesz - kopia całości a potem do dzieła ;).
Dzięki za rady, będę walczyć i dam znać jakby coś ruszyło.

_________________
Więcej dziwactw na: www.youtube.com/user/mopsiok



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

Strefa czasowa: UTC + 1


Kto przegląda forum

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