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



Teraz jest 26 lut 2026, o 12:49


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 10 ] 
Autor Wiadomość
PostNapisane: 23 lis 2013, o 22:44 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 20 paź 2013
Posty: 143
Lokalizacja: Zamość
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.


Witam serdecznie Forumowiczów.
Mam problem z powyższym programem w tym miejscu:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


na PB0 mam cały czas jedynkę a wartość ADC zmienia się w zakresie 80-150, więc powinno się na PB0 pojawić 0 w pewnym momencie.
Proszę o cenną sugestię.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 lis 2013, o 23:02 
Offline
Użytkownik

Dołączył(a): 10 paź 2012
Posty: 123
Pomógł: 10

matej1410 napisał(a):

PORTB |= (0<<PB0);


.

Robisz OR z 0 więc jak była jedynka na tym bicie to OR 1 z 0 da już zawsze 1.
Musisz tu wyzerować bit czyli
PORTB & =~(1<<PB0)

Pozdrawiam
Jarek


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 lis 2013, o 23:22 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 20 paź 2013
Posty: 143
Lokalizacja: Zamość
Pomógł: 0

zmieniłem kod:

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

teraz się ładnie wyłącza, ale niestety nie włącza się ponownie...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 lis 2013, o 00:08 
Offline
Użytkownik

Dołączył(a): 10 paź 2012
Posty: 123
Pomógł: 10

Rzuciłem okiem na resztę programu i tak nie do końca jestem pewien czy dobrze rozumiem ale te zmiany na PB0 odbywają się w pętli
for(int k=1; k<=p; k++)
która wykona się tylko "<=p" razy i więcej nie więc później zmiany na PB0 nie będą się dokonywać mimo zman odczytu na ADC.
Program w ogóle wygląda jakby miał się tylko jeden raz wykonać (w sensie że nie ma nieskończonej pętli).
Może opisz dokładniej co on ma robić do będzie łatwiej pomóc. Pisałeś też że widzisz zmiany wartości ADC - jak je odczytujesz?
Pozdrawiam
Jarek



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 lis 2013, o 00:26 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 20 paź 2013
Posty: 143
Lokalizacja: Zamość
Pomógł: 0

Tak to prawda, w pętli k. Jest to zamierzone. Ale przecież w skończonej pętli też będą się odbywały pomiary, tak? a może się mylę?
Bo co zrobić jak chcemy, żeby wartość ADC była mierzona tylko w jednej części programu? Nie możemy dać nieskończonej pętli ponieważ pomiar się nie skończy a zależy nam na tym żeby w końcu już nie mierzył. Odnośnie podglądania wartości to przełączam się na inny program który napisałem i sprawdzam czy czujnik zmienia wartość ADC, i zmienia. Robię to jednak w obrębie innego programu i tylko po to, żeby sprawdzić czy czujnik działa.

Co do idei działania programu to jest to programator do pralki.
Jak widzisz pętla k ma w sobie dwa "ify" które sprawdzają parzystość liczby k. Jesli liczba k jest parzysta to silnik pralki kręci w lewo, jesli nieparzysta w prawo. Poniżej pętla ze zmiennymi q oraz e to pętla płukania czyli silnik obraca się w jedną stronę z przerwami. ostatnia pętla to pętla wirowania.
Wracając do tej wartości ADC to chciałbym aby wartość adc była sczytywana w petli k tylko i wyłącznie.
Może być nawet tak, że to adc może się wykonać pomiedzy pętlą for nr 1 oraz 2 w tym programie i koniec lub wykonywać się cyklicznie w pętli k co jest odpowiednikiem tego, że woda podgrzeje się raz na całe pranie i koniec lub podgrzewać się cyklicznie z przerwaniami w pętli k.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 lis 2013, o 01:13 
Offline
Użytkownik

Dołączył(a): 10 paź 2012
Posty: 123
Pomógł: 10

Pod względem kasowania czy ustawiania bitu PB0 jest OK. Z tego co napisałeś to wynika że nie znasz tak na prawdę wartości ADC w Twoim programie a odczytujesz wartość na wejściu w innym być może różniącym się trochę od tego co pokazałeś.
Jeśli masz możliwość np. wyrzucenia wartości ADC w pokazanym programie np. na LCD to będziesz mógł sprawdzić czy rzeczywiście wartości Ci się zmieniają. Zauważyłem jeszcze, że używasz trybu pojedynczego pomiaru ale nie czekasz na jego zakończenie i być może tu tkwi problem.Wstaw po
ADCSRA |= (1<<ADSC);
oczekiwanie na zakończenie konwersji czyli to:

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

a dopiero sprawdzaj wartość ADC
Pozdrawiam
Jarek

ps.
To powyżej dotyczy meritum a co do pozostałych poruszanych zagadnień mówiąc o pętli nieskończonej miałem na myśli pętlę dla całego programu. W Twoim przypadku program się kończy i tylko reset spowoduje że znowu zacznie działać. Jeśli spełnia to Twoje oczekiwania to ok ale generalnie czegoś takiego się nie robi. Wszystko to co robisz można zrobić w nieskończonej pętli używając timerów programowych i flag. Nieskończona pętla nie oznacz też że np. pomiar ADC będzie się wykonywał cały czas - przecież można go włączać/wyłączać w zależności od stanu programu np. gdy jest cykl prania adc się wykonuje, gdy inny stan przetwornik jest zatrzymany. Nie da się tak tego opisać w paru zdaniach niestety.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 lis 2013, o 11:36 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 20 paź 2013
Posty: 143
Lokalizacja: Zamość
Pomógł: 0

dziękuję za odpowiedź.

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


------------------------ [ Dodano po: 5 minutach ]

a może być tak, że jednocześnie nie będzie chciało działać PWM i ADC?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 lis 2013, o 12:02 
Offline
Użytkownik

Dołączył(a): 10 paź 2012
Posty: 123
Pomógł: 10

Oczekiwanie na pomiar jest teraz ok ale czemu znowu zmieniłeś tą linię:

matej1410 napisał(a):
PORTB ^=(1<<PB0);

Wczesniej juz przeciez pisalem, że zerowanie bitu to:
PORTB & =~(1<<PB0)
Pozdrawiam
Jarek

------------------------ [ Dodano po: 5 minutach ]

matej1410 napisał(a):
a może być tak, że jednocześnie nie będzie chciało działać PWM i ADC?

Używasz PC5 więc co najwyżej nie działało by Ci sprzętowe I2C - PWM powinien działać.
pozdrawiam
Jarek



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 lis 2013, o 12:13 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 20 paź 2013
Posty: 143
Lokalizacja: Zamość
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.


skoro to wyżej to jest uruchomienie pojedynczego pomiaru, to czy trzeba stosować tą linijkę niżej? Skoro to się wykonuję tylko raz i koniec to trzeba tą drugą dodawać?

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 2013, o 12:19 
Offline
Użytkownik

Dołączył(a): 10 paź 2012
Posty: 123
Pomógł: 10

matej1410 napisał(a):
skoro to wyżej to jest uruchomienie pojedynczego pomiaru, to czy trzeba stosować tą linijkę niżej? Skoro to się wykonuję tylko raz i koniec to trzeba tą drugą dodawać?

Trzeba poniewaz wpisanie 1 do ADSC tylko uruchamia pomiar a trwa on pewien czas. Zgodnie z nota atmegi do momentu aż pomiar nie zostanie skończony ADSC jest 1 a po zakończeniu pomiaru ustawiany jest na 0 i to jest oznaką poprawnego zakończenia przetwarzania. To właśnie się sprawdza w tej pętli while. Bez niej uruchamiasz pomiar i od razu odczytujesz rejestr ADC więc mogą tam być przypadkowe wartości nie związane z tym co jest na wejściu ADC.
Pozdrawiam
JArek



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: 10 ] 

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