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



Teraz jest 30 sty 2025, o 21:32


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 38 ]  Przejdź na stronę 1, 2  Następna strona
Autor Wiadomość
PostNapisane: 8 mar 2013, o 10:43 
Offline
Użytkownik

Dołączył(a): 01 sty 2013
Posty: 169
Pomógł: 0

Hej.
Chcę zrealizować termometr z zegarem. Od bardzo dawna nosiłem się z tym zamiarem, ale w między czasie odbiłem się od kilku ścian. Projekt jest bardzo prosty - przynajmniej na ten czas. Kupiłem 4centymetrowe wyświetlacze LED w pięknym pomarańczowo czerwonym kolorze, stworzyłem układ na atmedze16 taktowanej 16 MHz kwarcem, na płytce umieściłem też PCF'a do RTC Pomysł i realizację pomiaru temperatury z DS18B20 zaczerpnąłem z książki Mirka. Wszystko działa ładnie (oprócz jeszcze zegara) tylko nie ma kropki. Wziąłem się za to bo jak sądziłem to nie problem, pomyślałem, że stworzę zmienną Volatile o nazwie kropka, i w zależności od jej wartości 1-4 będzie się kropka wyświetlała na jednym z czterech wyświetlaczy Jeśli będzie 0 to kropka nie będzie wyświetlana. Natomiast w programie obsługi przerwania w każdej linijce gdzie jest wywoływana cyfra dodam jeszcze jeden warunek właśnie na wyświetlanie tej kropki. Nic prostszego. Zrobiłem to tak:

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


Oczywiście w pętli głównej ustawiłem na sztywno że kropka = 1.
i co? - i nie działa! W dziewiątej linijce powyższego kodu są wykonywane czynności dotyczące wyświetlania cyfry i to działa, bo cyfry są wyświetlane prawidłowo Linijkę niżej, napisałem żeby: Jeśli zmienna kropka ma wartość 1 to do wartości wysłanej na port LED_DATA - dodaj jeszcze jedynkę na siódmym bicie tego portu (bo na tym bicie mam kropkę, która zapalana jest jedynką) Gdzie popełniłem błąd w rozumowaniu?

Ponieważ nie jest to przedstawienie gotowego projektu, a opis problemu przenoszę do Języka C - Zielony J.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 mar 2013, o 11:01 
Offline
Moderator
Avatar użytkownika

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

A gdzież kolega umieścił tę zmienną ? ;)

volatile uint16_t kropka;

jako lokalną w przerwaniu ? to chyba jakaś globalna pomyłka hmmm ? ;)

_________________
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: 8 mar 2013, o 11:04 
Offline
Użytkownik

Dołączył(a): 01 sty 2013
Posty: 169
Pomógł: 0

Masz rację, ale napisałem wyżej , że ja kropkę zapalam stanem wysokim, bo wykorzystuję do tego tranzystor NPN katody zaś steruję z drivera ULN i również zapalam je stanem wysokim.

Problem rozwiązałem, zapomniałem zmienną kropka zadeklarować jako extern volatile a zadeklarowałem ją jako tylko volatile Wszystko już działa. Dzięki Antystatyczny

Zmienną kropka zadeklarowałem roboczo w pliku main a także i w tym przerwaniu. Teraz już ją przełożyłem do pliku nagłówkowego Dzięki squeez i mirku. I oczywiście nie jako uint16_t tylko wystarczyło uint8_t. Przepraszam za zamieszanie, ale trochę jestem panikarz jak mi coś nie wychodzi.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 mar 2013, o 10:03 
Offline
Użytkownik

Dołączył(a): 01 sty 2013
Posty: 169
Pomógł: 0

Kontynuując temat mojego termometru z zegarem, mam kolejne pytanie:
Z uwagi na to, że wyświetlacze są duże, w nocy świecą bardzo jasno. Chciałbym zrobić jakiś programowy PWM, który choćby w kilku stopniach regulował jasność wszystkich czterech wyświetlaczy, a czyniłby to na podstawie wartości rezystancji fotorezystora podpiętego pod ADC. Widziałem temat Antystatycznego, jednak on steruje katodami i to w funkcji zmiany cyfr. Obawiam się również za dużej ilości operacji w przerwaniu w przypadku takiego rozwiązania. Sama realizacja odczytu ADC nie nastręcza mi problemów ale nie mam pomysłu na temat realizacji programowego PWMa.

Myślałem też o możliwości sterowania anod wyświetlacza tranzystorem podłączonym do sprzętowego PWMa ale wydaje mi się że może to wprowadzić zakłócenia interferencji częstotliwości przemiatania z częstotliwością PWM. Z resztą w przypadku PWMa programowego również nie mam pewności że sygnały nie będą się zakłócać.

Może ktoś borykał się już z takim problemem i może mi wskazać które rozwiązanie będzie bardziej właściwe?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 mar 2013, o 10:35 
Offline
Moderator
Avatar użytkownika

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

Posłuchaj jak zrobisz PWM sprzętowy o częstotliwości kilka kHz i będziesz nim sterował prąd wszystkich anod przez jeden tranzystor - to o jakich ty interferencjach mówisz ? ;)

I to jest właśnie najprostsze rozwiązanie bo przy programowej wersji PWM'a nie uzyskasz z kolei tak wysokiej jego częstotliwości.....

Nadmienię, że właśnie w ten sposób (sprzętowy PWM) realizowałem już wiele razy sterowanie ściemnianiem/rozjaśnianiem takich wyświetlaczy .... zresztą zobacz np ten:

http://www.elektroda.pl/rtvforum/topic678948.html

_________________
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: 9 mar 2013, o 11:03 
Offline
Użytkownik

Dołączył(a): 01 sty 2013
Posty: 169
Pomógł: 0

A ja znalazłem w pewnej książce takie rozwiązanie, że multipleksowanie jest w trybie NORMAL a druga jakby część timera pracuje w trybie CTC i przerwanie wywołane w tym trybie wyłącza wszystkie wyświetlacze. Nietrudno się domyślić, że od wartości w tamtym przypadku OCR0A będzie zależał czas wyświetlania każdej cyfry a co za tym idzie ich jasność.
Problemem jest tylko to , że w tamtym programie TIMER0 posiada te tak jakby dwa tryby, czy dwie części, któych to rejestrów nie posiada ATMEGA 16. Próbowałem wykorzystać do tego TIMER1 ATMEGI16 bo widziałem podobne nazwy rejestrów ale coś nie wychodzi. Spróbuję jeszcze zsynchronizować do tego TIMER2, ale nie wiem czy w dobrym kierunku idę.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 mar 2013, o 11:21 
Offline
Moderator
Avatar użytkownika

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

No dokładnie jeśli można poświęcić kolejny timer na to, to również dobre rozwiązanie

_________________
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: 9 mar 2013, o 11:48 
Offline
Użytkownik

Dołączył(a): 01 sty 2013
Posty: 169
Pomógł: 0

Super Przełożyłem multipleksowanie na TIMER1 i użyłem trybu zwykłego - Działa

Wskazałem, że dla kanału A tego timera używam trybu CTC
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Dalej zezwolenia na przerrrwania od przepełnienia i dla CTC
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

I wpisałem maksymalne wartości dla OCR1AH i OCR1AL
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Działa, ale tylko z takimi wartościami. Jeśli choć o jeden zmniejszę którykolwiek z OCR1A znika mi całkowicie wyświetlanie.

W obsłudze przerwania trybu CTC mam takie coś:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Ma ktoś jakąś wskazówkę jak tym zarządzać ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 mar 2013, o 12:13 
Offline
Moderator
Avatar użytkownika

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

OOOO jej a skąd ci się coś takiego strasznego wzięło ???

Kod:
asm volatile("RETI\n\t"::);


przecież wcześniej nie miałeś w swoich kodach TAKICH "kwiatków" :( .... to na pewno wywal - ponieważ asemblerowy rozkaz RETI jest w prologu makra automatycznie dokładany - nie może być inaczej .... a gdy tak robisz to rąbiesz stos na śmierć :(

_________________
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: 9 mar 2013, o 12:16 
Offline
Użytkownik

Dołączył(a): 01 sty 2013
Posty: 169
Pomógł: 0

ale funkcja obsługi przerwania jest z atrybutem NAKED bo w tym kodzie tylko ustawiam porty a to nie wymaga zaangażowania żadnych rejestrów procesora i wtedy nie ma prologu ani epilogu i trzeba to dodać "ręcznie"



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 mar 2013, o 12:55 
Offline
Moderator
Avatar użytkownika

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

No tak - ślepota ze mnie ;) przepraszam nie zauważyłem ISR_NAKED

_________________
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: 9 mar 2013, o 22:40 
Offline
Użytkownik

Dołączył(a): 01 sty 2013
Posty: 169
Pomógł: 0

Kolejny problem. Steruję wyświetlaczami ze wspólną anodą napięciem 12 V przy pomocy takiego drivera

Obrazek

katody, zasilam przez ULN2003

Wszystkie piny zasilające - podłączone

Jako częstotliwość przemiatania ustawiłem około 300 Hz, co tyle wywoływane jest przerwanie przesuwające zmienną załączającą kolejny wyświetlacz.

Mimo zmniejszenia częstotliwości nawet do takiej przy której wyraźnie widać przemiatanie, na każdym poprzednim wyświetlaczu, pojawia się dużo słabsze widmo cyfry z kolejnego wyświetlacza. Pomaga wyłącznie ręczne zwarcie portu do zera.

Wiem, że trzeba w takich przypadkach za każdym wywołaniem przerwania wyzerować port, ale w moim przypadku to też nie pomaga.

Używam programu z książki Mirka, z pewnymi modyfikacjami:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


W którym miejscu należy wyzerować ten port, aby uniknąć tej poświaty Od czego jeszcze może to zależeć. Próbowałem na początku funkcji obsługi przerwania i na jej końcu jednak bez efektu. Pomóżcie proszę. Miał ktoś taki problem?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 mar 2013, o 22:59 
Offline
Moderator
Avatar użytkownika

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

Ten problem - zwany problemem "DUSZKÓW" miał i ma chyba każdy kto pierwszy raz styka się z multipleksowaniem więc się nie przejmuj. Wystarczy że zmienisz podejście na takie jak opisałem w książce i będzie ok czyli:

1. po wejściu w przerwanie WYGAŚ wszystkie anody !

2. ustaw odpowiednie wartości na katodach !

3. dopiero WTEDY zapal wybraną anodę !

a ty teraz - z tego co widać wyżej co robisz ? .... tzn zamieniłeś kolejność punktów wyżej na taką:

1.
3.
2.

więc w zasadzie wygaszanie NIC a NIC ci nie daje - dlaczego ? Ano dlatego że wygaszasz wszystkie anody ale po jednym cyklu zegarowym od razu włączasz kolejną i wtedy rozpoczynasz majstrowanie na katodach....

Pomyśl jak matrix ..... on widzi "bardzo szybko" .... więc gdy zapalisz anodę i grzebiesz wtedy na katodach to on zauważy te manipulacjie.....

ale jeśli zgasisz mu światło ;) wyłączając anody, PKT.1 - potem po "ciemku" ustawisz katory PKT.2 to gdy w następnym kroku zapalisz już kolejną wybraną anodę PKT.3 to matrix duszków nie zobaczy ;)

_________________
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: 10 mar 2013, o 17:19 
Offline
Użytkownik

Dołączył(a): 01 sty 2013
Posty: 169
Pomógł: 0

Zastosowałem się do wskazówek Mirka, ale nadal poświata występuje Także przy małych częstotliwościach przemiatania. Program wygląda teraz tak:

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


Najpierw wyłączam wszystkie porty (przypomnę że i katody i anody steruję jedynkami)
Potem ustawiam port segmentów czyli katody
potem zapalam anodę wybranego wyświetlacza i tak kończy się cykl przerwania

Nie wiem, czy ja czegoś jeszcze nie rozumiem, czy problem leży gdzieś indziej.
Cała sobota i niedziela psu w budę, a ja nie mogę opanować prostego wyświetlania.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 mar 2013, o 18:49 
Offline
Moderator
Avatar użytkownika

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

No ale to wygląda dobrze teraz .... tak się robi właśnie - a jeśli nie działa jak piszesz i występują duszki hmmm .... a masz wyłączone te wszystkie inne PWMy programowe czy sprzętowe ?

Poza tym napisz teraz dokładnie co masz na myśli o tej poświacie - że np na pustym wyświetlaczu występuje jakby słabe echo cyfry z poprzedniego bądź następnego wyświetlacza ?

Zrób sobie do testu tak żeby np przy 4 wyświetlaczach ten drugi nie wyświetlał NIC , pierwszy niech wyświetla np JEDYNKĘ a trzeci DWÓJKĘ - i powiedz czy na tym drugim (pustym) jest duszek dwójki albo jedynki czy o coś innego chodzi ?

_________________
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: 10 mar 2013, o 19:22 
Offline
Użytkownik

Dołączył(a): 01 sty 2013
Posty: 169
Pomógł: 0

Tak Powyłączałem wszystko Są tylko włączone niezbędne rejestry do podstawowej obsługi przerwania. Co do duszków to jak na zdjęciu poniżej. Przemiata mi z lewej do prawej wyswietlacz 1,2,3,4 kiedy na wyświetlaczu 3 jest wyświetlana cyfra "0" to `zarys tego zera jest widoczny na wyświetlaczu wcześniej czyli na 2 Tak samo z innymi cyframi. Mam nadzieję, że na zdjęciu co nieco widać. Częstotliwość przemiatania to około 200 - 300 Hz. Widać mruganie wyświetlacza.

Obrazek

Zaraz jeszcze wyciągnę armatę na muchę, czyli oscyloskop na AVRa. Sprawdzę jak te sygnały są wygaszane.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 mar 2013, o 20:26 
Offline
Moderator
Avatar użytkownika

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

Dobra to znaczy że masz coś nie tak ze sterowaniem tranzystorów - sprawdź wartości rezystorów - być może nie odcinają odpowiednio szybko - za wolno wchodzą w stan nasycenia itp .... nie ma już innej możliwości (tak mi się wydaje)

_________________
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: 10 mar 2013, o 20:38 
Offline
Użytkownik

Dołączył(a): 01 sty 2013
Posty: 169
Pomógł: 0

No i chyba mam rozwiązanie. Problemem może być driver anod, który złożyłem z dwóch tranzystorów:
BC 547 steruje BD138 tworząc zarazem inwerter i konwerter napięć, według poniższego schematu:
Obrazek
Na nóżce procesora segmentu wyświetlającego "ducha" sygnał jest bardzo poprawny a zbocze bardzo ostre:

Obrazek......Obrazek

Sprawdziłem sygnał na tym samym kanale wyświetlacza, ale już na nóżce ANODY samego wyświetlacza i oto co ujrzałem:

Obrazek.....Obrazek

Dziwi mnie to, bo według kart katalogowych BC 547 ma częstotliwość graniczną 300 MHz a BD 140 może pracować przy 160 MHz. Po dokładniejszych "Badaniach wyszło że to BD 140 tak "opóźnia" Spróbuję zamienić je na inny typ. Mam nadzieję, że po wymianie efekt ustąpi. Na pewno się jeszcze odezwę.

------------------------ [ Dodano po: 14 minutach ]

Może rzeczywiście coś jest z rezystorami W razie czego podam Od lewej strony pierwszy rezystor bazy BC547 ma 4,7K drugi rezystor pionowy podciągający kolektor BC547 do plusa ma wartość 4,7K a rezystor bazy BD140 ma wartość 3K. Spróbuję jeszcze przed wymianą tranzystorów zwiększyć wartość rezystora kolektora BC547 żeby uzyskać mniejszy prąd a tym samym mam nadzieję, że odpowiedzi będą bardziej dynamiczne.

------------------------ [ Dodano po: 38 minutach ]

Jutro zmienię to wszystko na UDN2981



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 mar 2013, o 21:46 
Offline
Moderator
Avatar użytkownika

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

ale te BDxxx mają chyba bardzo małe wzmocnienie czy nie można dać jakiegoś zwykłego nawet SMD na 500mA albo i nawet zwyklaka na 100mA ;) czy tam płynie więcej prądu szczególnie w trakcie multipleksowania ? Albo mosfeta ....

i pewnie sprawa by się od razu poprawiła tak mi się wydaje - no i potwierdziło się to co mówiłem


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: 10 mar 2013, o 22:17 
Offline
Użytkownik

Dołączył(a): 01 sty 2013
Posty: 169
Pomógł: 0

Zamieniłem BD140 na BC807 Duszek - jak był tak jest. Jakbyś Mirku spojrzał na wartości tych rezystorów Szczególnie na pierwszy Wydaje mi się że 4,7 K jest optymalnym w tym zastosowaniu rozwiązaniem?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 mar 2013, o 22:55 
Offline
Moderator
Avatar użytkownika

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

ja bym dał do bazy pierwszego NPN rezystor 2,2K, podobnie do bazy drugiego. A ten polaryzujący do +12V ok 10K albo i większy

_________________
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: 11 mar 2013, o 06:58 
Offline
Użytkownik

Dołączył(a): 01 sty 2013
Posty: 169
Pomógł: 0

Próbowałem już z taką konfiguracją Przyznam się, że wmontowałem nawet trzy potencjometry, żeby móc najlepiej dobrać te wartości W żadnym zakresie ustawień nie zauważyłem polepszenia efektu. Wymontowałem też rezystory podciągające do +12 - układ też działał, nawet bez zwiększenia efektu ducha. Dzisiaj jadę po UDNa. To chyba ostateczne rozwiązanie Nie mogę znaleźć w sieci dobrego drivera.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 mar 2013, o 21:54 
Offline
Użytkownik

Dołączył(a): 01 sty 2013
Posty: 169
Pomógł: 0

UDN2981 jest rewelacyjny. Dojechałem do bardzo wysokiej częstotliwości przemiatania i ani śladu smużenia. Zaczynam kolejne etapy układu. Mam nadzieję, że na koniec znajdzie się on w dziale gotowych projektów. Przeczołgało mnie trochę z tym wyświetlaniem. Dalej liczę na Waszą pomoc.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 mar 2013, o 12:08 

Pomógł: 0

W moim projekcje LargeLed gdzie litery mają ok 100mm użyłem UDN2987 w Dip do sterowania segmentami. Bardzo fajne te scalaczki nie trzeba kombinowac, zasilanie UDNa max 30V sterowanie TTL.



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 18 mar 2013, o 10:49 
Offline
Użytkownik

Dołączył(a): 01 sty 2013
Posty: 169
Pomógł: 0

Mam kolejne pytanie.
Jako, że ma to być termometr z zegarem, wymyśliłem, że będzie on wyświetlał na przemian godzinę i temperaturę z dwóch czujników. Czyli łącznie 3 programy.

Zrobiłem też programowo sprzętowy timer z książki Mirka, który cyklicznie może co określoną wartość czasu zmniejszać lub zwiększać jakieś zmienne. Na tej podstawie chciałbym zrealizować zmianę programów według wcześniej ustalonego trybu, Schematycznie przedstawiam to tak

1 Ustawiam: zmienną czas programu 1 na wartość 10
zmienną czas programu 2 na wartość 15
zmienną czas programu 3 na wartość 10

2. W funkcji Main w pętli mam trzy bloki programów wywoływanych:

Program1
Program2
Program3

3. W przerwaniu mam cyklicznie odmierzaną długość czasu


Do głowy przychodzi mi jedynie zrealizowanie to na warunkach IF Czyli w programie głównym będzie zapis tego typu:

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


Jednak znacznie to skomplikuje warunkowanie w pętli przerwania.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Coś mi mówi, że można to zrobić prościej, tylko nic innego nie przychodzi mi do głowy.
Jeśli ma ktoś jakiś pomysł, to proszę o podpowiedź.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 18 mar 2013, o 13:14 
Offline
Użytkownik

Dołączył(a): 01 sty 2013
Posty: 169
Pomógł: 0

Dodatkowo może ktoś spojrzeć na ten króciutki kod do komunikacji TWI? Układ nie chce się komunikować. Biblioteki w całości z książki Mirka, jedynie zmodyfikowałem to że nie wykorzystuję INT0 no i różnica taka, że mam ATMEGĘ 16 taktowaną 16 MHz

Sprawdzałem linię SDA i SCL i na jednym mam cały czas stan wysoki a na drugim cały czas niski.
Nic nie odczytuje.
No i nie wiem jak ustawić w moim przypadku i2cSetBitrate Jest na 100, bo widziałem że funkcja sobie coś oblicza z F_Osc
Dodam jeszcze dla pewności że A0 PCF'a mam podpięte do GND.


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: 18 mar 2013, o 14:50 
Offline
Moderator
Avatar użytkownika

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

Nie ma schematu ale dla pewności się dopytam - a masz rezystory podciągające I2C do VCC ? i jakie ?

w pętli głównej odczytujesz w powyższym kodzie miliardy razy na sekundę PCF'a ? po co ?

_________________
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: 18 mar 2013, o 16:07 
Offline
Użytkownik

Dołączył(a): 01 sty 2013
Posty: 169
Pomógł: 0

tak oczywiście jest podciągnięcie do VCC 4,7K - książkowo :)
Co do odczytu, to zamieściłem go w warunku IF działającym z przerwaniem sprzętowo / programowym co kilkaset milisekund . Działa na pewno bo w ten sam sposób odczytuję DSa Przedstawiony kod odrobinkę uprościłem dla przejrzystości, ale problem pozostaje nadal nawet w takiej formie jak przedstawiłem, czyli bez warunku.
Nie jestem pewny, ale może chodzi o to, że nazwy rejestrów się trochę różnią w Atmedze 16 vs 32, choć myślę, że kompilator by tego nie przeoczył.
Mimo wszystko myślę jednak, że to problem programowy bo po wyjęciu PCFa z podstawki i sprawdzeniu SDA i SCL nic się nie zmienia pomimo zapętlonego odczytu.

A jak Mirku z tym i2cSetBitrate(100); Czy tu coś powinno się zmienić względem mojego rezonatora 16MHz?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 18 mar 2013, o 16:14 
Offline
Moderator
Avatar użytkownika

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

Posłuchaj właśnie to bez i2cSetBitrate() byłby problem :( po to on jest aby ustawić w rejestrach prawidłową prędkość I2C ..... to MUSI wręcz być przy taktowaniu 16MHz

druga sprawa rejestry ATmega16 są .... I D E N T Y C Z N E ... jak w ATmega32, to są dokładnie takie same procki a różnią się TYLKO rozmiarami pamięci

kody bibliotek z książki są na 10000% sprawdzone i działają .... więc pozostaje ci tylko problem sprzętowy niestety

powiedz mi czy w ogóle wyjście INT twojego scalaka PCF działa prawidłowo - sprawdzałeś to tak w ogóle ? bo od tego trzeba zacząć

_________________
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: 18 mar 2013, o 16:27 
Offline
Użytkownik

Dołączył(a): 01 sty 2013
Posty: 169
Pomógł: 0

Bibliotek nawet mi nie wpadło do głowy, żeby się czepiać. Chodziło mi tylko o to, czy wartość wpisana do i2cSetBitrate(); jako 100 jest odpowiednia.

Na wyjściu INT mam zero i nie zmienia się.
Ale nie jestem pewien, czy sygnał tam nie pokazuje się dopiero przy wysłaniu czegoś do PCFa.


Posprawdzam wszystko jeszcze raz.

------------------------ [ Dodano po: 6 minutach ]

NIE pomyłka Na wyjściu INT jest sygnał 1Hz
Widać wyraźnie, że z procka nic nie wychodzi.
A czy przy sprzętowym TWI trzeba ustawiać DDRC?



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: 38 ]  Przejdź na stronę 1, 2  Następna strona

Strefa czasowa: UTC + 1


Kto przegląda forum

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