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



Teraz jest 29 mar 2024, o 10:24


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 15 ] 
Autor Wiadomość
PostNapisane: 17 lis 2012, o 21:44 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 14 wrz 2012
Posty: 24
Pomógł: 0

Witam wszytskich, postanowiłem założyć taki wątek po indywidualnych skypowych oraz czatowych rozmowach gdyż okazało się że osoby zaczynające swoja przygodę z mikrokontrolerami mogą mieć problemy podobne do moich, a jednocześnie trywialne i może nie warto zaśmiecać nimi forum. Chodzi o to ,że jeśli coś nie działa to zwykle przyczyną może być niezrozumienie elementarnych rzeczy. Inna rzeczą jest o czymś czytać i nawet to rozumieć, a inną jest to coś zastosować w kodzie, albo skojarzyć albo odgadnąć dlaczego tak się to robi, a nie inaczej. Mam nadzieje że znajdą się chętni, którzy w kilku słowach rozjaśnią te trywialne problemy, które się tu mogą pojawić.
Po tym przydługim wstępie przedstawiam coś czego do końca nie rozumiem, i co mi nie daje spokoju, chociaż nie przeszkadza Iść do przodu:

Chodzi o inicjalizację USART-a czyli przykład 07 z niebieskiej książki:
W pliku mkuart.h mamy powołana funkcje publiczną:
void USART_Init( uint16_t baud );
natomiast w pliku main.c przy inicjlizacji USARTA następuje podmiana uint16_tbaud na __UBRR ,która to wielkość została zdefiniowana a nawet wyliczonaw pliku mkuart.h
Ustaliłem,że ma tu miejsce tzw przekazywanie argumentu (prawdopodobnie ) przez wartość.
Pytanie moje jest takie po co ta figura? co nam daje? czy przed czymś chroni, czy coś zabezpiecza? i czy nie można by tego załatwić inaczej? jak rozumiem nie jest to jedyny sposób przesyłania argumentów do funkcji.

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 lis 2012, o 22:33 
Offline
Moderator
Avatar użytkownika

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

Zgred napisał(a):
Pytanie moje jest takie po co ta figura? co nam daje? czy przed czymś chroni, czy coś zabezpiecza? i czy nie można by tego załatwić inaczej? jak rozumiem nie jest to jedyny sposób przesyłania argumentów do funkcji.


Tzn wybacz, mi jeśli źle zrozumiałem pytanie i nie odpowiem ściśle na temat, ale w razie czego dopytaj jeszcze ok? Ja powiem szczerze, że bardzo się cieszę, że takie pytania padają. Kurczę a wiem przecież jak wiele osób hmmm "obawia" się je zadawać na forum - nie wiem czemu - ja bym od razu pytał - tak jak ty tutaj ;)

otóż mamy sobie funkcję

USART_Init( uint16_t baud );

w zasadzie, jeśli używamy TYLKO jednej prędkości RS232 w projekcie to można się zgodzić, że zupełnie bezużyteczne jest w ogóle pisanie funkcji z argumentem. No bo po co on ? skoro i tak wyliczamy go jako stałą w pliku *.h jak słusznie zauważyłeś. Toż można by ją napisać tak:

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


prawda ? proszę bardzo argument zniknął i __UBRR wykorzystaliśmy w środku. I oczywiście tak można spokojnie pisać. Ale ja hmmm zwykle piszę tak jak pokazałem to w książce z uwagi na fakt, że czasem choć rzadko potrzebuję w trakcie programu (w trakcie jego działania) dynamicznie (w locie) zmienić prędkość RS232...... Więc jak mam tego dokonać mają taką funkcję jak wyżej hmmm?

i dlatego piszę ją w takiej postaci żebym mógł w razie czego jednak w locie zmienić sobie tę prędkość wygodnie, bo np utworzę sobie kilka takich definicji:

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


a później w kodzie programu w jego różnych miejscach, gdy nagle potrzebuję zmienić prędkość na jedną z tych, które sobie zdefiniowałem to wpisuję:

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


albo:

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


bo tak jest mi wygodniej i bardziej czytelnie w kodzie dla oka, za każdym razem mogę sobie łatwo wywołać inicjalizację UART'a z inną prędkością. Widzę bowiem w kodzie nazwę funkcji init więc wiem że inicjalizuję UART i na dodatek ładnie widzę argument związany z jedną z predefiniowanych prędkości. Ale przecież nic nie stoi na przeszkodzie aby ją wywołał np z argumentem obliczonym w locie albo odebranym przez UART z jakiegoś innego programu na PC czy innego urządzenia

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


reasumując - nie ma to nic wspólnego z jakimś zabezpieczaniem (a pytasz o to), pewnie, że jest tysiąc różnych sposobów na przekazanie takiego argumentu co pokazałem wyżej (można nawet bez argumentu). Zastanawiasz się też czy jest to jedyny sposób przesyłania argumentów do funkcji - no pewnie, że nie - ale nie za bardzo rozumiem czego dotyczy to pytanie, bo przecież można to przekazać nawet przez wskaźnik ;) tylko po co w tak prostym przypadku - jednak może się zdarzyć, że np będziesz pobierał wartości argumentów z jakiejś tablicy - wtedy można przez wskaźnik ;)

czy te wyjaśnienia chociaż troszkę pomogły ? jeśli nie to dręcz mnie dalej ...

_________________
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: 17 lis 2012, o 22:51 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 14 wrz 2012
Posty: 24
Pomógł: 0

Jak dla mnie to wszystko jasne, właśnie dlatego,ze nie mogłem tego zrozumieć, zacząłem kombinować z kodem i wpisywać wartości __UBRR bezpośrednio do funkcji, już w pliku main. Zadziałało więc ta poprzednia operacja tym bardziej stała się niezrozumiała, stąd moje pytanie, poza tym Sun mi podpowiedział ,ze to przekazanie argumentu(nie skojarzyłem). Tak jak pisałem, nawet jeśli teoria jest ładnie opisana (tutaj szczerze mówiąc musiałem się posiłkować książką Grębosza), to już szczególnie początkujący może mieć problem z jej praktycznym zastosowaniem.Ale wielkie dzięki za to wyjaśnienie, teraz przynajmniej patrze ze świadomością na tę funkcje, która zresztą jest niemal identyczna w nocie Atmegi. Właśnie przy okazji, to chciałem sobie napisać kod który pozwoli mikroswitchom zmieniać prędkośc, a le SUn mi napisał że ta zmiana prędkości wymaga resetu, więc musiałbym taka zmianę zapisać w pamięci, która się nie wykasuje. I tu oczywiście na razie mam problem, bo nawet nie wiem czy mogę mieć do takiej pamięci dostęp, ale to osobny temat:)))

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 lis 2012, o 23:27 
Offline
Moderator
Avatar użytkownika

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

Zgred napisał(a):
Właśnie przy okazji, to chciałem sobie napisać kod który pozwoli mikroswitchom zmieniać prędkośc, a le SUn mi napisał że ta zmiana prędkości wymaga resetu,


Tutaj się z kolegą Sunem nie zgodzę, a może tak jest w innych prockach np PIC'ach czy jeszcze innych - tego nie wiem, może się Sun pomylił niechcący. Ale na 100% w AVR'ach nie trzeba resetować procka żeby zmienić prędkość "w locie". Proszę bardzo na szybko na kolanie skleciłem kawałek kodu i możesz także sam sobie sprawdzić, że to zadziała bez resetu procka:

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


oczywiście pierwszy __UBRR jest w pliku *.h standardowo i tam ma go ustawionego na 115200 co widać zresztą z kodu programu. Każdy może sobie to zrobić i sprawdzić.

tzn odpalasz sobie np terminal na 9600 i czekasz - i co jakiś czas wpadnie ci PTASZEK gdy procek będzie nadawał na 115200, ale gdy przełączy się na 9600 to wpadnie stosowny napis jak w kodzie.

I vice versa - gdy odpalisz terminal na 115200

_________________
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: 18 lis 2012, o 07:02 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 14 wrz 2012
Posty: 24
Pomógł: 0

Bardzo dziękuję Myślę,że temat Inicjalizacji USARTA (jak dla mnie) został wyjaśniony.Czekam na pojawienie się kolejnych problemów. Zachęcam wszystkich którym cokolwiek nie działa lub czegoś nie rozumieją do kontynuowania tego wątku. Jak widać odpowiedzi - rozwiązania problemów można się spodziewać nawet w sobotnią noc:))). Panie Mirku jeszcze raz serdecznie dziękuję.

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 18 lis 2012, o 11:03 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 paź 2011
Posty: 8583
Pomógł: 337

hmmm.... Na PIC Mirku nawet nie trzeba ustawiać jest automat nasłuchujący na 55h który
umożliwia automatyczne dostosowanie baudrate do urządzenia nadającego.
ale chyba faktycznie się machnąłem z czymś... na avr nigdy tego nie potrzebowałem
ostatni raz cos takiego robiłem na 51' i to atmelowskich no i chyba dlatego stwierdziłem ze na AVR
będzie tak samo ...

Za omyłkę przepraszam...

_________________
[b]San Escobar! Patria mia! Tu eres como la salud.[/b]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 18 lis 2012, o 11:55 
Offline
Moderator
Avatar użytkownika

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

SunRiver napisał(a):
hmmm.... Na PIC Mirku nawet nie trzeba ustawiać jest automat nasłuchujący na 55h który
umożliwia automatyczne dostosowanie baudrate do urządzenia nadającego.

Tak z ciekawości zapytam - w każdym PIC'ku ? ... bo że tak powiem "o żesz w mordkę" ale fajny ten automat ;) Więc weź mi tu takich niusów nie opowiadaj bo jeszcze zacznę miziać PIC'ki ;) (i to mi się podoba w takich dyskusjach kulturalnych - bo człowiek przy okazji dowie się nowych rzeczy i przy okazji wszyscy skorzystają)

SunRiver napisał(a):
ale chyba faktycznie się machnąłem z czymś... na avr nigdy tego nie potrzebowałem
ostatni raz cos takiego robiłem na 51' i to atmelowskich no i chyba dlatego stwierdziłem ze na AVR
będzie tak samo ...

Za omyłkę przepraszam...


Oj tam oj tam - nie ma za co przepraszać. Przyznam szczerze, że mi wydawało się wcześniej, że nie trzeba resetować, ale po tym poście kolegi Zgred aż sam na kolanie napisałem kawałek kodu i go przetestowałem żeby się upewnić, zanim odpisałem i sprostowałem posta ;) .... Człowiek nie musi wszystkiego zapamiętać. A jeszcze taki omnibus procesorowy jak ty .... toż to żadna ujma. Ja na razie tylko AVR'ki tnę a też wielu rzeczy nie przypominam sobie tak w lot - muszę zaglądać tu i tam.

_________________
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: 18 lis 2012, o 12:15 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 paź 2011
Posty: 8583
Pomógł: 337

w każdym większym bo wiadomo mikrusy odpadają z racji małych zasobów , podobnie maja MSP z texasa , bardzo przydatne czasami jak nie znamy
szybkości transmisji na uarcie.

Obrazek

Warto też wspomnieć że większość PIC ma zaimplementowane w module UART sprzętowe
wsparcie dla IRDA i LIN ...


Tak, ale mimo wszystko powinienem pamiętać i sprawdzić --- jak widać niestety pamieć mam dobrą ale krótka --> całe 4KB (jak Tiny :))
Dlatego mimo wszystko wypada przeprosić ....

_________________
[b]San Escobar! Patria mia! Tu eres como la salud.[/b]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 18 lis 2012, o 13:03 
Offline
Moderator
Avatar użytkownika

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

Sun przestań ;)

a ta opcja Auto-Baud Support .... baaaardzo mi się podoba, żaden AVR'ek jej nie ma niestety :( a czasem właśnie przydałoby się. Owszem można to zrobić programowo - ale hmmm dobrze też że w niektórych prockach producent wspomaga to sprzętowo - nawet nie wiedziałem ;) ... więc dzięki za info. Sam widzisz - jak pożyteczna była ta pomyłka.

_________________
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: 18 lis 2012, o 13:31 

Pomógł: 0

Sam bym chciał wiedzieć do czego się to może przydać?, taka zmiana w locie prędkości?, rozumiem, możliwość zmiany w opcjach programu tj, gdzieś tam mamy jakieś menu serwisowe i tam zmieniamy, ale po co w locie?



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 18 lis 2012, o 13:39 
Offline
Moderator
Avatar użytkownika

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

rezasurmar napisał(a):
Sam bym chciał wiedzieć do czego się to może przydać?, taka zmiana w locie prędkości?, rozumiem, możliwość zmiany w opcjach programu tj, gdzieś tam mamy jakieś menu serwisowe i tam zmieniamy, ale po co w locie?


No bardziej mam tu na myśli właśnie auto-dopasowywanie się do nadawcy ;) ... czyli wykrywania prędkości i dostosowywania się do niej.

_________________
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: 18 lis 2012, o 16:47 

Pomógł: 0

GwynBleidD napisał(a):
No mnie się przydało np w prostym projekcie terminala RS232. Czasem zachodzi potrzeba podsłuchania co się dzieje na terminalu w urządzeniu, gdzie trudno się dostać z komputerem, więc stworzyłem sobie taki mini snifferek RS232: wyświetlacz KS0108 + M8 i wszystko się ładnie wyświetla :) Przydałaby się możliwość nadawania, ale nie dorwałem do tej pory jakiejś ciekawej klawiaturki małej pod to...


W kasach fiskalnych są fajne klawiatury, czasem można dorwać jakąś uszkodzoną. Ewentualnie zastosuj zbliżeniową na kontrolerach atmela, wytrawisz sobie jaką chcesz klawiaturę.

PS. Motyw z wykrywaniem prędkości super ;). Bez specjalnego konfigurowania łatwo wykryć jaką prędkość mamy na terminalu :).



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 18 lis 2012, o 17:09 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 paź 2011
Posty: 8583
Pomógł: 337

Gwyn możesz sobie zrobić ekranową w hmm.,...avt mają macaki do 128x64

_________________
[b]San Escobar! Patria mia! Tu eres como la salud.[/b]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 lis 2012, o 10:41 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 lis 2011
Posty: 582
Lokalizacja: okolice Wrocławia :)
Pomógł: 24

mirekk36 napisał(a):
Zgred napisał(a):
Właśnie przy okazji, to chciałem sobie napisać kod który pozwoli mikroswitchom zmieniać prędkośc, a le SUn mi napisał że ta zmiana prędkości wymaga resetu,


Tutaj się z kolegą Sunem nie zgodzę, a może tak jest w innych prockach np PIC'ach czy jeszcze innych - tego nie wiem, może się Sun pomylił niechcący. Ale na 100% w AVR'ach nie trzeba resetować procka żeby zmienić prędkość "w locie". Proszę bardzo na szybko na kolanie skleciłem kawałek kodu i możesz także sam sobie sprawdzić, że to zadziała bez resetu procka:

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


oczywiście pierwszy __UBRR jest w pliku *.h standardowo i tam ma go ustawionego na 115200 co widać zresztą z kodu programu. Każdy może sobie to zrobić i sprawdzić.

tzn odpalasz sobie np terminal na 9600 i czekasz - i co jakiś czas wpadnie ci PTASZEK gdy procek będzie nadawał na 115200, ale gdy przełączy się na 9600 to wpadnie stosowny napis jak w kodzie.

I vice versa - gdy odpalisz terminal na 115200


A czy nie można zrobić tego bardziej przejrzyście?
Zamiast pamiętać że UBRR1 to 115200bps a UBRR to 9600bps, może prościej napisać funkcję tak by przekazywać jej zadaną prędkość i tyle?

Myślę że wiele osób nie miałoby wtedy wątpliwości gdyby inicjalizacja wyglądała tak:

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


Oczywiście tak sobie 'gdybam' bo ja nadal z uporem maniaka piszę w asemblerze ;)

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 lis 2012, o 11:34 
Offline
Moderator
Avatar użytkownika

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

Sonix napisał(a):
A czy nie można zrobić tego bardziej przejrzyście?
Zamiast pamiętać że UBRR1 to 115200bps a UBRR to 9600bps, może prościej napisać funkcję tak by przekazywać jej zadaną prędkość i tyle?

Myślę że wiele osób nie miałoby wtedy wątpliwości gdyby inicjalizacja wyglądała tak:

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


Oczywiście tak sobie 'gdybam' bo ja nadal z uporem maniaka piszę w asemblerze ;)


Ależ można, jak ktoś się uprze ;) tyle że wtedy trzeba te obliczenia:

F_CPU/16/UART_BAUD1-1

zrobić w kodzie programu wewnątrz tej funkcji, a to zabierze troszkę pamięci FLASH ;) ... choć z drugiej strony to przecież nie jest wielki problem. Ale ogólnie mówiąc - najczęściej stosuje się jedną prędkość, oszczędność każdy ma zakodowaną podświadomie - stąd częste rozwiązanie tego typu, że obliczenia te zlecamy do wykonania preprocesorowi a do funkcji idzie argument w postaci stałej __UBRR.

_________________
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  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 15 ] 

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