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



Teraz jest 7 lip 2026, o 10:42


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 18 ] 
Autor Wiadomość
PostNapisane: 16 gru 2015, o 21:51 
Offline
Użytkownik

Dołączył(a): 01 lis 2015
Posty: 129
Pomógł: 0

Program następujący:

Kod:
#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
DDRC = 0xFF;
PORTC = 0xFF;
while(1)
{
uint8_t i, zmienna=1;
for( i=0; i<8; i+1)
{
PORTC= ~zmienna;
l=zmienna*2;
_delay_ms(500);
}

PORTC=0xFF;
_delay_ms(500);
}
}

Rozumiem to tak: Na początku wpisywana jest w PORTC jedynka tylko że negujemy. Natomiast potem zamiast jedynki już jest 2, ponieważ 1*2, potem 0,5 sek przerwy i zerowanie portów przez wpisanie 1. Przerwa 0,5s i znowu while od początku. Ale już mamy i=1, zmienna=2 i dwójka jest wpisywana do PORTC potem już w zmiennej zmienna mamy 4 (2*2), przerwa, zerowanie diod, przerwa i while od początku i wpisujemy PORTC 4 w i potem zmienna wynosi 4*2 i tak dalej i tak dalej...

Dobrze to zrozumiałem?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 gru 2015, o 22:20 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 mar 2014
Posty: 1475
Pomógł: 167

Cytuj:
l=zmienna*2
Nie jest nigdzie wykorzystane.
Cytuj:
Na początku wpisywana jest w PORTC jedynka tylko że negujemy

Jest wpisywana zanegowana wartość 1, czyli 254 = 0xFE = 0b11111110. Co po wcześniejszym pisaniu 0xFF (czyli 0b11111111) powoduje wyzerowanie pinu PC0.

Cytuj:
Ale już mamy i=1, zmienna=2 i dwójka jest wpisywana do PORTC potem już w zmiennej zmienna mamy 4 (2*2)

W kolejnych pętlach nic się nie dzieje, bo wartość dla zmienna cały czas jest równa 1.

Być może
Cytuj:
l=zmienna*2
powinno być zamienione
Cytuj:
zmienna=zmienna*2


--
Pozdrawiam,
Robert



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 gru 2015, o 22:22 
Offline
Moderator
Avatar użytkownika

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

1. a skąd ci się tam wzięła zmienna o nazwie l ? (małe L) .... to się nie skompiluje - przekombinowałeś

2. pętla for u ciebie jest pętlą nieskończoną - zastanów się dlaczego - podpowiedź - poczytaj jak się używa pętli for()

_________________
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: 16 gru 2015, o 22:23 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 mar 2014
Posty: 1475
Pomógł: 167

Prościej jest zrobić
for (i = 0; i < 8; i++)
{
PORTC = ~(1 << i);
_delay_ms(500);
}



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 gru 2015, o 22:29 
Offline
Użytkownik

Dołączył(a): 01 lis 2015
Posty: 129
Pomógł: 0

Kod:
#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
DDRC = 0xFF;
PORTC = 0xFF;
while(1)
{
uint8_t i, zmienna=1;
for( i=0; i<8; i+1)
{
PORTC= ~zmienna;
zmienna=zmienna*2;
_delay_ms(500);
}

PORTC=0xFF;
_delay_ms(500);
}
}

Kod poprawiłem oczywiście głupi błąd.


Cytuj:
W kolejnych pętlach nic się nie dzieje, bo wartość dla zmienna cały czas jest równa 1.

No właśnie mi to nie pasuje. 1*2 mamy =2 ciągle. A tam się zmienia 1,2,4, ..., 128.



Ostatnio edytowano 16 gru 2015, o 22:34 przez elektronikq, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 gru 2015, o 22:32 
Offline
Moderator
Avatar użytkownika

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

elektronikq napisał(a):
Kod poprawiłem oczywiście głupi błąd

zaraz tam głupi - każdemu się zdarza , no ale nie poprawiłeś wszystkich błędów, więc kolejna bliższa podpowiedź, w tym zapisie masz też błąd:

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: 16 gru 2015, o 22:42 
Offline
Użytkownik

Dołączył(a): 02 maja 2015
Posty: 100
Lokalizacja: Malbork
Pomógł: 12

Zapis i+ zwiększa zmienną i o 1. W warunku funkcji masz wartość początkową licznika 0 "i=0" . Sprawdzasz warunek " i<8" i do 0 dodajesz 1 "i+1" Za każdym razem to samo... Pętla nieskończona... Powinieneś użyć postinkrementacji... czyli zmienna++ lub zmieniać wartość licznika wewnątrz pętli for...


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 gru 2015, o 22:43 
Offline
Użytkownik

Dołączył(a): 01 lis 2015
Posty: 129
Pomógł: 0

Kod:
#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
DDRC = 0xFF;
PORTC = 0xFF;
while(1)
{
uint8_t i, zmienna=1;
for( i=0; i<8; i=i+1) //pasowałby znaczek i++?
{
PORTC= ~zmienna;
zmienna=zmienna*2;
_delay_ms(500);
}

PORTC=0xFF;
_delay_ms(500);
}
}


Czy teraz jest ok?

Cytuj:
Zapis i+ zwiększa zmienną i o 1. W warunku funkcji masz wartość początkową licznika 0 "i=0" . Sprawdzasz warunek " i<8" i do 0 dodajesz 1 "i+1" Za każdym razem to samo... Pętla nieskończona... Powinieneś użyć postinkrementacji... czyli zmienna++ lub zmieniać wartość licznika wewnątrz pętli for...

To ja rozumiem ale nie bardzo co się dzieje ze zmienną zmienna dlaczego w niej 2, 4, 8 etc. Ja to rozumię jak napisałem w 1 poście ale znowu kolega napisał wyżej że tam zawsze 1 jest. Natomiast z bluebooka tak zrozumiałem.



Ostatnio edytowano 16 gru 2015, o 22:47 przez elektronikq, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 gru 2015, o 22:44 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 17 sie 2013
Posty: 3797
Lokalizacja: Grudziądz
Pomógł: 143

i+1 to blad

i++ lub i=i+1 jest prawidlowe

Namazane ze smarta.

_________________
Usługi druku przestrzennego - www.drumik.pl



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 gru 2015, o 22:47 
Offline
Moderator
Avatar użytkownika

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

elektronikq napisał(a):
Czy teraz jest ok?


teraz jest OK

ale uwaga - proszę zacznij używać wstawiania kodu w znaczniki wg tej instrukcji: topic7402.html


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: 16 gru 2015, o 22:50 
Offline
Użytkownik

Dołączył(a): 01 lis 2015
Posty: 129
Pomógł: 0

Przepraszam to mój 1 post od następnego będę się stosował to udzielonej wskazówki. A co mojego problemu?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 gru 2015, o 22:56 
Offline
Moderator
Avatar użytkownika

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

Na początku zapytałeś czy dobrze to zrozumiałeś ? ... no to o ile ja zrozumiałem twój opis to chyba dobrze - bo zmienna będzie przyjmowała wartości

2,4,8,16..... itd

więc jak sam chyba widzisz dobrze zrozumiałeś ;) ... mnożenie x2 robi po prostu przesuwanie się bitu (tej jedynki) w lewo

_________________
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: 16 gru 2015, o 22:57 
Offline
Użytkownik

Dołączył(a): 02 maja 2015
Posty: 100
Lokalizacja: Malbork
Pomógł: 12

W pierwszy twoim wpisie był błąd w kodzie. Teraz oczywiście wartość zmiennej będzie się zwiększać.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 gru 2015, o 23:01 
Offline
Użytkownik

Dołączył(a): 27 lis 2015
Posty: 36
Zbananowany użytkownik

Pomógł: 5

W przypadku możliwego użycia preinkrementacji ( ++i ) lub postinkrementacji ( i++ ), powinno się preferować preinkrementację ( ++i ). Zawsze. Tym bardziej że w pętli for. JEST TO OBOJĘTNE czy będzie pre czy post w zmiennej indeksu na 3 pozycji po ;

Powód bardzo prosty. Kompilator nie będzie miał nawet okazji sprawdzać czy warto optymalizować dostęp do zmiennej indeksu i czy jest konieczność pozostawiania jej starej wartości. Zawsze zrobi to dobrze.
Jak zapiszesz i++ w pętli for, to mniej rozgarnięte kompilatory zajmą rejestr na starą wartość i (bo przecież trzeba zachować aby zwrócić i dopiero inkrementować).

Z dekrementacjami jest tak samo.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 gru 2015, o 23:04 
Offline
Użytkownik

Dołączył(a): 01 lis 2015
Posty: 129
Pomógł: 0

mirekk36 napisał(a):
Na początku zapytałeś czy dobrze to zrozumiałeś ? ... no to o ile ja zrozumiałem twój opis to chyba dobrze - bo zmienna będzie przyjmowała wartości

2,4,8,16..... itd

więc jak sam chyba widzisz dobrze zrozumiałeś ;) ... mnożenie x2 robi po prostu przesuwanie się bitu (tej jedynki) w lewo



Ja zawsze po kolei "lecę" i sprawdzam kod. I tutaj mnie myliła ta zmienna=1 na początku pętli. Ale w bluebooku przy operatorze przypisania (=) było napisane na temat jak mamy a=x to a ma wartość x ale x ma wartość a?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 gru 2015, o 23:12 
Offline
Użytkownik

Dołączył(a): 02 maja 2015
Posty: 100
Lokalizacja: Malbork
Pomógł: 12

Zmiennej przypisujesz podaną wartość... znak przypisania to nie to samo co znak równość (==). Jak by na to nie patrzył to podczas przypisania a osiągnie wartość x no i będą miały taką samą wartość. Ale działa to tylko w jedną stronę... czyli zmiennej a przypisujesz wartość x.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 gru 2015, o 23:20 
Offline
Użytkownik

Dołączył(a): 01 lis 2015
Posty: 129
Pomógł: 0

Pierwszy przebieg pętli mamy zmienna =zmienna * 2 czyli 1 * 2 i mamy w zmienna zapisaną dwójkę. Ale potem pętla się zaczyna od początku i tam zmienna=1 jak to się godzi?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 gru 2015, o 23:27 
Offline
Użytkownik

Dołączył(a): 02 maja 2015
Posty: 100
Lokalizacja: Malbork
Pomógł: 12

Pętla for pobiera wartość zmiennej, która jest zainicjalizowana przed pętlą czyli wartość 1. Tworzy sobie kopie tej zmiennej i na niej cały czas pracuje. Wewnątrz pętli wartość będzie zwiększana. Natomiast jak już skończy swój cykl pracy i program wyjdzie z pętli to wartość zmiennej będzie nadal 1. Zmieniana jest wartość tylko jej kopi w funkcji for. Poza nią wartość będzie widziana tak jak jest zainicjalizowana przed funkcją.
W niebieskiej książce jest wszystko bardzo ładnie wytłumaczone.


Autor postu otrzymał pochwałę


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

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 3 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