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



Teraz jest 6 kwi 2026, o 20:50


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 13 ] 
Autor Wiadomość
PostNapisane: 7 maja 2014, o 23:01 
Offline
Użytkownik

Dołączył(a): 24 mar 2014
Posty: 46
Pomógł: 0

konkretnie ze strony 189 bluebooka:

#define key_down !(PINC & KEY_PIN) czyli jeżeli key_pin to (1<<PC6) a pinc to 00000000 to znaczy że:

Key_down !( 00000000 & 00000110) i teraz z nawiasu wychodzi !(0) więc wartość logiczna jest 1??

nie rozumiem tego. skąd mam wiedzieć czy pinc to są same zera czy jedynki?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 maja 2014, o 23:14 
Offline
Moderator
Avatar użytkownika

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

no troszkę podstaw to musisz poczytać

http://mirekk36.blogspot.com/2012/01/av ... stawy.html

skąd masz wiedzieć co jest w PINC ? .... to co podajesz na WEJŚCIA procka na porcie C, jeśli jedynki to masz jedynki a jeśli zera to zera

_________________
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: 7 maja 2014, o 23:17 
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

PC6 to 6, a 1<<6 to 0b00000001<<6 (przesuwamy w lewo) = 0b01000000
& służy by sprawdzić tylko bit numer 6 w rejestrze wejściowym PINC (PINC.6)
PINC to stan wejść i jak do pinu 6 portu C podepniesz przycisk (podciąganie do plusa musi być włączone lub zewnętrzny rezystor) to jak jest puszczony to w rejestrze masz 0bx1xxxxxx, a gdy wciśnięty 0bx0xxxxxx, gdzie x to wartość dowolna i po wykonaniu iloczynu bitowego z 0b01000000 masz dla puszczonego 0b01000000 i 0b00000000 dla wciśniętego. Liczba różna od zera to prawda, a równa zero to fałsz i po negacji logicznej (!) prawda zamienia się na fałsz i na odwrót. Dlatego dla wciśniętego przycisku masz kolejno PINC=0bx0xxxxxx potem 0bx0xxxxxx & 0b01000000 = 0b00000000 co jest fałszem a po zanegowaniu prawdą i wynik ostateczny w odpowiedzi na pytanie warunku: Czy to prawda, że przycisk jest wciśnięty? ----> Tak to prawda... i można wykonywać to co jest w kamerkach po if(key_down)

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 maja 2014, o 08:35 
Offline
Użytkownik

Dołączył(a): 24 mar 2014
Posty: 46
Pomógł: 0

Dzięki trochę rozumiem ale tylko trochę ;p
Czy dobrze to rozumiem?


1 #define LED_PIN (1<<PC7)
2 #define LED_ON PORTC &= ~LED_PIN
3 #define LED_OFF PORTC |= LED_PIN
4 #define LED_TOG PORTC ^= LED_PIN

int main(void)
{
DDRC |= LED_PIN;
while(1)
{
LED_ON;
_delay_ms(1000);
LED_OFF;
_delay_ms(1000);}
******************************
1 LED_PIN to (0b1000000)
2 LED_ON = 0b00000000 & ~0b1xxxxxxx
LED_ON = ~0b0xxxxxxx
LED_ON = 0b1xxxxxxx
czyli mamy 1 a więc prawdę, dioda się zapala
i odlicza się czas 1 s.

3 Rozumiem że tu podstawiam teraz pod LED_OFF 0b10000000 bo dioda już świeci więc na PORTC jest 1?
więc LED_OFF = 0b1xxxxxxx | 0b1xxxxxxx
LED_OFF = 0b1 czyli prawda?

coś tu źle rozumiem bo w jaki sposób LED_OFF gasi diodę?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 maja 2014, o 09:07 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 24 lut 2013
Posty: 94
Lokalizacja: Turek
Pomógł: 5

A moze tak to sobie przeanalizuj

1 LED_PIN to (0b1000000)
2 LED_ON = 0b00000000 & ~(0b1xxxxxxx)
LED_ON = 0b0xxxxxxx
LED_ON = 0b0xxxxxxx
czyli mamy 0 a więc falsz

Sory ale z telefonu na szybko napisalem.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 maja 2014, o 09:24 
Offline
Użytkownik

Dołączył(a): 24 mar 2014
Posty: 46
Pomógł: 0

no tak kolejność działań, ale w jaki sposób LED_ON włącza diodę jeśli jest fałsz



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 maja 2014, o 09:29 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 24 lut 2013
Posty: 94
Lokalizacja: Turek
Pomógł: 5

Zelezy jak diode podlaczysz do pinu na stronie co Mirek ci podal masz tam dwa przyklady jak sterujsz dioda stanem niskim i wysokim.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 maja 2014, o 09:30 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 10 sty 2014
Posty: 448
Lokalizacja: DKL
Pomógł: 53

@ifrook, zobacz to http://mirekk36.blogspot.com/2012/01/av ... stawy.html jest to uzupełnienie wiedzy z niebieskiej książki w tym zakresie, powinno Ci się sporo wyjaśnić :)

_________________
Migracja z punktu B do punktu C
Pozdrawiam



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 maja 2014, o 11:44 
Offline
Użytkownik

Dołączył(a): 24 mar 2014
Posty: 46
Pomógł: 0

hej:) trucia ciąg dalszy :p
1.
DDRD |= (1<<PD2) // To jest dla mnie jasne

PORTD &= ~(1<<PD2) // To jest mniej jasne. Czemu musi być tu negacja jeśli portd 0b00000000 & 0b00000100 daja fałasz czyli ustawiają stan niski ? Jeśli dodam negacje to portd 0b00000000 & 0b11111011 to też da fałsz ?

2.ustawianie pinów/portów jako wejścia
DDRD &= ~(1<<PD2)
PORTD |= (1<<PD2)

if( !(PIND & (1<<PD2)) ) LED_ON
else LED_OFF
// if/else rozumiem. Natomiast jak działa kod zaznaczony na czerwono. !( 0b00000000 & 0b00000100) mógłby ktoś mi to wyjaśnić proszę:)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 maja 2014, o 11:53 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 lut 2013
Posty: 376
Lokalizacja: Kłopoty-Stanisławy
Pomógł: 33

MASKOWANIE BITÓW ....
Jeśli na PINie D — pin PD2 - uC pojawi się STAN NISKI - załącz diodę.

Niestety aby dokumentnie to zrozumieć potrzebne jest kilka rzeczy ...
1. BB, Mirek całkiem całkiem opisuje maskowanie.
2. https://www.youtube.com/watch?v=zittec1MM5w - bardzo interesujący filmik przesłaniający bity
3. http://pl.wikipedia.org/wiki/Maska_bitowa – to po przeczytaniu razy +/- 20 też nieco rozjaśnia w głowie
4. ćwiczenie (nawet na papierze) maskowania bitów ... i rozrysowanie po swojemu i powieszenie na ścianie ... ( to działa .. :) )


Autor postu otrzymał pochwałę

_________________
50 znaków Atnela ....



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 maja 2014, o 15:28 
Offline
Moderator
Avatar użytkownika

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

ifrook napisał(a):
// if/else rozumiem. Natomiast jak działa kod zaznaczony na czerwono. !(


a masz to rozpisane krok po kroku w bluebooku - z rozpisaniem na POJEDYNCZE BITY .... tylko może nie do końca chce ci się to poczytać ? popatrzeć na rysunki bo też tam są ...

_________________
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: 10 maja 2014, o 12:01 
Offline
Użytkownik

Dołączył(a): 24 mar 2014
Posty: 46
Pomógł: 0

matw napisał(a):
@ifrook, zobacz to http://mirekk36.blogspot.com/2012/01/av ... stawy.html jest to uzupełnienie wiedzy z niebieskiej książki w tym zakresie, powinno Ci się sporo wyjaśnić :)



Czemu sterując masą muszę użyć iloczynu a nie sumy logicznej? wiem czym one się różnią ale z czego to wynika



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

Dołączył(a): 19 paź 2012
Posty: 79
Zbananowany użytkownik

Pomógł: 1

ifrook napisał(a):
matw napisał(a):
@ifrook, zobacz to http://mirekk36.blogspot.com/2012/01/av ... stawy.html jest to uzupełnienie wiedzy z niebieskiej książki w tym zakresie, powinno Ci się sporo wyjaśnić :)



Czemu sterując masą muszę użyć iloczynu a nie sumy logicznej? wiem czym one się różnią ale z czego to wynika


Wynika to ze sposobu w jaki sterujesz. Mirek to ladnie wyjasnil zarowno w BB jak i na blogu.
1) jesli dioda jest podciagnieta przez rezystor do masy - to aby ja zapalic na porcie musi byc stan wysoki, jak jest niski to nie swieci.
2) jesli dioda jest podciagnieta przez rezystor do VCC - to aby ja zapalic na porcie musi byc stan niski, jak jest wysoki dioda nie swieci.

Jesli mowiac "sterujac masa" masz na mysli sytuacje nr 2 - to aby dioda swiecila musi byc zero - a zeby ustawic na konkretnym bicie zero trzeba uzyc operacji REJESTR &= !(maska)

Krotko mowiac - aby "zapalic" jedynke na odpowiedniej pozycji w bajcie wykorzystujemy odpowiednia maske i operacje OR czyli |
Aby zgasic - czyli ustawic zero na odpowiedniej pozycji w bajcie wykorzystujemy odpowiednia maske i operacje & (AND) i !(NOT)

Dlaczego tak ? Bo wynika to z tablicy prawd dla tych operacji. Idea jest taka aby maska tak dzialala aby zmienialy sie tylko te bity ktore chcemy zmienic. No i mamy miec mozliwosc ustawienia albo 0 albo 1 na tych bitach. No i dzieki dokladnie takim operacjom logicznym to osiagamy. Takim a nie innym :)

Tak jak koledzy powyzej polecam przesledzic tablice prawd dla OR, AND i NOT. Nastepnie rozpisac sobie bajt, rozpisac sobie jakas maske, przeprowadzic operacje logiczne i przesledzic w jaki sposob pozostale bity w bajcie sa przeslaniane i dlaczego zmiana (na 0 lub 1) nastepuje tylko i wylacznie na bicie(bitach) dla ktorego(rych) w masce mamy 1.

Przeczytaj jeszcze raz dokladnie bluebooka i http://mirekk36.blogspot.com/2012/01/av ... stawy.html



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

Strefa czasowa: UTC + 1


Kto przegląda forum

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