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



Teraz jest 5 gru 2024, o 01:09


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 7 ] 
Autor Wiadomość
PostNapisane: 30 gru 2014, o 11:13 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 paź 2013
Posty: 491
Lokalizacja: Siedlce
Pomógł: 9

Witam od razu do rzeczy. Na stronie 212 pisze Pan M.K. : "Tymczasem w kodzie obsługi przerwania mamy zapis ANODY_PORT = ~licznik; Z tego powodu mamy cztery starsze bity PA7 -PA4 są cały czas ustawione na jeden "
Moje pytanie brzmi skąd się tam wzięły te cztery starsze bity skoro pod słowem: "ANODY_PORT" kryje się na stronie 202:
"ANODY_PORT |= CA1 | CA2 | CA3 | CA4;" i dalej co za tym idzie na stronie 203 mamy zapis:
#define ANODY_PORT PORTA"
i poniżej
#define CA1 (1<<PA0)
#define CA2 (1<<PA1)
#define CA3 (1<<PA2)
#define CA4(1<< PA3)
a pinów od PA7 do PA4 jak nie widziałem tak nigdzie nie widzę... :(

I moje drugie pytanie może sam coś podejrzewam ale nie jestem pewien a muszę być pewny. 8-)
Na stronie 209 mamy zapisy segmentów ;np:
#define SEG_A(1<<0) itd itd.
itd
itd
moje pytanie brzmi skąd kompilator wie że chodzi o ten konkretny PORTC czyli czemu niema zapisu typu:
#define SEG_A(1<<PC0) wiem że obie opcje działają
ja podejrzewam że wystarczyło że daliśmy ten cały PORTC na stronie 203 jako wyjście na katody....ale może się mylę...
a jeśli mam rację to co jeśli zechcę sobie podłączyć zupełnie oddzielny nowy wyświetlacz z segmentami na zupełnie inny niezależny PORT skąd wtedy kompilator będzie wiedział o który mi chodzi ?

_________________
Ucz się ucz ,bo po to tutaj jesteś...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 gru 2014, o 11:40 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 13 maja 2013
Posty: 288
Ostrzeżenia: -2
Pomógł: 23

ANODY_PORT masz zdefiniowane jako PORTA czyli jesli w powyzszym zapisie np.
Licznik bedzie miał wartosc równa 2 to binarnie 0b00000010 czyli przypisujac to do PORTA =~(0b00000010);
~ operator negacji da nam zapis:
PORTA = 0b11111101;
Czyli wystawimy logiczne 1 na wszystkich pinach portu oprocz 2 gdzie mamy 0.

Drugie pytanie:
Takie podejscie umozliwia swobodna konfiguracje pinow.

Definiujemy sobie np.
#define SEG_A (1<<0) oznacza ze wszedzie gdzoe kompilator napotka zapis SEG_A podstawi (1<<0) i jesli mielusmy wczesniej zapis definiujac port wyj jako PORTC to w zapisie np:
PORTC | = SEG_A;
Spowoduje wystawienie 1 na pierwszym pinie portu C. Bo mamy 0 w naszym przesunieciu bitowym.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 gru 2014, o 12:08 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 paź 2013
Posty: 491
Lokalizacja: Siedlce
Pomógł: 9

Aha czyli z pierwszej odpowiedzi wynika że każde użycie #define jest tak jakby zupełnie ODDZIELNE i NIEZALEŻNE,a ja je ze sobą wszystkie tak jakby skleiłem :shock: i zrozumiałem to że ANODY PORT to to samo co 4 piny i wynika z tego że tak jakby jednej nazwie przyporządkowałem kilka innych nazw itd co było błędem w moim rozumowaniu i wszystko pogmatfałem :lol:

Ale jeśli chodzi o drugą odpowiedź to niema tam zapisu typu PORTC | = SEG_A
więc dalej nie bardzo wiem skąd on to wie no chyba że jakoś z tablicy ze strony 209

_________________
Ucz się ucz ,bo po to tutaj jesteś...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 gru 2014, o 13:11 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 13 maja 2013
Posty: 288
Ostrzeżenia: -2
Pomógł: 23

RadekB86 napisał(a):
Aha czyli z pierwszej odpowiedzi wynika że każde użycie #define jest tak jakby zupełnie ODDZIELNE i NIEZALEŻNE,a ja je ze sobą wszystkie tak jakby skleiłem :shock: i zrozumiałem to że ANODY PORT to to samo co 4 piny i wynika z tego że tak jakby jednej nazwie przyporządkowałem kilka innych nazw itd co było błędem w moim rozumowaniu i wszystko pogmatfałem :lol:

Ale jeśli chodzi o drugą odpowiedź to niema tam zapisu typu PORTC | = SEG_A
więc dalej nie bardzo wiem skąd on to wie no chyba że jakoś z tablicy ze strony 209

Ja tylko dalem taki przyklad zaraz zajrze do ksiazki:)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 gru 2014, o 14:59 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 13 maja 2013
Posty: 288
Ostrzeżenia: -2
Pomógł: 23

RadekB86 napisał(a):
#define SEG_A(1<<0) itd itd.

moje pytanie brzmi skąd kompilator wie że chodzi o ten konkretny PORTC czyli czemu niema zapisu typu:
#define SEG_A(1<<PC0 ) wiem że obie opcje działają


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

Czyli wszystkie InputOutput / wejścia Wyjscia procesora etc.

Np dla:
/* avr/iom32.h - definitions for ATmega32 */
gdzie są tam wszystkie definicje miedzy innymi:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


gdzie to szukać ano tu (ja ma zainstalowany atmel tolchain w program files na dysku C, o ile korzystarz z AtmelTolchain ):
Obrazek

Zatem kompilator wszedzie gdzie napotka np PC0 wstawi podczas kompilacji 0.
Jeśli uzywasz Eclipse to najdz myszką na PC0 podświetli Ci się makro i wcisnij F2 to ukaże Ci się owa cyfra 0 :)

RadekB86 napisał(a):
ja podejrzewam że wystarczyło że daliśmy ten cały PORTC na stronie 203 jako wyjście na katody....ale może się mylę...
a jeśli mam rację to co jeśli zechcę sobie podłączyć zupełnie oddzielny nowy wyświetlacz z segmentami na zupełnie inny niezależny PORT skąd wtedy kompilator będzie wiedział o który mi chodzi ?


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


gdzie: LED_DATA to nasz PORTC zdefiniowany na stronie 203.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
odczyt bajtu z pamięci Flash zdefiniowanego na stronie 209 (dokładniej na płytcie DVD w kodzie źródłowym).

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


i tu kompilator zamiast SEG_A wstawi (1<<0); i odpowiednio dla pozostałych segmentów.

Jeśli chcesz zmienić PORT z C np na D to zmieniasz go w jednym miejscu:

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


wówczas kompilator będzie wiedział, że chodzi Ci port D



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 gru 2014, o 15:19 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 paź 2013
Posty: 491
Lokalizacja: Siedlce
Pomógł: 9

Oczywiście że używam eclipsa 8-)
a do tego pliku "iom32.h" zdaje się że zaglądałem przy okazji omawiania przerwania ze strony 204
chyba że to inny plik ?

_________________
Ucz się ucz ,bo po to tutaj jesteś...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 gru 2014, o 15:28 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 13 maja 2013
Posty: 288
Ostrzeżenia: -2
Pomógł: 23

RadekB86 napisał(a):
Oczywiście że używam eclipsa 8-)
a do tego pliku "iom32.h" zdaje się że zaglądałem przy okazji omawiania przerwania ze strony 204
chyba że to inny plik ?


tak to ten sam plik z tym, że ten co ja podałem (Atmel tolchain )ma już aktualizacje nowe nazwy wektorów przerwań etc.



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

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