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



Teraz jest 23 mar 2026, o 16:20


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 33 ]  Przejdź na stronę 1, 2  Następna strona
Autor Wiadomość
PostNapisane: 11 cze 2014, o 22:10 
Offline
Użytkownik

Dołączył(a): 30 sie 2012
Posty: 226
Pomógł: 11

Witam,
wgrałem kod z bluebooka z ćwiczenia 06_ADC do Atmegi 88p.
Zmieniłem tylko w pliku lcd44780.h ustawienia portów.
W pliku main.c wyłączyłem 2 linijki:
//DDRC |= (1<<PC7); // ustawiamy kierunek linii podświetlenia LCD jako WYJŚCIE
//PORTC |= (1<<PC7); // załączamy podświetlenie LCD - stan wysoki

Po wgraniu do Atmegi wyświetlacz pokazywał takie wartości:
1. start...
2. 20,530 V
3. +28,857 V
4. +30,254 V
5. +30,489 V
6. +30,528 V
7. +30,535 V
8. +30,536 V

Na wartości 30,536V zatrzymał się wyświetlacz.
Wgrałem tylko program bez podłączania dzielnika rezystorowego i zmian preskalera i bez sprawdzania napięcia na nóżce ADC. Taktowanie 8MHz.
Nie wiem czemu takie dziwne wartości się pokazały. Co musiałbym poprawić, aby móc normalnie wyświetlać napięcie?
Chcę mierzyć napięcie na akumulatorze maks. do 15V.

Poniżej wgrany kod:

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: 11 cze 2014, o 22:31 
Offline
Użytkownik

Dołączył(a): 01 sty 2014
Posty: 116
Pomógł: 14

Pokazuje dobrze;) Po pierwsze ustawiłeś napięcie odniesienia na wewnętrzne 1.1V a nie 2.56V a po drugie kanał ADC7 występuje tylko w obudowie TQFP i 32 MLF o ile dobrze to piszę;)
No i na sam koniec masz coś pomieszane z przeliczaniem wartości ADC na napięcie. Patrząc na to co liczysz mamy ADC*25*1194 co przy ADC=1023 daje wynik około 30,536;)
Po pierwsze pomyśl o zmianie pinu ADC bo jak myślę korzystasz z obudowy DIP;) A po drugie zastanów się nad przeliczaniem wartości ADC ;) Mam nadzieje, że coś pomogłem;)

aa i jeszcze jedno;) Nie przejmuj się, że wartości tak się zmieniają, to przez filtr dolnoprzepustowy który zastosowałeś;)

Ta konfiguracja którą przedstawiłeś mogłaby mierzyć napięcie do ~30V przy zastosowaniu odpowiedniego dzielnika rezystorowego. Nie ma przeszkód aby zmierzyć 15V ale tracimy trochę na rozdzielczości pomiaru. Uruchom sobie mkAVRcalculator i dobierz tak rezystory aby na wejściu było 30V a na wyjściu 1,1V:)


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 cze 2014, o 23:27 
Offline
Moderator
Avatar użytkownika

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

piotr8605 napisał(a):
Chcę mierzyć napięcie na akumulatorze maks. do 15V.


obejrzyj sobie dokładnie to:

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

_________________
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 cze 2014, o 07:37 
Offline
Użytkownik

Dołączył(a): 30 sie 2012
Posty: 226
Pomógł: 11

Cytuj:
Pokazuje dobrze;) Po pierwsze ustawiłeś napięcie odniesienia na wewnętrzne 1.1V a nie 2.56V a po drugie kanał ADC7 występuje tylko w obudowie TQFP i 32 MLF o ile dobrze to piszę;)
No i na sam koniec masz coś pomieszane z przeliczaniem wartości ADC na napięcie. Patrząc na to co liczysz mamy ADC*25*1194 co przy ADC=1023 daje wynik około 30,536;)
Po pierwsze pomyśl o zmianie pinu ADC bo jak myślę korzystasz z obudowy DIP;) A po drugie zastanów się nad przeliczaniem wartości ADC ;) Mam nadzieje, że coś pomogłem;)

aa i jeszcze jedno;) Nie przejmuj się, że wartości tak się zmieniają, to przez filtr dolnoprzepustowy który zastosowałeś;)

Ta konfiguracja którą przedstawiłeś mogłaby mierzyć napięcie do ~30V przy zastosowaniu odpowiedniego dzielnika rezystorowego. Nie ma przeszkód aby zmierzyć 15V ale tracimy trochę na rozdzielczości pomiaru. Uruchom sobie mkAVRcalculator i dobierz tak rezystory aby na wejściu było 30V a na wyjściu 1,1V:)



Jestem w trakcie przerabiania tutoriali o ADC Panie Mirku.

A koledze dziękuję za cenne uwagi.
Nie wiedziałem po prostu czy ten kod działa przy takich ustawieniach.

Pozdrawiam



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 cze 2014, o 22:01 
Offline
Użytkownik

Dołączył(a): 30 sie 2012
Posty: 226
Pomógł: 11

Tak zgadza się mam Atmegę w obudowie DIP.
Dla napięcia odniesienia 1,1V i dla maks. napięcia pomiaru 15V dałem rezystory odpowiednio: 63,2k oraz 5k.

Czy w tej linijce:
sr=sr+value*VREF_11_MUL*1194;
muszę zmienić obliczenia, aby były dostosowane do maks. 15V?

Ustawiłem następujące parametry zgodnie z notą aplikacyjną Atmegi 88:

#define VREF_11 (1<<REFS1)|(1<<REFS0) //ustawienie napięcia odniesienia 1,1V

ADMUX = 0; // ustawienie pomiaru na pinie PC0, przedtem było ustawione na 7

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


Reszty kodu nie zmieniałem.
Obecnie pokazuje mi napięcie około 2x wyższe niż jest w rzeczywistości. Jest to chyba spowodowane złym przeliczeniem wartości ADC na napięcie jak kolega Daniel880 wspomniał. Gdyby ktoś pomógł z wyliczeniem tego napięcia, będę wdzięczny.
Pozdrawiam



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 cze 2014, o 22:13 
Offline
Użytkownik

Dołączył(a): 01 sty 2014
Posty: 116
Pomógł: 14

Wszystko fajnie ale oprócz nazwy definicji nic nie zmieniłeś;) musisz zmienić WARTOŚĆ, która jest podstawiana w miejsce VREF_11_MUL. W zasadzie to w komentarzu masz dokładnie opisane jak ta wartość jest wyliczana;)
Ogólnie jeśli zastąpisz tą linie kodu:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Na mniej więcej 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 twój miernik powinien wskazywać jako tako poprawne wartości, jednak jeśli chcesz porządnie mierzyć wartość napięcia to musisz zająć się jeszcze tą linijką:

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


Masz już chyba wystarczająco dużo informacji;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 cze 2014, o 22:18 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 10 mar 2013
Posty: 739
Lokalizacja: Poznań
Pomógł: 84

Nie jestem pewny ale czy
stała VREF_11_MUL nie powinna być obliczona
dla 1,1 czyli mieć wartość około 11 ( obliczana kalkulatorem 10,74)

edit
No i liczyłem ,liczyłem i się spóźniłem :D



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 cze 2014, o 19:25 
Offline
Użytkownik

Dołączył(a): 30 sie 2012
Posty: 226
Pomógł: 11

Panowie skorzystałem z BB i napisałem kod prostszą metodą:

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


Myślę, że kod jako całość powinien być poprawny, ale z chęcią wysłucham cennych uwag.
Pomiary na mierniku są praktycznie porównywalne z wyświetlaną wartością na LCD. Różnice są rzędu 0,01- 0,03V.
Nie potrzebuję aż tak precyzyjnych pomiarów.

Jedynie co, to powinno być np. 2,56V a mam 2, 56V, powinno być 4,04V, a mam 4, 4V, powinno być 10,03V mam 10,3V.
W jaki sposób mogę to zlikwidować?
Wiem kolega Mirek podawał przykład w poradniku, tylko tam było to zawarte w strukturze.

A więc trzeba stworzyć pętlę if (cz_przecinkowa<10)...Dalej nie wiem jeszcze dokładnie jak to napisać..


Dziękuję za pomoc :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 cze 2014, o 20:02 
Offline
Użytkownik
Avatar użytkownika

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

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

Jeśli cz_calkowita będzie mniejsza od 10 to wyświetli się przed nią spacja, a po przecinku wyświetli się zero jeśli cz_przecinkowa będzie mniejsza od 10.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 cze 2014, o 21:58 
Offline
Użytkownik

Dołączył(a): 30 sie 2012
Posty: 226
Pomógł: 11

Dzięki za pomoc. Działa jak należy.
Maksymalna różnica, to -0,03V na wyświetlaczu w porównaniu do multimetru dla praktycznie wszystkich pomiarów.
Multimetr mam najtańszy i też ciężko powiedzieć czy on pokazuje prawidłowo.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 lip 2014, o 16:19 
Offline
Użytkownik

Dołączył(a): 30 sie 2012
Posty: 226
Pomógł: 11

Panowie po dłuższej nieobecności zrobiłem kolejne testy zgodnie z poniższym schematem.

Obrazek

Wykorzystałem tutaj poradę Pana Mirka, dodając 2 diody Schottky'ego oraz dowolny wzmacniacz operacyjny, ponieważ docelowo ADC ma mierzyć napięcie na akumulatorze w samochodzie.

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


Pomiary, które zrobiłem przedstawiają się następująco:

Uzas [V] Uwyświetlacza [V] ADC Umultimetru [V]

2,70 2,73-2,80 142-144 2,73

4,45 4,49-4,57 234-235 4,50

5,74 5,82-5,88 301-303 5,80

7,32 7,41-7,45 384-385 7,40

10,49 10,61-10,65 548-549 10,59

12,06 12,22-12,23 631-632 12,19

12,90 13,07-13,09 674-675 13,03

13,53 13,69-13,71 707-708 13,67

14,00 14,17-14,19 732 14,14

14,25 14,42-14,44 744-745 14,39

14,40 14,56-14,60 753-754 14,54

Moje spostrzeżenia:
1. Na pierwszy rzut oka widać, że zasilacz laboratoryjny nieco zaniża napięcie, bo wartości z wyświetlacza i z multimetru są zbliżone i zawsze wyższe od napięcia zasilacza (posiadam zasilacz laboratoryjny Zhaoxin RPS-3005DB)
2. Wartości na wyświetlaczu bardziej wahają się w porównaniu do multimetru.
Na wyświetlaczu jest rozrzut max. 0,08V, a na multimetrze jest 0,00V.

Czy ten rozrzut na wyświetlaczu może być spowodowany zastosowaniem takiego, a nie innego schematu?
Wydaje mi się, że nie, ponieważ zastosowałem zalecane filtracje dla uP.

Czy w samym kodzie programu można jeszcze coś ulepszyć, aby nie było wahań rzędu 0,08V tylko np. 0,01V?

Dziękuję za pomoc



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 lip 2014, o 16:52 
Offline
Moderator
Avatar użytkownika

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

Panie kolego jeśli ty chcesz zrobić miernik wzorcowy, lepszy niż specjalizowane narzędzia to po pierwsze porzuć pomysł o robieniu tego na prockach tego typu, tzn na przetwornikach w nie wbudowanych. Wykorzystaj zewnętrzne specjalizowane układy ADC chociażby na początek takie jak w tym poradniku MCP3421

https://www.youtube.com/watch?v=L2Cp_7QohkI#t=31s

Poczytaj sobie w nocie katalogowej PDF procków o błędach nieliniowości, ofsetu i innych w takich wbudowanych przetwornikach ... Trzeba umieć dobrać odpowiednie narzędzia do odpowiednich celów ....

Innymi słowy mówiąc rowerem dojedziesz do sąsiedniej miejscowości ale już będziesz potrzebował samolotu aby dostać się do miejscowości na innym kontynencie (żeby się szybko dostać) ;)

Reasumując nawet i na wbudowanym przetworniku może być dużo lepiej ... ale .... ale weź panie kolego obejrzyj DOKŁADNIE całą serię poradników o ADC z mojego kanału yotube:

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

zobaczysz wtedy co to jest UŚREDNIANIE i jak sobie radzić z tzw "skaczącymi napięciami" ... rzuć okiem chociażby na szybko tutaj:

https://www.youtube.com/watch?v=fQHrTCwX2Ok#t=344

;)

_________________
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: 27 lip 2014, o 20:07 
Offline
Użytkownik

Dołączył(a): 30 sie 2012
Posty: 226
Pomógł: 11

Panie Mirku,
ja nie potrzebuję atomowej dokładności :)
Chciałem zapytać czy to, co do tej pory zrobiłem jest w porządku i jaką drogą ewentualnie pójść w celu dokładniejszych pomiarów (nie zależy mi na dokładności rzędu 1mV).
To wszystko, a z poradników skorzystam :)
Chcę tylko uniknąć sytuacji, w której jeśli napięcie będzie równe np. 14,2V, to aby na wyświetlaczu utrzymywało się np. 14,23V i nie wahało się do 14,30V. Ale poradniki w tym z pewnością pomogą.
Chciałem tylko wiedzieć czy pod względem elektronicznym taki schemat może pozostać.
Ja jestem prostym człowiekiem i zadaję proste pytania :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 lip 2014, o 20:20 
Offline
Moderator
Avatar użytkownika

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

piotr8605 napisał(a):
Chciałem tylko wiedzieć czy pod względem elektronicznym taki schemat może pozostać.


ja też jestem prostym człowiekiem i staram się jak najprościej odpowiadać ;)

schemat OK

ale jeszcze raz powtarzam w poradnikach dość dogłębnie wyjaśniłem zagadnienia związane z uśrednianiem wyników

a ty nawet tu wyżej piszesz sprzeczne rzeczy bo z jednej strony piszesz:

piotr8605 napisał(a):
ja nie potrzebuję atomowej dokładności.............. (nie zależy mi na dokładności rzędu 1mV)


żeby po chwili napisać:

piotr8605 napisał(a):
Chcę tylko uniknąć sytuacji, w której jeśli napięcie będzie równe np. 14,2V, to aby na wyświetlaczu utrzymywało się np. 14,23V i nie wahało się do 14,30V.


no to jednak troszkę ci zależy - i w tym "troszkę" pomoże ci odpowiednie podejście do uśredniania ;) ... być może ... czy na pewno ? sam ocenisz i sobie odpowiesz bo ty znasz założenia swojego projektu i do czego ci ten pomiar napięcia

_________________
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: 25 lis 2014, o 23:19 
Offline
Użytkownik

Dołączył(a): 30 sie 2012
Posty: 226
Pomógł: 11

Wracam do tematu po bardzo długiej przerwie.
Nie chcę rozpoczynać nowego tematu..
Chcę dołączyć do pomiaru napięcia na akumulatorze maks. 3 czujniki DS18B20 do pomiaru temperatury.
Chcę zastosować połączenie 3-przewodowe. Mam wolne nóżki procka: 2-PD0, 3-PD1, 4-PD2.
Nie wiem czy mój tok postępowania jest dobry, ale skopiowałem folder 1Wire do projektu ADC
Obrazek

Teraz muszę zmienić w pliku onewire.h
Obrazek

pin oraz port, tylko jak to zrobić, chcąc mierzyć temperaturę w 3 różnych miejscach (3 czujniki)?

Nie wiem dokładnie, jak powiązać plik main.c z ADC z plikiem main.c z 1Wire.

Działający kod programu ADC z pliku main.c to:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Posiadam wyświetlacz 2x16 znaków i w górnej linijce mam wyświetlone napięcie, a w dolnej chcę wyświetlić pomiary trzech temperatur.

Będę wdzięczny za pomoc i dalsze kroki, które muszę wykonać.
Pozdrawiam



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 lis 2014, o 19:25 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

Najprościej będzie jak wykorzystasz plik main w przykładu 10_1_Wire. Zanajdziesz tam coś takiego:

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

Wystarczy, że cały pomiar ADC (to co w pętli while, ale bez _delay_ms(1000);) wrzucisz if(s1_flag), a pomiar będzie wykonywany w każdej sekundzie.

Wspomnę, że bibliotekę 1-Wire dołącza się do projektu dołączając nagłówek w pliku main.c:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Zresztą masz to w przykładzie.

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 lis 2014, o 19:07 
Offline
Użytkownik

Dołączył(a): 30 sie 2012
Posty: 226
Pomógł: 11

Po skompilowaniu programu i ustawieniu w pliku onewire.h linii:

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


Wyświetlają się błędy odnośnie timera:

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


Program jest pisany na atmegę 32, a ja mam atmegę 88p, ale nie umiem jeszcze ustawiać timerów programowych.

W PDFie znalazłem rejestry OCR0A i OCR0B oraz timer TIMSK0 oraz TCCR0B oraz TCCR0A.

Nie wiem jak to teraz powiązać z programem, F_CPU mam ustawione na 8 MHz. Linię DQ mam podłączoną do drugiej nóżki procka - PD0. Czujnik podłączony w trybie normal.

Będę bardzo wdzięczny za pomoc.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 lis 2014, o 20:03 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

Patrzysz na te rejestry co znalazłeś i widzisz jakie mają bity i tym sposobem zamieniasz TCCR0 na TCCR0A lub TCCR0B, ale nie dowolnie tylko właśnie w zależności od tych bitów, które w nich siedzą. W przypadku OCR0 możesz wybrać albo A albo B, ale wtedy również odpowiedni do tego bit OCIE0A lub OCIE0B oraz wektor przerwania TIMER0_COMPA_vect lub TIMER0_COMPB_vect.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Wpis do OCR0A należałoby przeliczyć, ale prościej skorzystać z symbolu F_CPU:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Autor postu otrzymał pochwałę

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 lis 2014, o 06:26 
Offline
Użytkownik

Dołączył(a): 30 sie 2012
Posty: 226
Pomógł: 11

Zadziałało ;)
Czy jeśli będę podłączał dwa kolejne czujniki (połączenie równoległe czujników), to czy muszę do każdego kolejnego dawać rezystor 4k7?
Czy jest jakaś maksymalna odległość czujnika od procesora? Potrzebowałbym umieścić czujniki w odległości około 2m od procka.
Dziś przetestuję to wszystko z pomiarem ADC i dam znać.
Dziękuję bardzo za pomoc ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 lis 2014, o 21:22 
Offline
Użytkownik

Dołączył(a): 30 sie 2012
Posty: 226
Pomógł: 11

Dwa programy osobno działają bez problemu.

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


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


Po podpowiedzi kolegi Krauser próbowałem połączyć te dwa kody, mianowicie do pliku main.c z 1Wire dograć kod programu z ADC:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Błędy, które się pojawiają po kompilacji są następujące:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Nie wiem, gdzie robię błąd podczas łączenia tych dwóch programów...
Będę bardzo wdzięczny za pomoc.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 lis 2014, o 09:30 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

piotr8605 napisał(a):
undefined reference to `pomiar'

Nie znaleziono definicji funkcji pomiar. Umieść ją na końcu tak jak dla ADC.
piotr8605 napisał(a):
czy muszę do każdego kolejnego dawać rezystor 4k7?

Nie. Zresztą to będzie połączenie równoległe, czyli tak jak 1 rezystor. Im dłuższy kabel i więcej czujników tym mniejszy
piotr8605 napisał(a):
Czy jest jakaś maksymalna odległość czujnika od procesora?

200 metrów z rezystorem podciągającym. Szczegóły są na stronie producenta
http://www.maximintegrated.com/en/app-n ... mvp/id/148
Występuje tam takie pojęcie jak waga linii podawane w metrach. Każdy czujnik dodany do linii powiększa tą liczbę o 0,5 m. To wszystko wiąże się z pojemnością. Dłuższy kabel ma większą pojemność, a każdy dodany czujnik też ja zwiększa. Linia nie jest dłuższa, a zachowuje się tak jakby tak było.

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 lis 2014, o 21:28 
Offline
Użytkownik

Dołączył(a): 30 sie 2012
Posty: 226
Pomógł: 11

Docelowo chcę pokazać na wyświetlaczu:
Obrazek

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


Wyświetlacz pokazuje:
Obrazek

Czyli wyświetlanie jest prawidłowe.

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


Wyświetlacz pokazuje:
1.Obrazek

2.Obrazek


Dzięki pomocy kolegi Krauser i wgraniu kombinacji tych dwóch programów:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Wyświetlacz pokazuje następująco:
1.Obrazek

2.Obrazek

3.Obrazek

4.Obrazek

5.Obrazek

6.Obrazek

Sekwencje 4,5,6 powtarzają się ciągle w czasie...

Nie wiem dlaczego na wyświetlaczu pojawia się ciągle napięcie 0.00V (powinno się wyświetlać takie samo napięcie jak przy wgraniu samego programu ADC).
Obecnie mam podłączony jeden czujnik - docelowo: 3.
Gdy kolejne 2 czujniki nie są podłączone, to po prawej stronie wyświetlacza w linijce górnej i dolnej chcę wyświetlać: error.

Na pewno coś źle robię z wyświetlaniem znaków na LCD...
Będę bardzo wdzięczny za pomoc



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 lis 2014, o 21:42 
Offline
Użytkownik
Avatar użytkownika

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

A gdzie w tym ostatnim programie masz konfigurację przetwornika ADC?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 lis 2014, o 22:36 
Offline
Użytkownik

Dołączył(a): 30 sie 2012
Posty: 226
Pomógł: 11

jacekk232 napisał(a):
A gdzie w tym ostatnim programie masz konfigurację przetwornika ADC?


Dziękuję za cenną uwagę ;)
Konfiguracja już dodana, napięcie wyświetla się prawidłowo, sekwencje z obrazków 4,5,6 powtarzają się naprzemiennie z prawidłową już wartością napięcia.

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


Teraz jeszcze pozostaje kwestia, aby po podłączeniu zasilania wszystkie 4 wyniki wyświetliły się jednocześnie na wyświetlaczu...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 lis 2014, o 21:18 
Offline
Użytkownik

Dołączył(a): 30 sie 2012
Posty: 226
Pomógł: 11

Przerobiłem program 1Wire tak, aby można było mierzyć temperaturę na 3 czujnikach.
Efekt na wyświetlaczu:
Obrazek

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


Temperatura na dole po lewej stronie ma znak "C" bez odstępu, gdyż ten czujnik będzie pokazywał temperaturę minusową oraz dodatnią, ale nie przekraczającą 100 stopni C.

Czy jeśli na dwóch pozostałych czujnikach po prawej stronie będzie temperatura czasem minusowa, a czasem przekraczająca 100 stopni C, to czy wówczas linijka "3 22.7 C" zamieni się na "3-11.5 C" dla temperatury ujemnej, a dla temperatury powyżej 100 stopni C na "3 120.8C" czy może na "3120.8 C"?

Teraz chcę dołączyć tylko pomiar ADC w lewej górnej linijce, jak było pokazane na zdjęciu w jednym z wcześniejszych postów. Tylko nie wiem, jak wyeliminować zmienne wyświetlanie sekwencji 4,5,6 na wcześniejszych obrazkach.
Chyba gdzieś źle wstawiam kod programu ADC do programu 1Wire i te sekwencje zmieniają się w czasie.
Będę bardzo wdzięczny za pomoc ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 lis 2014, o 22:42 
Offline
Użytkownik

Dołączył(a): 30 sie 2012
Posty: 226
Pomógł: 11

Ostatecznie kod programu jest następujący:

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


Wyświetlacz pokazuje następująco:
1.
Obrazek
2.
Obrazek
3.
Obrazek
4.
Obrazek
5.
Obrazek
6.
Obrazek

Po wyświetleniu wszystkich 6-ciu sekwencji wyświetlacz pokazuje co około sekundę
następujące wyniki jak na obrazkach: 4-->5-->6-->4-->5-->6...itd.

Dla mnie prawidłowe wyświetlenie jest jak na 3-cim obrazku.

Nie wiem, gdzie robię błąd, że wyświetlacz nie pokazuje 4 pozycji jednocześnie, tylko przeskakuje.
Będę wdzięczny za pomoc.



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

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

Przemyśl jeszcze raz wyświetlanie wyników w taki sposób żeby nie używać polecenia lcd_cls. Ciągłe czyszczenie ekranu powoduje ci takie dziwne wyświetlanie danych. Krótko opiszę jak to działa.

Po wejściu do funkcji main wyświetlane są 3 temperatury (foto 1).
Po wejściu do while() i po upływie sekundy wyświetlacz jest czyszczony. Następnie wyświetla się napięcie (foto 2).
Co sekundę wyświetlacz jest nadal czyszczony i wyświetlane jest tylko napięcie.
Po upływie 3 sekund wyświetlacz jest czyszczony, wyświetla się napięcie i 3 temperatury (foto 3).
Po następnej sekundzie - lcd_cls, wyświetlanie napięcia (foto 4).
Kolejna sekunda - lcd_cls, wyświetlanie napięcia (foto 5).
Kolejna sekunda - lcd_cls, wyświetlanie napięcia i trzech temperatur (foto 6).
Mija kolejna sekunda i wracamy do sytuacji z foto 4 itd.

Na początek możesz usunąć lcd_cls i zobaczyć wynik.

Wyświetlanie zrób w taki sposób żeby wciąż nie czyścić ekranu tylko ustawiać kursor w odpowiednim miejscu ekranu za pomocą lcd_locate i stare dane po prostu nadpisywać nowymi danymi. Jeśli w jakimś miejscu wyświetlacza było coś wyświetlone a teraz to miejsce ma być puste to można te niepotrzebne znaki nadpisać spacjami. W ten sposób można ładnie wyświetlać dane beż użycia lcd_cls.

Czyszczenia ekranu warto użyć w sytuacji gdy cały ekran ma się zapełnić całkiem innymi danymi. A jeśli potem będą się zmieniać tylko fragmenty ekranu to znów warto tylko te fragmenty nadpisywać nowymi danymi.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 gru 2014, o 00:51 
Offline
Użytkownik

Dołączył(a): 30 sie 2012
Posty: 226
Pomógł: 11

jacekk232 napisał(a):
Na początek możesz usunąć lcd_cls i zobaczyć wynik.


Dokładnie to pomogło :) Linijkę nr 123 zakomentowałem.
Teraz jest dokładnie tak jak kolega napisał,
czyli najpierw pojawiają się 3 temperatury, a po sekundzie pojawia się napięcie.
Teraz, żeby napięcie pojawiało się w tym samym czasie, jak temperatury, to wówczas musiałbym dać kod z ADC przed pętlą while?

Dziękuję jeszcze raz za pomoc i dokładne wyjaśnienie :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 sty 2015, o 10:47 
Offline
Użytkownik

Dołączył(a): 30 sie 2012
Posty: 226
Pomógł: 11

Wszystko działa prawidłowo, ale nie wiem, w które miejsce przenieść kod programu ADC, aby po włączeniu zasilania na wyświetlaczu pojawiały się w tym samym czasie: napięcie oraz 3 temperatury.
Obecnie po podaniu zasilania najpierw pojawiają się 3 temperatury, a po około sekundzie pojawia się napięcie zasilania.

Poniżej kod programu:

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


Dziękuję za pomoc



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 sty 2015, o 14:23 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

To co w pętli while(1) masz pomiędzy ////////////////////////ADC//////////////////// przenieś sobie do nowej funkcji void pomiar_napiecia(void), a następnie wywołaj ją w tym miejscu, gdzie to się znajdowało oraz dodatkowo przed pętlą while(1) np. zaraz przed sei();

_________________
Dragonus Cracovus: Biomagia



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: 33 ]  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 2 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