worner napisał(a):
W skrócie mówiąc, zadaniem programiku tam zawartego jest przesunięcie bitowe o 5 pozycji w lewo, co powinno zapalić diodę podłączoną do pinu 5 PORTU B. Tymczasem, ja przepisałem ten programik, skompilowałem go i zaprogramowałem mikrokontroler. I program działa odwrotnie, tzn. wygaszona jest dioda, która powinna być zapalona, natomiast pozostałe diody święcą. Ale nie to w tym jest najważniejsze.
W sumie to ważne, bo na starcie z językiem C i przesunięciami warto to zrozumieć do samego koniuszka
.... dlaczego tak się dzieje, że u ciebie ta dioda gaśnie zamiast się zapalić ? Sprawa jest prosta - zauważ, że założenie funkcji do zapalania diody - wystawiamy przecież stan WYSOKI na dany bit, sugeruje od razu, że chodzi o diody LED podłączone anodą do pinów portu natomiast katodą do GND prawda ? Tylko wtedy mogą się one zapalić
.... tymczasem kolega może nie spojrzał na schemat modułu diod LED w zestawie ATB (a zawsze można sprawdzić to tutaj:
http://atnel.pl/atb_sch/schematy_atb.htm ) Ze schematu jasno wynika, że w zestawie diody LED są podłączone odwrotnie czyli anodą do VCC natomiast to ich katody podłączamy do pinów portu, zatem wystawienie jedynki na PB5 nie spowoduje jej zapalenia tylko zgaszenie. I tak ma być. Aby dioda się zapaliła należałoby w tej funkcji z książki dokonać negacji tuż przed wysłaniem wartości na PORTB np tak:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Po tym zabiegu (dodana
TYLDA w instrukcji return) funkcja wystawi stan NISKI na pin PB5 i dioda w zestawie ATB się zapali
worner napisał(a):
Od początku mi nie grało, że cała operacja ma dotyczyć pinu 5, a nie 6 portu B. Bo jeśli dokonujemy przesunięcia bitowego o 5 bitów w lewo, to jedynka logiczna znajdzie się na pozycji bitu 6 prawda? I wtedy wartość dziesiętnie całego bajtu wyniesie 32, bo jeśli jedynka znalazłaby się na pozycji bitu 5, to dziesiętnie otrzymalibyśmy liczbę 16, a nie 32 prawda? Czy ja coś źle zrozumiałem?
Czy może to ktoś zweryfikować i ewentualnie wyprowadzić mnie z błędu?
Już wyprowadzam z błędu
Bo kolega pisze, że operacja (1<<PB5) zapali nie 5-ty a 6-bit ? A skąd takie przypuszczenie ? No chyba , że kolega numeruje sobie w głowie bity - czy przypadkiem nie od 1 do 8 ????? bo ja sobie w głowie numeruję bity od 0 do 7 .... i wg takiej (prawidłowej zresztą numeracji) to w wyniku (1<<PB5) zostanie oczywiście zapalony bit nr.5 a nie bit nr.6. Dlatego proponuję jak najszybciej zapomnieć o numeracji bitów od 1 do 8 bo kolega będzie miał ciągle z tym problemy. I oczywiście w książce na stronie 108 odnoszę się do pinu PB5 a nie do numerku nóżki układu scalonego.
Czy teraz troszkę się rozjaśniło ?
_________________
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 ]