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



Teraz jest 25 sty 2025, o 23:24


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 31 ]  Przejdź na stronę 1, 2  Następna strona
Autor Wiadomość
PostNapisane: 24 lis 2014, o 00:34 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 20 lis 2014
Posty: 16
Pomógł: 0

Witam.
Proszę o sprawdzenie i wskazanie błędów w moim pierwszym kodzie w C.
Układ ma za zadanie monitorowanie napięcia na akumulatorze i sygnalizację dwóch progów, tj. 11V i 10,5V.
Powyżej 11, wszystko jest ok. Pomiędzy 10,5, a 11 powinien się załączyć brzęczek, a poniżej 10,5 led.
Schemat naszkicowany na szybko, mam nadzieję że czytelny.
Obrazek

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 lis 2014, o 17:11 
Offline
Użytkownik

Dołączył(a): 02 lut 2014
Posty: 38
Lokalizacja: Jaworzno
Pomógł: 2

MaxEnergy napisał(a):
Witam.
Proszę o sprawdzenie i wskazanie błędów w moim pierwszym kodzie w C.

(...ciach...)

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


Zawsze spełniony warunek, dioda świeci po wieczność.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 lis 2014, o 18:44 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 20 lis 2014
Posty: 16
Pomógł: 0

Mogliby mnie Koledzy trochę naprowadzić na swoje spostrzeżenia?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 lis 2014, o 18:53 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 10 paź 2014
Posty: 42
Pomógł: 5

Zobacz co to jest AKU u Ciebie i do czego porównujesz to.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 lis 2014, o 21:23 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 20 lis 2014
Posty: 16
Pomógł: 0

Chodzi o dodanie konfiguracji AKU jako wejścia?
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: 25 lis 2014, o 00:03 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 10 paź 2014
Posty: 42
Pomógł: 5

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

czyli porównując
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
co jest bez sensu, bo ten warunek i drugi też jest zawsze spełniony



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lis 2014, o 14:40 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 20 lis 2014
Posty: 16
Pomógł: 0

W takim razie pytanko...
Jaka komenda służy do odczytu wartości na wejściu ADC, aby później przyrównać ją do 717?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lis 2014, o 14:45 
Offline
Moderator
Avatar użytkownika

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

MaxEnergy napisał(a):
Mogliby mnie Koledzy trochę naprowadzić na swoje spostrzeżenia?


Moje spostrzeżenie - kolega musi jednak zacząć konkretnie od PODSTAW języka C ... bo na razie to działasz totalnie po omacku - na zasadzie "albo się uda albo się nie uda" ..... "a jak się nie uda to może uda się jak napiszę odwrotnie?"

wiesz ile czasu zmarnujesz na takie podejście ?

może warto zacząć od książki: http://atnel.pl/mikrokontrolery-avr-jezyk-c.html

a na dokładkę obejrzeć sobie poradnik o ADC: https://www.youtube.com/playlist?list=P ... 5hRnig_f23

bo z takimi kwiatkami jak z tym swoim AKU - nic nie zrobisz :(


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: 12 gru 2014, o 02:08 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 20 lis 2014
Posty: 16
Pomógł: 0

Witam.
Za poradą Mirka wziąłem się za naukę. Dużo zrozumiałem, lecz pewnie nie wszystko. Kod napisałem od nowa. Po kompilacji wyskoczył mi błąd z którym nie za bardzo wiem co zrobić. Proszę o sprawdzenie czy ma on szansę działać. Założenia jak wyżej.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Kompilator wskazuje błąd w 42 linijce.
Kod:
error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 gru 2014, o 08:27 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 10 paź 2014
Posty: 42
Pomógł: 5

Gdzieś Ci zjadło sekcje argumentów w deklaracji funkcji.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 gru 2014, o 00:56 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 02 wrz 2012
Posty: 73
Pomógł: 2

Jaśniej po prostu wstaw nawiasy po słowie pomiar a w nim słowko void.
Każda funkcja posiada nawiasy okrągłe po jej nazwie, zarówno w deklaracji jak i przy jej wywoływaniu.
Tak samo w lini 30 i 34 musisz to zrobić(dodać nawiasy). Ja natomiast proponuję Ci byś wartość pomiaru wrzucił do jakiejś zmiennej i porównywał zmienną z Twoją wartością 717 bo niepotrzebnie dwa razy w jednym przebiegu pętli wykonujesz pomiar ADC.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 gru 2014, o 00:08 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 20 lis 2014
Posty: 16
Pomógł: 0

Co Wy na to?
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: 14 gru 2014, o 00:26 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 02 wrz 2012
Posty: 73
Pomógł: 2

Sprawdzałeś to czy od razu na forum?
Bo ja nie widzę w while(1) wykonywania się funkcji pomiar zwracającej coś do zmiennej wynik.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 gru 2014, o 00:29 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 20 lis 2014
Posty: 16
Pomógł: 0

Sprawdzić na razie nie mam na czym, bo programator jeszcze nie doszedł.
Rozumiem twoją uwagę. Coś wykombinuję.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 gru 2014, o 00:34 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 02 wrz 2012
Posty: 73
Pomógł: 2

Zaraz zaraz a funkcja pomiar skąd się wzięła? Sam ją napisałeś czy źródło?
Zobacz, zwracasz zmienną wynik, której nawet nie masz w tej funkcji, ani nic do tej zmiennej wynik nie zapisujesz. Wynikiem pomiaru jest rejestr ADCW (u mnie tak było)
Mogę Ci oczywiście pokazać kod na pomiar dla medzi8 ale pytanie czy chciałbyś gotowe rozwiązanie.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 gru 2014, o 00:52 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 20 lis 2014
Posty: 16
Pomógł: 0

Gotowca nie chcę. Sam muszę do tego dojść. Ty mnie tylko lekko naprowadzaj.
Jeżeli wynik pomiaru jest zapisywany w 10 najmłodszych bitach 16 bitowego rejestru ADCW, to wystarczy przypisać ową wartość do zmiennej "wynik", czy trzeba ją przekonwerterować na wartość dziesiętną?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 gru 2014, o 01:24 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 02 wrz 2012
Posty: 73
Pomógł: 2

zwracasz rejestr ADCW, więc jeśli funkcja zwraca jego wartość to wrzucaj wartość zwracaną przez tą funkcję do zmiennej wynik. Potem dopiero ją porównuj ile wynosi czy zapalić diodę czy też nie. Bo aktualnie to porównuje czy wynik jest <717, który nie przechowuje żadnej wartości z pomiaru, tylko jest w nim zero (zmienne globalne automatycznie są zerowane) Nic nie trzeba konwertować ani maskować itp. (przynajmniej ja nie musiałem). Popraw po prostu funkcje odpowiedzialna za pomiar bo nie tak powinna ona wyglądać.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 gru 2014, o 02:03 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 20 lis 2014
Posty: 16
Pomógł: 0

Poprawione wg Twoich uwag:
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: 14 gru 2014, o 13:23 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 02 wrz 2012
Posty: 73
Pomógł: 2

Wygląda nieco lepiej, ale nie ma takiego rejestru w atmega8 jak ADCSR, jest ADCSRA.
W dodatku wrzuć pomiar napięcia w funkcję jak miałeś na początku będziesz wiedział za miesiąc jak wrócisz do programu, które instrukcje odpowiadają za pomiar.
Kompilowałeś w ogóle ten poprawiony kod?
Drugie pytanie czy potrzebujesz tak często pomiar tego napięcia (robisz to cały czas w pętli, tak szybko pada ten akumulator?, może co sekundę)?
Bo jeśli napięcie będzie "skakało" między napięciem granicznym to co chwila będziesz włączał buzzer i go wyłączał. To samo z diodą, nie masz warunku, który gasi diodę, gdy napięcie jest większe, równe 10.5V, po naładowaniu aku dioda już się nie zgasi.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 gru 2014, o 22:54 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 20 lis 2014
Posty: 16
Pomógł: 0

Małe pytanko.
W jaki sposób zainicjować funkcję (w moim przypadku "pomiar") na początku pętli?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 gru 2014, o 23:26 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 02 wrz 2012
Posty: 73
Pomógł: 2

Jeśli dobrze zrozumiałem frazę 'na początku' no to zaraz przy otwarciu klamer od while(1) o to chodziło?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 gru 2014, o 23:31 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 20 lis 2014
Posty: 16
Pomógł: 0

Tak, przed porównaniem zmiennej "wynik".



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 gru 2014, o 23:34 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 02 wrz 2012
Posty: 73
Pomógł: 2

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

Ale daj jakieś opóźnienie by nie było problemu przy napięciu granicznym tej wartości, i weź też pod uwagę, że dokładność pomiaru adc (u mnie tak jest) wynosi +/- 3 wartości.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 gru 2014, o 14:04 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 20 lis 2014
Posty: 16
Pomógł: 0

Nie mogę dać sobie rady z wywołaniem mojej funkcji na początku pętli while(1).
Pomiar napięcia ADC jest wrzucony do funkcji:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Pętla while 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.



Chcę aby za klamerką while następowało wywołanie funkcji pomiaru, a póżniej przyrównanie. Możesz coś podpowiedzieć, bo Twój przykład jakoś nie chce bujać.

P.S.
Led_czas jest tylko diodą sygnalizacyjną powtórzenie pętli.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 gru 2014, o 14:27 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 02 wrz 2012
Posty: 73
Pomógł: 2

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

proszę ;)

EDIT: Twoim problemem pewnie było zrozumienie dlaczego do zmiennej wynik nie wpada wartość, którą potem porównujesz w ifie, zgadłem?
Chodzi o to, że Twoja funkcja coś zwraca (typ liczby całkowitej przed nazwą funkcji w deklaracji), a jeśli zwraca to musisz przypisać wartość jej wywołania do jakiejś zmiennej, którą potem porównujesz w if'ie, który potem dobrze stworzyłeś.
EDIT2: Możesz od razu zwracać return ADCW bez przypisywania zmiennej wynik wartości ADC.
Podpowiedziałem Ci za dużo, reszte kombinuj sam. To są niejako podstawy, które możesz zdobyć sam.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 gru 2014, o 14:47 
Offline
Użytkownik
Avatar użytkownika

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

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

Czyli przypisując wynik pomiaru do zmiennej i potem tą zmienną porównywać w ifach.

Jeśli masz tylko jednego ifa do porównania to można zrezygnować ze zmiennej wynik i funkcję pomiar() wywołać bezpośrednio w ifie
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Rozwiązań może być tyle ilu jest programistów.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 gru 2014, o 14:48 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 02 wrz 2012
Posty: 73
Pomógł: 2

Ja jeszcze tu z trzy minimum widzę na szybki rzut oka. Ale tak jak @jacek232 wspomniał wiele jest rozwiązań, wybierz ten zapis, który jest dla CIebie najłatwiejszy i przede wszystkim działa :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 gru 2014, o 15:42 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 20 lis 2014
Posty: 16
Pomógł: 0

Dzięki wielkie, wszystko działa jak należy.
Jeśli przyrównujemy funkcję pomiar bezpośrednio w if'ie, to za każdym przyrównaniem następuje pomiar w ADC, a jeśli najpierw przypiszemy wynik do zmiennej (np. na początku pętli), np tak:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

to pomiar W ADC wykonuje się tylko raz na obieg pętli? Dobrze pojmuję?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 gru 2014, o 15:44 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 02 wrz 2012
Posty: 73
Pomógł: 2

Tak dokładnie tak jak mówisz ;)
wrzucaj wartość pomiaru do zmiennej i potem porównuj zmienną.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 gru 2014, o 17:59 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 20 lis 2014
Posty: 16
Pomógł: 0

Czy istnieje jakaś metoda, aby odczytać stan pinu wyjściowego?
Odczytywanie w taki sposób, jak się odczytuje pin wejściowy, nie przynosi zamierzonego efektu.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Zamierzenie jest takie, aby LED_CZAS podążała za LED.



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