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



Teraz jest 22 lis 2024, o 02:45


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 6 ] 
Autor Wiadomość
PostNapisane: 23 wrz 2019, o 22:08 
Offline
Nowy

Dołączył(a): 23 wrz 2019
Posty: 5
Pomógł: 0

Dzień dobry
Miałem za zadanie stworzyć prosty, mały program, w którym wyjścia miały wysterowywać diody led. Teoretycznie banalna sprawa - miały się zapalać pierwsza, druga, trzecia, druga z trzecią na raz, pierwsza z trzecią.... piąta, piąta z szóstą jednocześnie... itp.
Problem którego nie pojmuję, i nie wiem co jest na rzeczy, polega na tym, że port B(ten ostatni na liście wyjść), który jest jedynym z pośród innych portów D, zachowuje się następująco: Zapalają się porty D, pierwszy , drugi itp., natomiast gdy przychodzi pora na port B, ten również się zapala, ale już nie gaśnie - pali się cały czas, nie reagując na fakt że inne pracują poprawnie. Zapętlenie cyklu nie wpływa na to. Czy ustawię go jako pierwszy, środkowy, czy ostatni, zachowuje się tak samo - po przyjściu jego kolei, zapala się, ale już nie gaśnie. Pali się ciągle.
Jak DDRB zdefiniuję na ten jedyny obsługiwany port B, to nic nie daje. Zostawiłem wszystkie - 'FF'
Jeszcze jedno - jak zamiast jednego wyjścia portu B, zastosuję jedno portu C, to jest to samo. C wtedy zachowuje się tak jak opisałem powyżej.
Gdzie tkwi błąd? Za ewentualną pomoc dziękuję.

#define F_CPU 1000000L
#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
DDRD = 0xFF;
DDRB = 0xFF;

for(;;)
{
_delay_ms(1000);
PORTD = 0x08;
_delay_ms(1000);
PORTD = 0x04;
_delay_ms(1000);
PORTD = 0x18;
_delay_ms(1000);
PORTD = 0x0C;
_delay_ms(1000);
PORTD = 0x14;
_delay_ms(1000);
PORTB = 0x01;
_delay_ms(1000);
}
}



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 wrz 2019, o 06:02 
Offline
Użytkownik

Dołączył(a): 25 lip 2013
Posty: 2584
Pomógł: 128

Po pierwsze nie używamy F_CPU w kodzie a w ustawieniach projektu. To tak na przyszłość. Po drugie to jaki to procek oraz czy patrzyłeś w pdf jakie funkcje alternatywne kryją się pod portami, które Ci nie chodzą?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 wrz 2019, o 06:18 
Offline
Użytkownik

Dołączył(a): 28 wrz 2016
Posty: 215
Pomógł: 14

Zauważ, że zapalasz pin w porcie B (PORTB = 0x01;), a go nie gasisz. Stan portu B (jak i każdego innego) pozostanie niezmienny, dopóki TY go nie zmienisz.
By uzyskać efekt jaki chcesz końcówka kodu mogła by wyglądać 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.

popraw wklejanie kodu

_________________
de gustibus non est disputandum



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 wrz 2019, o 11:52 
Offline
Nowy

Dołączył(a): 23 wrz 2019
Posty: 5
Pomógł: 0

Dziękuję za odpowiedzi. Jak wiadomo, i co widać po poście, pisanie w C++ to moje początki.
Panie Alef2, wygaszenie tego portu pomogło. Wszystko teraz działa jak należy, jednak kierowałem się zachowaniem portów D. Tam wygaszanie ich nie było konieczne. Wygaszały się same, a program wyglądał jak to, co wkleiłem. Nie pojmuję tego zachowania. Moje pisanie tego było dość doświadczalne. Kolejno podawałem sygnały na porty D, i te nie paliły się ciągle, a wygasały podczas zapalenia się kolejnych. Myślałem, że tak samo będzie z tym portem B, ale nie było. Nawiasem, jak wspomniałem, ten port B zastępowałem innymi 'B', a także C. Zawsze były one takimi jedynymi wśród tych D, które wykorzystywałem wszystkie. To taka połowicznie rozwiązana sprawa. Program działa, wszystko jest jak należy już, ale fakt niewiedzy, czemu tak było z tymi portami, pozostał.
Do Micky'ego - Była to Atmega8, nie korzystałem z żadnych portów typu reset, Xtal, SCK, Miso. Zdefiniowanie CPU w programie, czy jego brak, nic mi nie zmienił w działaniu.
Dziękuję, pozdrawiam



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 wrz 2019, o 12:29 
Offline
Użytkownik

Dołączył(a): 09 lip 2019
Posty: 109
Pomógł: 11

Kolega Alef2 dokładnie napisał o co chodzi - ale sprawa jest banalnie prosta. Wpisanie do portu D nowej wartości ustawia na zera i jedynki odpowiednio każdy bit tego portu. Wpisanie kolejnej wartości za pomocą PORTD = cośtam zastępuje całkowicie poprzednią wartość - dlatego stosowne diody gasłu. W oryginalnej wersji programu wpisywałeś po prostu konkretną watość do PORTB i ona tam zostawała na zawsze. Nie była zastępowana niczym innym. Wpisanie tam 0x00 po prostu "gasi" stosowne bity... ot i cała filozofia.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 wrz 2019, o 13:19 
Offline
Nowy

Dołączył(a): 23 wrz 2019
Posty: 5
Pomógł: 0

Moscow... otworzyłeś mi oczy. Rzeczywiście. Przecież jeśli wygaszam ten jeden port B komendą 0x00, to równie dobrze wpisując komendę na port D (np.) 0x01 (00000001), i potem 0x02 (00000010), automatycznie wygaszam poprzednią(0x01), dając 0 zamiast 1, zarazem daję komendę na inne wyjście(0x02) i nie potrzebna jest osobna '0x00' gasząca całość D, czy też ten 0x01.
Dziękuję a wyjaśnienie.



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:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO