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



Teraz jest 31 mar 2026, o 08:39


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 6 ] 
Autor Wiadomość
PostNapisane: 24 kwi 2014, o 20:20 
Offline
Użytkownik

Dołączył(a): 22 mar 2014
Posty: 52
Pomógł: 0

Witam wszystkich.

Napisałem dzisiaj kod do woltomierza wykorzystując przetwornik ADC w języku C.
Kod napisałem dla mikrokontrolera ATMega8.
Wynik pomiaru wyświetlany jest na czterech wyświetlaczach LED wspólna anoda.
Anody wyświetlacza podłączone są do PORTD, a cztery katody do PORTC.
Multipleksacja tych wyświetlaczy wykonuje się w przerwaniu.
Program działa, chciałem tylko aby ktoś sprawdził i napisał czy jest on poprawnie napisany(czy dobrze napisane funkcje, czy dobrze je wywołuje i wszystko co w tym kodzie jest).
Uczę się pisania w C i sporo już się nauczyłem.
Chciałbym wiedzieć jakich błędów nie popełniać na przyszłość.
Mierzone napięcie podaję przez dzielnik napięciowy, który ma wsp. podziału 34, na pin PC1 mikrokontrolera.

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: 24 kwi 2014, o 21:24 
Offline
Moderator
Avatar użytkownika

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

#define F_CPU 8000000UL

to jest pierwszy i PODSTAWOWY BŁĄD, i proszę nie powielaj tego przynajmniej na naszym forum bo wpisywanie tego w kodzie programu to niestety MEGA BZDURA :(

obejrzyj sobie ten poradnik od tego momentu:

https://www.youtube.com/watch?v=UhcyBpM57vo#t=2993

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

Poza tym kod wygląda OK ... ale hmmm jest jeszcze jedno ALE ....

brakuje komentarzy - a bez komentarzy jak wiemy nie jest do kod pisany w dobrym stylu programowania

_________________
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: 24 kwi 2014, o 21:59 
Offline
Moderator
Avatar użytkownika

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

mokrowski napisał(a):
Jeśli koleżanki/koledzy chcą coś dodać albo naprostować to co napisałem
to... wiem że nic nie wiem jeszcze o programowaniu na MCU. Jedynie (trochę) wiem o C...


Łeee, no panie kochany - PIĘKNA ANALIZA i SUPER podpowiedzi dla autora kodu ;) .... rewelacja - poważnie.

_________________
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: 24 kwi 2014, o 22:45 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 sty 2012
Posty: 777
Lokalizacja: Karpicko k. Wolsztyna
Pomógł: 197

Ja jeszcze dodam, że wkradła ci się mała nieścisłość w tym kawałku kodu
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Wpisujesz wartość porównania do OCR1A a potem używasz OCIE1B i TIMER1_COMPB_vect. Może to i działa ale lepiej zrobić to tak jak ma być czyli
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Skoro jesteśmy już przy timerze to przy takim ustawieniu timera przerwanie będzie ci się wywoływać z częstotliwością 2kHz czyli co 0,5ms (8000000Hz / 256(preskaler) / 15(OCR1A) = 2kHz). Dużo jak na obsługę multipleksowania. Do czterech wyświetlaczy spokojnie wystarczy wywoływać przerwanie z częstotliwością 200Hz czyli co 5ms. Trzeba tylko troszkę zmienić ustawienia timera na takie
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Mi osobiście byłoby szkoda tracić Timer1 na multipleksowanie i zamiast niego wybrał bym np. Timer2, który to również posiada wygodny tryb CTC.

I z takich kosmetycznych poprawek to zamiast w każdym case gasić jeden wyświetlacz można przed switch gasić wszystkie. Wtedy nie trzeba się zastanawiać, że w danym case trzeba zgasić wyświetlacz włączony w poprzednim case.

No i ten warunek
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
zmień na
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Bo teraz to zmienna "i" przyjmuje wartości od 0 do 4 i dopiero gdy osiągnie wartość 5 to zostanie wyzerowana.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 kwi 2014, o 11:47 
Offline
Użytkownik

Dołączył(a): 22 mar 2014
Posty: 52
Pomógł: 0

Dobra, zrobiłem tak jak pisaliście.
Teraz mam problem bo jak mierzę napięcie na baterii czy jakimś zasilaczu to zamiast mi pokazać np. 4,96V, to wynik mi skacze. Raz jest 4,86 a za kawałek 4,96. Dzieje się to tak szybko, że wydaje się jak by wyświetlacze wskazywały 4,88.
Jak zrobić żeby tak się nie działo?

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: 26 kwi 2014, o 15:33 
Offline
Moderator
Avatar użytkownika

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

mateusz19955 napisał(a):
Jak zrobić żeby tak się nie działo?


dość prosto - obejrzeć panie kochany to: ;)

https://www.youtube.com/playlist?list=P ... 5hRnig_f23

wszystko po kolei jasno i klarownie wyjaśnione na różnych przykładach i w różnych zastosowaniach ;)

_________________
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: 6 ] 

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