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



Teraz jest 28 lis 2024, o 07:54


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: 25 lut 2012, o 22:37 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 19 lut 2012
Posty: 55
Pomógł: 0

Witam, mam pytanie czy jest możliwy pomiar napięcia z dwóch niezależnych źródeł jednocześnie?
Powiedzmy że korzystam z lekko zmodyfikowanego programu z książki, interesuje mnie pomiar napięcia na innej nóżce portu i przedstawienie wyniku na wyświetlaczu. Niestety do tej pory przy każdej próbie wyniki są różne przy każdym pomiarze.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lut 2012, o 23:01 
Offline
Moderator
Avatar użytkownika

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

Po to mamy wielokanałowy ADC żeby z niego właśnie korzystać w taki sposób. Tylko mam nadzieję, że pamiętasz o tym, że wszystko musi mieć wspólną masę ?

_________________
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 lut 2012, o 23:06 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 19 lut 2012
Posty: 55
Pomógł: 0

wszystko ma wspólną masę ale i tak to nie działa jak powinno.
Oparłem się na podstawowej wersji programu ponieważ wartość napięcia nie jest mi tak bardzo potrzebna.
Bardziej potrzebuję konkretnej zmiennej którą bym mógł wykorzystać w dalszych instrukcjach.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lut 2012, o 23:15 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 19 lut 2012
Posty: 55
Pomógł: 0

W książce korzystamy z pomiaru(5) a ja bym chciał skorzystać np z 5 i 6 tylko że jak podłączę dwa różne napięcia to zaczynają się kłopoty. Albo wyskakują różne wartości albo na obydwóch odczytach dominują wartości jednego źródła



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 lut 2012, o 00:45 
Offline
Użytkownik

Dołączył(a): 25 lis 2011
Posty: 232
Lokalizacja: Pisz
Pomógł: 2

Witam
Ponieważ też walczę z ADC (buduje termometr na pt1000) to po przeczytaniu tego: "Niestety do tej pory przy każdej próbie wyniki są różne przy każdym pomiarze." zastanawiam się jak ty to wszystko masz urządzone.
Czym zasilasz układ napięcie dobrze od filtrowane czy tak aby było do testów?
Piszesz że chcesz to wyświetlić na wyświetlaczu, wyświetlasz na jakim wyświetlaczu? U mnie wyświetlacz LED powodował spadki napięcia zasilania na 3 i 4 cyfrze po przecinku co już powodowało bujanie się wyniku pomiaru.
Mierzysz napięcie z innego źródła czy jeden zasilacz na wszystko?
Jakie napięcie odniesienia zewnętrzne wewnętrzne?
Proponuje na początek odczytywać pomiar przez uart.
No i zainteresować się uśrednianiem pomiaru w przykładzie 06 z płyty DVD Mirka jest przykład.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 lut 2012, o 18:53 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 19 lut 2012
Posty: 55
Pomógł: 0

Wszystko mam podłączone na płytce ATB 1.03
Buduję układ który będzie włączał podświetlenie schodów.
Używam do tego dwóch czujników ruchu, nie wiedziałem jak rozwiązać problem załączania oświetlenia więc postanowiłem wykorzystać
procesor AVR oraz program który będzie monitorował wartość napięcia i po przekroczeniu pewnej wartości włączał podświetlenie schodów. Używam najprostszego programu opartego na programie z książki.Przy podłączeniu pierwszego czujnika wszystko jest w porządku jednak jak dołączę drugi to wskazania się zmieniają i tylko jeden czujnik załącza światło



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 lut 2012, o 19:45 
Offline
Moderator
Avatar użytkownika

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

Spróbuj pokazać fragment kodu który sprawia ci problem 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: 26 lut 2012, o 20:22 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 19 lut 2012
Posty: 55
Pomógł: 0

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


To jest działająca wersja programu, pętla else tylko do celów testowych chociaż w urządzeniu końcowym może się przydać do wstępnej diagnostyki.
A tu wersja z dwoma czujnikami:

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 lut 2012, o 20:43 
Offline
Moderator
Avatar użytkownika

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

ale proszę umieszczaj kody źródłowe w znacznikach syntax = c

jak klikniesz w ODPOWIEDZ to nad polem do wpisywania tekstu i kodu masz takie rozwijane pole "listing kodu" - wystarczy go zaznaczyć i wybrać z tego pola język C - pokażę ci na przykładzie tego pierwszego twojego listingu a ty popraw tak drugi jak wyedytujesz wiadomość 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: 26 lut 2012, o 20:48 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 19 lut 2012
Posty: 55
Pomógł: 0

kod z dwoma czujnikami
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 lut 2012, o 20:49 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 19 lut 2012
Posty: 55
Pomógł: 0

działający kod z jednym czujnikiem
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 lut 2012, o 23:00 
Offline
Moderator
Avatar użytkownika

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

No już mam - powinna być jeszcze jedna pozycja w ERRACIE do książki bo nie powinno być tak:

Kod:
ADMUX |= (ADMUX & 0xF8) | kanal;


tylko tak

Kod:
ADMUX = (ADMUX & 0xF8) | kanal;


Ale wiecie co Panowie ? nie dam tego do erraty - i pomimo iż uznaję, że to jest błąd w kodzie w książce to potraktuję go jako pułapkę na szanownych czytelników ? A dlaczego ?

A dlatego, że nikt nie chce się pokusić zajrzeć do kodów z DVD a tam tego błędu nie ma hmmm ale też nie ma jak patrzę pomiarów na dwóch kanałach :( ... za to na DVD jest inny mniejszy błąd w kodach bo tam z kolei jest tak:

Kod:
while( !(ADCSRA & (1<<ADSC)) );


a powinno być tak:

Kod:
while( ADCSRA & (1<<ADSC) );



Tak czy inaczej mam nadzieję, że ten post rozwiąże te zagadki na temat pomiarów na kilku kanałach - musicie mnie jednak zrozumieć że nie wszystkie kody z książki które pisałem jako czysto dydaktyczne przykłady - po to tylko aby czytelnik mógł zrozumieć jak to działa a nie po to żeby używać tego jako bibliotek bo to duże nieporozumienie.

A co najgorsze - te osoby, które przepisują kod z książki zamiast zajrzeć do źródeł na DVD popełniają największe przestępstwo na sobie - ponieważ nie stosują uśredniania, które jest bardzo dobrze pokazane w kodach na DVD nie wspominając o fajnej funkcji zamiany liczby na string....

tak czy inaczej mam nadzieję, że tym skłonię jednak do zaglądania na DVD OK ? ;)

proszę dać znać czy wszystko teraz poszło dobrze ?

_________________
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 lut 2012, o 07:50 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 19 lut 2012
Posty: 55
Pomógł: 0

Do źródeł na DVD czasami nie zaglądam ale chcę żeby program był jak najbardziej moim dziełem a nie był przepisany żywcem z książki albo DVD.
Dziś wieczorem sprawdzę jak to działa, a narazie dwa czujniki mam podłączone pod jeden kanał, wstawione dwie diody i rezystor podciągający do GND.
Działą dobrze ale wolę dwa czujniki na osobnych kanałach bo daje to większą możliwość na zastosowanie różnego rodzaju efektów świetlnych.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 lut 2012, o 07:54 
Offline
Moderator
Avatar użytkownika

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

tomekpop napisał(a):
Do źródeł na DVD czasami nie zaglądam ale chcę żeby program był jak najbardziej moim dziełem a nie był przepisany żywcem z książki albo DVD.

Ale ja to bardzo dobrze rozumiem i wręcz doceniam takie podejście - bo zresztą liczyłem wręcz na taką postawę jako autor książki. Za to może się zdarzyć, że coś nie będzie działać (to jedno) - wtedy są pod ręką kody źródłowe. Ale jest jeszcze jedna ważna sprawa za którą przemawia przyjrzenie się im gdy zrealizuje się już podstawowe ćwiczenia z książki nawet samodzielnie - one się różnią w wielu miejscach i bywają bardziej rozwinięte czy rozbudowane - dzięki temu z nich także można się czegoś nowego nauczyć podglądając jak są pisane - o to chodzi.

tomekpop napisał(a):
Dziś wieczorem sprawdzę jak to działa, a narazie dwa czujniki mam podłączone pod jeden kanał, wstawione dwie diody i rezystor podciągający do GND.
Działą dobrze ale wolę dwa czujniki na osobnych kanałach bo daje to większą możliwość na zastosowanie różnego rodzaju efektów świetlnych.


Myślę, że po tych podpowiedziach których udzieliłem wyżej już wszystko powinno być jasne i ci zadziała.

Zresztą spróbuj sobie przeanalizować jak działa linijka

ADCSRA |= .....

a jak działa ta prawidłowa jej wersja

ADCSRA = .....

bo jak przeanalizujesz bit po bicie każdą operację to zobaczysz ogromną różnicę

_________________
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 lut 2012, o 08:10 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 19 lut 2012
Posty: 55
Pomógł: 0

Dzięki, wieczorem na pewno dam znać, może nawet będą fotki gotowego układu



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 lut 2012, o 22:16 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 19 lut 2012
Posty: 55
Pomógł: 0

Podpowiedzi pomogły, układ działa, bardzo dziękuję.
Miały być fotki ale płytki dzisiaj nie przyszły, może jutro się uda.
Pozdrawiam



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 lut 2012, o 22:04 
Offline
Użytkownik

Dołączył(a): 16 lut 2012
Posty: 219
Pomógł: 1

A ja mam takie pytanko. Próbwałem wgrać program przetworniku ADC z płytki CD do mojego procka Atmega32, fusy ustawione na 8Mhz. W programie LCDika zmieniłem linie sterujące na włsnej, tak jak mam podłączone w swojej płytce:
Kod:
// tu konfigurujemy port i piny do jakich podłączymy linie D7..D4 LCD
#define LCD_D7PORT  C
#define LCD_D7 5
#define LCD_D6PORT  C
#define LCD_D6 4
#define LCD_D5PORT  C
#define LCD_D5 3
#define LCD_D4PORT  C
#define LCD_D4 2


// tu definiujemy piny procesora do których podłączamy sygnały RS,RW, E
#define LCD_RSPORT C
#define LCD_RS 0

#define LCD_RWPORT C
#define LCD_RW 1

#define LCD_EPORT C
#define LCD_E 1

Wgrałem program przetwornika ADC do mojego procka z zmienionymi tymi parametrami LCD i nic nie chce wyświetlić. Dodam, że wyświetlacz oraz podłączenie wyświetlacza jest sprawdzone w innych program z obsługą LCD. Pomógłby ktoś o co może chodzić?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 lut 2012, o 23:20 
Offline
Moderator
Avatar użytkownika

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

Po pierwsze - czy korzystasz z pinu RW wyświetlacza LCD podłączonego do GND czy do procesora ? Bo jeśli do procesora to zobacz jakiego babola zrobiłeś ;)

#define LCD_RWPORT C
#define LCD_RW 1

#define LCD_EPORT C
#define LCD_E 1

obydwa sygnały zdefiniowałeś na tym samym pinie PC1 :(

a jeśli masz RW podłączone do GND to jest OK - tylko że nie zauważyłeś w tym pliku *.h oraz w opisie w książce że jest tam jeszcze jeden parametr, który mówi bibliotece czy ma korzystać z pinu RW czy nie

#define USE_RW 0 <---- pin RW podłączony do GND

#define USE_RW 1 <---- pin RW podłączony do mikrokontrolera

i nie wspomnę już tego czy zassałeś aktualizację do biblioteki LCD ?????? a przecież jest do pobrania na naszym forum:

topic27.html

w co drugim prawie poście już przypominam szanownym czytelnikom o tych aktualizacjach

_________________
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: 29 lut 2012, o 19:20 
Offline
Użytkownik

Dołączył(a): 16 lut 2012
Posty: 219
Pomógł: 1

-Pin RW nie wykorzystuje. O tym, że dwa razy mam C1 to wiem. A w *.h mam
Kod:
#define USE_RW 0

-Zassałem nowe biblioteki i nadal nic nie wyświetla. Ale jak testowałem stare biblioteki na innym programie to dobrze sprawował się LCDik. Poprostu wyświetlacem się bawiłem i było ok, aż do momentu tego programu.
-Przepisałem pierwszy program z ADC (pomiar napięcia) tak jak jest w książce i nic. Poprostu wyświetlacz nie chce rechnąć. Mam podłaczone AVCC oraz Uref do +Ucc w procku.
Połączenia LCD=> uP jest ok i tak samo jest w programie zmienione na moje piny.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 lut 2012, o 19:30 
Offline
Moderator
Avatar użytkownika

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

No no no - ładnie - a gdzie widziałeś czy wyczytałeś żeby wejście AREF (nazwałeś je chyba Uref) podłączać do VCC ???? toż jeśli programowo załączyłeś wewn źródło odniesienia 2,56V to właśnie smażysz procka ogniem piekielnym.

Poza tym podeślij mi swój spakowany projekt do ZIP'a na biuro@atnel.pl to zobaczę co tam namodziłeś jeszcze 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: 29 lut 2012, o 19:56 
Offline
Użytkownik

Dołączył(a): 16 lut 2012
Posty: 219
Pomógł: 1

To jest cały kod:
Kod:
//biblioteki
#include <avr/io.h>
#include <avr/delay.h>

//dołączenie moich plików LCD
#include "LCD/lcd44780.h"


uint16_t pomiar(uint8_t kanal);      //deklaracja funkcji pomiaru

// główna funckja main
int main(void)
{
   lcd_init();                       //inicjalizacja LCD
   //napięcie odniesienia jako Vcc
   ADMUX |= (1<<REFS0);
   //włączenie modułu ADC oraz ustaiwnie prescala na 64
   ADCSRA |= (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0);

   //nieksończona pętla, w której będzie dokonywany pomiar
   // i wynik na LCDiku

   while(1);
   {
       lcd_cls();
      //pomiar napięcia na wejściu ADC5 i wyświetlenie wartości na LCD
      lcd_locate(0,0);
      lcd_int(pomiar(5) );                 //musi być _int bo tak jest w bilbiotekach LCD
      lcd_locate(0,8);
      lcd_str("V");
      // odczekanie 1s.
      _delay_ms(1000);

   }
}

//DEFINICJA funkncji, która dokonuje pomiaru na wybranym kanale/wejściu
uint16_t pomiar(uint8_t kanal)
{
   //ustawienie wybranego kanału ADC w rejestrze ADCSRA
   ADMUX |= (ADMUX & 0XF8) | kanal;
   //Start pomiaru przez ustawienie bitu ADC w rejestrze ADCSRA
   ADCSRA |= (1<<ADSC);
   //oczekiwanie na koniec pomiaru (dopóki ADSC = 0 jest = 1)
   while( ADCSRA & (1<<ADSC) );
   //po zakończeniu pomiaru, gdy bit ADSC=0, zwrócenie wyniku w postaci
   // 16-biowej wartości z rejestrów ADCH oraz ADCL
   return ADCW;

}




A tutaj zmieny *.h w LCD Nowe zassane były tylko *.c
Kod:
#define LCD_Y 2      // ilość wierszy wyświetlacza LCD
#define LCD_X 16   // ilość kolumn wyświetlacza LCD

// tu ustalamy za pomocą zera lub jedynki czy sterujemy pinem RW
//   0 - pin RW podłączony na stałe do GND
//   1 - pin RW podłączony do mikrokontrolera
#define USE_RW 0

//----------------------------------------------------------------------------------------
//
//      Ustawienia sprzętowe połączeń sterownika z mikrokontrolerem
//
//----------------------------------------------------------------------------------------
// tu konfigurujemy port i piny do jakich podłączymy linie D7..D4 LCD
#define LCD_D7PORT  C
#define LCD_D7 5
#define LCD_D6PORT  C
#define LCD_D6 4
#define LCD_D5PORT  C
#define LCD_D5 3
#define LCD_D4PORT  C
#define LCD_D4 2


// tu definiujemy piny procesora do których podłączamy sygnały RS,RW, E
#define LCD_RSPORT C
#define LCD_RS 0

#define LCD_RWPORT C
#define LCD_RW 1

#define LCD_EPORT C
#define LCD_E 1


A tak opromo jak już piszę to mam takie pytanka:
-Powinno być
Kod:
#include "LCD/lcd44780.h"
czy
Kod:
#include "lcd44780.h"

Bo przy tym drugim mi wyskakuje błąd, a tak jest w książce.
-Co to znaczy return ADCW? Jak ta funkcja zwraca rezulaltat? Przecież chcemy odczytać ADCH oraz ADCL, a nie wiem co to znaczy ADCW (myślałem, że chodzi o rejestr, ale takiego wogóle nie ma)?
- pomiar(5) to znaczy, że 5 kanał, czyli ADC5?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 lut 2012, o 20:03 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 14 paź 2011
Posty: 307
Lokalizacja: Lbt
Pomógł: 8

ADCW równa się tyle co (ADCH<<8)|ADCL czyli 10bitowy wynik pomiaru.

Co do załączania plików nagłowkowych wyświetlacza to jak w projekcie będziesz miał folder LCD a w nim pliki to wtedy użyjesz pierwszego sposobu, a jak pliki będą się znajdować w tym samym katalogu co plik main.c to drugiego.

Spróbuj najpierw wyświetlić cokolwiek na wyświetlaczu i później uruchom adc.


Jeżeli wywołując funkcję obsługującą adc z parametrem 5 ustawiasz rejestr ADMUX do postaci XXXX 0101 czyli wybierasz piąty kanał adc.

I według mnie w tej linii
ADMUX |= (ADMUX & 0XF8) | kanal;
powinna być wartość 0xF0 bo tutaj są cztery bity mux, a tym wpisem zerujesz tylko trzy najmłodsze.

PS.Jak robisz listing kodu to w syntax wybieraj c.

_________________
Ujemna delta to dopiero początek zabawy...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 lut 2012, o 20:40 
Offline
Użytkownik

Dołączył(a): 16 lut 2012
Posty: 219
Pomógł: 1

Dobra sorki, problem rozwiązany. Za pętlą while(1) zrobiłem ; Usunąłem go i sprawa rozwiązana. Trchę głupi błąd;/
Ale nadal nie rozumiem jak jest z tym ADCW. Przecież w całym programie wogóle go nie ma, a tu nagle na końcu funckcji się ujawnia?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 lut 2012, o 20:40 
Offline
Moderator
Avatar użytkownika

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

A ja dodam to tego co napisał wyżej kolega miszczo jedno:

BARDZO DZIĘKUJĘ !!!! że kolega tak fajnie mnie wyręczył w odpowiedziach. Szalenie trafne uwagi i sugestie co musisz zrobić żeby pójść dalej a szczególnie ta - żebyś najpierw darował sobie ADC - a zajął się normalnym odpaleniem LCD.

_________________
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: 29 lut 2012, o 20:44 
Offline
Moderator
Avatar użytkownika

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

miszczo napisał(a):
Jeżeli wywołując funkcję obsługującą adc z parametrem 5 ustawiasz rejestr ADMUX do postaci XXXX 0101 czyli wybierasz piąty kanał adc.

I według mnie w tej linii
ADMUX |= (ADMUX & 0XF8) | kanal;
powinna być wartość 0xF0 bo tutaj są cztery bity mux, a tym wpisem zerujesz tylko trzy najmłodsze.


Tylko do jednego mam uwagę, otóż maskowanie jak niżej:

ADMUX |= (ADMUX & 0XF8) | kanal;

w przypadku prostych pomiarów jest jak najbardziej poprawne pomimo 4 bitów . Warto jednak zajrzeć do noty i zobaczyć że TYLKO trzy najmłodsze bity biorą udział w podstawowym przełączaniu kanałów od 0 do 7 prawda ? za to błąd jest w tym że nie powinien być tu użyty dwuczłonowy operator |= , ta linia powinna wyglądać tak:

ADMUX = (ADMUX & 0XF8) | kanal;

oczywiście z punktu widzenia programu autora wątku nie ma to żadnego znaczenia to jednak gdyby chcieć przełączać się pomiędzy dwoma kanałami i mierzyć np dwa napięcia - to już byłaby niestety ogromna kiszka - to jest mały błąd albo niedopowiedzenie w książce.

_________________
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: 29 lut 2012, o 20:48 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 14 paź 2011
Posty: 307
Lokalizacja: Lbt
Pomógł: 8

Klucha napisał(a):
Dobra sorki, problem rozwiązany. Za pętlą while(1) zrobiłem ; Usunąłem go i sprawa rozwiązana. Trchę głupi błąd;/
Ale nadal nie rozumiem jak jest z tym ADCW. Przecież w całym programie wogóle go nie ma, a tu nagle na końcu funckcji się ujawnia?

ADCW to jakieś makro upraszczające które samo łączy rejestry adcl i adch, tak samo jak masz makra do przesunięć bitowych np 1<<PB5 i przesuwa ci jedynkę na 6 miejsce.

_________________
Ujemna delta to dopiero początek zabawy...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 lut 2012, o 20:50 
Offline
Moderator
Avatar użytkownika

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

Klucha napisał(a):
Ale nadal nie rozumiem jak jest z tym ADCW. Przecież w całym programie wogóle go nie ma, a tu nagle na końcu funckcji się ujawnia?


Jeszcze raz zapytam - bo nie odpowiedziałeś:

czy zaglądałeś do kodów źródłowych na DVD ????? tam przecież masz ADCW

a ADCW to makro przygotowane już przez AVR GCC i właśnie po to żebyś nie musiał wciąż pisać

Widzisz Pan jakbyś używał Eclipse to byś sobie wcisnął klawszi CTRL, najechał kursorem mychy na słowo ADCW i kliknął lewy klawisz mychy. To są te zalety, których ludzie nie doceniają - a szkoda bo potem się tak męczą i pytania zadają ;) ... tzn nie mam nic do pytań - skądże ale szkoda mi was panowie że moglibyście od razu się tego dowiedzieć po takim kliknięciu - bo Eclipse od razu przeniosłoby was do odpowiedniego pliku nagłówkowego gdzie jest zdefiniowane to ADCW i od razu sam byś wiedział co to jest, proszę to się ukazało po kliknięciu:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć 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: 1 mar 2012, o 20:01 
Offline
Użytkownik

Dołączył(a): 16 lut 2012
Posty: 219
Pomógł: 1

Mam jeszcze taki problem,że mierzy mi ładnie napięcie do ok. 0,63V, a potem pokazuje bzdury. Włączone wewnętrzne napięcie AREF. Napięcie mierzone podane jest z zasilacza na dzielnik 2x 10k, czyli podział = 2. Czyli 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.

A jak zrobie razy 2 to pokazuje mi wynik 2 razy większy, co właśnie powinien pokazywać wynik dobry, ponieważ jest dzielnik.
W programie mam napisane bez *2 i pokazuje dobrze do 0,63V. Zamieszczam owy program:
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: 1 mar 2012, o 20:37 
Offline
Moderator
Avatar użytkownika

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

Na pierwszy rzut oka widać jak bardzo albo niestety nie dbasz o typy danych (zmiennych) albo niestety (co gorsze) w ogóle się nie orientujesz o co chodzi z tymi typami - więc w tym drugim przypadku musisz raczej o tym zacząć czytać i ćwiczyć od nowa, podam ci przykład tego co np zrobiłeś:

Kod:
uint8_t pm;


a potem

Kod:
pm = pomiar(5);


No i teraz spróbuj dojść sam co tu jest tragicznie źle zrobione 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: 1 mar 2012, o 20:44 
Offline
Użytkownik

Dołączył(a): 16 lut 2012
Posty: 219
Pomógł: 1

Ok, wszystko już wiem, woltomierz już ładnie działa. Poprostu bezmyślnie przepisywałem z książki i nie dość tego nie patrzyłem na typ zmiennej. Mój tragiczny błąd, sory za bezmyślne zawracanie głowy i wielkie dzięki za podpowiedź:)



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 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