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



Teraz jest 19 mar 2026, o 10:30


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 21 ] 
Autor Wiadomość
PostNapisane: 2 mar 2013, o 18:40 
Offline
Nowy

Dołączył(a): 02 mar 2013
Posty: 10
Pomógł: 0

Witam

Napisałem program realizujący funkcję przetwornika ADC na Atmega16:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Niestety pojawił się problem z napięciem odniesienia. Nie wiem dlaczego procesor jako napięcie odniesienia bierze ok. 1,22V bez względu na to co ustawię w rejestrze ADMUX.
Do Aref mam podłączony kondensator MKT, napięcie na Aref wynosi w zależności od konfiguracji bitów MUX: 0 - przy wybrany Aref, Vcc - przy wybranym zewnętrznym napięciu, 2,54 - przy wybranym 2,54.
Podłączenie VCC i AVCC mam do zasilania, natomiast Vref tak jak podaje karta katalogowa przez kondensator do masy. Czy ktoś spotkał się może z podobnym problemem?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 mar 2013, o 19:09 
Offline
Użytkownik

Dołączył(a): 02 maja 2012
Posty: 34
Pomógł: 2

Witaj, wg mnie robisz źle z włączaniem przetwornika. Najpierw włączaj ADC a potem napięcia odniesienia wybieraj.
Odwrotnie to nie będzie działać.
Pozdro



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

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

A powiedz może po czym ty oceniasz że bierze ci 1,22 ? ;) .... co ma wspólnego z tym wnioskiem ten kod źródłowy ? czy tylko tak sobie go wstawiłeś ?

Z jednej strony to dobrze że wstawiłeś bo ten kod jest zły i nie ma prawa działać - a jeśli chcesz się czegoś dowiedzieć to najpierw sam napisz może co chciałeś nim osiągnąć i co po kolei jest robione. Wstaw komentarze - bo sam się może gubisz przez ich brak ?

Nawiasem mówiąc kody źródłowe umieszczaj w znacznikach [ syntax = c ] - wyedytuj sobie i sprawdź - poprawiłem

------------------------ [ Dodano po: 1 minucie ]

ringel napisał(a):
Witaj, wg mnie robisz źle z włączaniem przetwornika. Najpierw włączaj ADC a potem napięcia odniesienia wybieraj.
Odwrotnie to nie będzie działać.
Pozdro


będzie działać - to akurat nie ma najmniejszego znaczenia - kolejność ustawień w ADMUX czy ADCSRA

kod jest totalnie zły po prostu i dobrze by było aby kolega autor spróbował linia po linii omówić co dokładnie robi - to może przy okazji sam zobaczy babole ... a jak nie to po kolei pomożemy ;)

_________________
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: 3 mar 2013, o 10:21 
Offline
Nowy

Dołączył(a): 02 mar 2013
Posty: 10
Pomógł: 0

Poniżej kod z komentarzami

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


To, że procesor bierze 1,22V wiem stąd, że mierzę napięcie na potencjometrze przy którym zaświeca się dioda jeżeli w pętli If mam warunki: "(value > 1020) i (value < 1020)". Dzieje się tak niezależnie od tego co ustawię jako napięcie odniesienia w rejestrze ADMUX.



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

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

Ok to teraz zobacz jakie wnioski wyciągasz - takie troszkę z kosmosu, w stosunku do baboli w tym kodzie - szczególnie do jednego NAJGORSZEGO babola :(

..... napisałeś w komentarzu: // uruchomienie przerwania od ADC, tryb ciągłej konwersji


to teraz:

1. pokaż mi makro ISR( ) do obsługi tego przerwania w twoim kodzie ?

2. pokaż mi w ogóle gdzie masz globalne zezwolenie na przerwania ??? bo nawet jak je zrobisz to i tak będziesz miał jeszcze gorszą masakrę

3. czy wiesz co się dzieje gdy programista w C uruchomi przerwanie a jednocześnie nie napisze procedury obsługi chociaż jednego przerwania ?

4. po kiego grzybka mieszasz w kodzie programu te kocie makra _BV() (masakra) skoro sprawnie posługujesz się tym co jest 10000x bardziej czytelne czyli przesunięcia, np (1<<ADEN) .... generalnie jak się patrzy na taki kod to się kociego oczopląsu dostaje - więc popraw to ok ?

5. dlaczego w ogóle nie stosujesz wcięć w kodzie ?

---------------------------

spróbuj odpowiedzieć sobie na te pytania a już będzie lepiej - jeśli nie będziesz znał odpowiedzi na niektóre to napisz - polecimy dalej ok? ;)

_________________
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: 3 mar 2013, o 13:25 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 21 gru 2012
Posty: 161
Pomógł: 9

Panie Mirku czemu makra _BV() są kocie? Tylko ze względu na ich wygląd czy coś jeszcze?

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 mar 2013, o 15:36 
Offline
Moderator
Avatar użytkownika

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

Domanoid napisał(a):
Panie Mirku czemu makra _BV() są kocie? Tylko ze względu na ich wygląd czy coś jeszcze?


Po pierwsze primo - jak już ktoś woli kocie makra _BV() .... to niech ich używa w całym kodzie a nie raz:

_BV(ADEN);

a innym razem

(1<<ADEN);

tu chodzi PRZEDE WSZYSTKIM o praktykę dobrego programowania i przejrzystość kodu i niech mi ktoś powie, że to mu nie przeszkadza - to proszę bardzo równie dobrze może wtedy pisać sobie tak:

ADCSRA = 0x80;

------------------------------------

po drugie - zwykle jak widzę gdy ktoś korzysta z kocich makr _BV() to zwykle czuję przez skórę (ale nie zawsze muszę mieć rację w tym względzie) .... że ma ten ktoś problemy z posługiwaniem się zapisem związanym z przesunięciami (1<<bit) ....

po trzecie moim zdaniem, ale nie tylko moim - kod wygląda zdecydowanie bardziej przejrzyście jak się przyzwyczaimy do przesunięć czyli (1<< nazwa bitu ), a jest też szczególnie bardziej czytelny dla początkujących, którzy uczą się np z moich książek gdzie staram się pokazywać od razu taki właśnie styl programowania

reasumując - biorąc wszystko pod uwagę - dlatego uważam, że makra _BV() są kocie ... a niejedna z początkujących osób, która się przyzwyczaiła do tego zapisu to po pierwsze nie boi się przesunięć i twierdzi że teraz dla niej przejrzyste kody to właśnie takie

i dlatego na tym forum też staram się wprowadzić te same zasady co w książce - wtedy wszyscy mamy taką samą że tak powiem platformę do odczytu ..... a dla kogoś kto się uczy programować - bardzo szybko się okaże jak takie zdrowe nawyki mogą być i na pewno będą przydatne


------------

czy takie wyjaśnienia wystarczą ?

_________________
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: 3 mar 2013, o 16:10 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 21 gru 2012
Posty: 161
Pomógł: 9

Wytłumaczenie jak najbardziej przemawia do mnie.
Myślałem, że chodzić może o coś więcej.
Raz się bawiłem takim zapisem, ale przesunięcia wyglądają przejrzyściej. Bawiłem się też z cbi i sbi. Ale to już wcale nie wygląda dobrze. Tyle, że wiem co one robią jak u kogoś w kodzie zobaczę.

Do przesunięć bitowych zrobiłem sobie specjalne skróty w eclipse. Tak jak ma to miejsce np. przy for (wpisujemy for potem Ctrl+Spacja i wyskakuje cały zapis pętli). Ja wpisuje sobie bv potem ctrl + spacja i wyskakuje "(1<<$)" gdzie $ jest kursorem ustawionym do wpisania czegoś. Tak samo bvn do zanegowanego czyli wyskakuje "~(1<<$)" oraz mbv do wielokrotności - wyskakuje "(1<<$) | " co o wiele przyspiesza pisanie przesunięć :) Jeśli jest ktoś chętny to mogę szybko wytłumaczyć jak zrobić takie uproszczenie.

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 mar 2013, o 16:49 
Offline
Nowy

Dołączył(a): 02 mar 2013
Posty: 10
Pomógł: 0

Teraz dodałem makro ISR oraz zezwolenie na przerwania SEI.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Jednak teraz to już dioda w ogóle się nie zaświeca. Nie mam pojęcia dlaczego tak jest.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 mar 2013, o 17:03 
Offline
Moderator
Avatar użytkownika

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

a zajrzyj tutaj:

http://mirekk36.blogspot.com/2011/08/test.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: 4 mar 2013, o 08:06 
Offline
Nowy

Dołączył(a): 02 mar 2013
Posty: 10
Pomógł: 0

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

przerwanie zadziałało. Natomiast problem z napięciem odniesienia pozostał.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 mar 2013, o 09:30 
Offline
Moderator
Avatar użytkownika

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

to nie jest tak że po podaniu volatile przerwanie zadziałało - volatile nie jest do tego żeby przerwania działały albo nie ... więc doczytaj jednak dokładniej co to za specyfikator ..... bo kolejnym razem popełnisz błędy - np nadużywając volatile ok?

przy okazji sei(); nie używa się w takich funkcyjkach inicjalizacyjnych .... tylko tuż przed pętlą główną programu co oczywiście w tym prostym przykładzie nie ma znaczenia ale jak mówię - nabawisz się kłopotów dalej tak pisząc kod - dlatego zwracam uwagę jak się powinno pisać.


no i jaki problem pozostał z napięciem teraz ?

przecież sprawdzając

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


dioda powinna zmieniać stan przy napięciu niższym lub wyższym połowie napięcia referencyjnego które dla ATmega16 = ok 2,56V

_________________
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: 5 mar 2013, o 13:07 
Offline
Nowy

Dołączył(a): 02 mar 2013
Posty: 10
Pomógł: 0

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


dioda zmienia stan przy napięciu ok 1,22V.



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

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

czyli zacznij od pokazania schematu jak ty to łączysz bo skoro program jest ok to znaczy że coś źle zrobiłeś w połączeniach.

_________________
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: 5 mar 2013, o 14:26 
Offline
Użytkownik
Avatar użytkownika

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

Tutaj czasem ci się nie pomyliło ?


Paweł_1985 napisał(a):
Teraz dodałem makro ISR oraz zezwolenie na przerwania SEI.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.




Bo mi się wydaje że powinno być
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: 5 mar 2013, o 18:45 
Offline
Nowy

Dołączył(a): 02 mar 2013
Posty: 10
Pomógł: 0

Poniżej zamieszczam schemat:
Obrazek

Możliwe że coś w nim jest nie tak. Do pinów A0, A1, A2, A3 podłączone są potencjometry, które włączone są pomiędzy napięcie zasilania, a masę.



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

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

po tym co napisał Malutki_27 i słusznie pokaż ty lepiej jeszcze raz ten cały swój kod.

_________________
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: 6 mar 2013, o 07:00 
Offline
Nowy

Dołączył(a): 02 mar 2013
Posty: 10
Pomógł: 0

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


Zastanawiam się, czy jest możliwe że z mikroprocesorem jest coś nie tak, jakaś wada.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 mar 2013, o 08:54 
Offline
Moderator
Avatar użytkownika

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

Paweł_1985 napisał(a):
Poniżej zamieszczam cały kod:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


ale dla porządku stosuje się ADCW - W bo Word .... a ty widzę lubisz wszystko odwrotnie robić - to rób tak dalej

Paweł_1985 napisał(a):
Zastanawiam się, czy jest możliwe że z mikroprocesorem jest coś nie tak, jakaś wada.


Tak tak - pewnie, co drugi procek na świecie ma wadę, a co trzeci jest zepsuty, tylko co piąty dział .... Im dłużej się będziesz tak zastanawiał tym będziesz miał większe problemy.

---------------------------------
Więc co ci teraz nie działa ? (czy ciebie trzeba wciąż za język ciągnąć?) .... napisz dokładnie co i jak sprawdzasz ? Nie wspomnę już że w kodzie nie ma wcięć i komentarzy .....

ale widać że ustawiasz sobie napięcie odniesienia VCC, więc dioda LED powinna zmieniać stan gdy potencjometr jest w jednej połówce (napięcie większe niż ok 2,5V) i gdy jest w dolnej połówce (gdy napięcie poniżej ok 2,5V)

czy tak trudno wziąć w łapki miernik - na suwaku potka ustawić np 4V i napisać czy dioda LED się świeci czy nie? Potem ustawić napięcie 1V na suwaku i napisać czy dioda LED się świeci czy nie ?

bo przecież ze schematu też nie widać nawet jak tą diodę masz podłączoną - albo jak masz te potencjometry podłączone - kto cię tam wie? jeśli sprzętowo robisz to tak jak programowa nam tu (niedbale) przedstawiasz to być może w części sprzętowej masz jeszcze babole ...

więc jeśli chcesz żeby ci pomóc - to postaraj się zadać prawidłowo pytanie, podać prawidłowy schemat, ew zdjęcia płytki jak to wygląda - a nie cedzisz po słówku i oczywiście zaraz jak zwykle - JA WSZYSTKO dobrze zrobiłem - to pewnie procesor ma wadę ....

_________________
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: 16 mar 2013, o 15:34 
Offline
Nowy

Dołączył(a): 02 mar 2013
Posty: 10
Pomógł: 0

Problem rozwiązany. Jednak coś nie tak było z prockiem, bo jak wymieniłem na inny i zaprogramowałem to śmiga bez problemu.
Cytuj:
Tak tak - pewnie, co drugi procek na świecie ma wadę, a co trzeci jest zepsuty, tylko co piąty dział ....

Nie wiem czy trafiłem na co drugi, co trzeci, czy może co piąty, jednak faktem jest że mikrokontrolery są jak wszystko w przyrodzie niedoskonałe i również ich wadę należy wziąć pod uwagę, zwłaszcza jak się wyczerpało wszystkie inne możliwości. Schemat i program były ok, więc błąd mógł być w płytce, albo w mikrokontrolerz. Jednak tą drugą opcję od razu Pan odrzucił, co bardzo mnie zdziwiło, chyba zbyt duża wiara w elektronikę.



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

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

Paweł_1985 napisał(a):
... jednak faktem jest że mikrokontrolery są jak wszystko w przyrodzie niedoskonałe i również ich wadę należy wziąć pod uwagę, zwłaszcza jak się wyczerpało wszystkie inne możliwości.


Gdyby tak było to byśmy wyrzucali ze 30% mikrokontrolerów


Paweł_1985 napisał(a):
Schemat i program były ok, więc błąd mógł być w płytce, albo w mikrokontrolerz. Jednak tą drugą opcję od razu Pan odrzucił, co bardzo mnie zdziwiło, chyba zbyt duża wiara w elektronikę.


w płytce tak - to rozumiem, mogłeś też po prostu spalić prockowi ADC, albo procka uszkodzić - ale na pewno nie było tak że procek przyszedł taki z fabryki. I to odrzuciłem i odrzucam .... nie ma to nic wspólnego z wiarą w elektronikę ....

A im dłużej będziesz wierzył w uszkodzenia fabryczne procków gdy ci coś nie będzie wychodziło - tym więcej będziesz ich wyrzucał do śmieci - może wtedy w końcu kiedyś - zrozumiesz - dlaczego inni , którzy działają troszkę dłużej w tym zakresie odrzucają takie wyjaśnienia - szczególnie osób, które stawiają na tym polu pierwsze kroki i wydaje im się - że WSZYSTKIE możliwości już sprawdzili - jak sam pisałeś.

_________________
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  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 21 ] 

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