Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

Dodatkowy rs na 8051

Alfred
-
-
Posty: 19
Rejestracja: 22 lip 2004, o 11:25

Dodatkowy rs na 8051

Postautor: Alfred » 8 lis 2004, o 14:45

Witam :)

Potrzebuje drugiego rs'a w 8051. Czy ktos zna lub widzial metode implementacji? Bardziej iteresuje mnie sposob odbioru danych bo wysylanie to raczej prosta sprawa.

Pozdrawiam,
Alfred

Czajnik
-
-
Posty: 264
Rejestracja: 17 cze 2004, o 15:40
Lokalizacja: Kraków
Kontaktowanie:

Postautor: Czajnik » 8 lis 2004, o 15:46

Poczytaj help bascoma... ewentualnie edw... ktores tam z ostatniego pół roku... a tak pozatym nie lepiej w standardzie rs 485 wiele urzadzen na 1 lini.. pozrdo

Alfred
-
-
Posty: 19
Rejestracja: 22 lip 2004, o 11:25

Postautor: Alfred » 9 lis 2004, o 08:31

Czesc :)

Implementacji dodatkowego rs'a potrzebuje w asemblerze '51 - moze nie tyle gotowego kodu co sposobu realizacji.
A co do rs485... w moim przypadku to chyba jeszcze wiecej kombinacji niz z drugim rs232 :)

Pozdrawiam

Awatar użytkownika
gawel
-
-
Posty: 683
Rejestracja: 24 lis 2003, o 11:19
Lokalizacja: Białystok

Postautor: gawel » 10 lis 2004, o 01:00

W tej sytuacji to masz dwie możliwości rozwiązania:
1. użyć zewnętrznego UART, np układu 16C450
2. użyć programowo symulowanego UART'a.
Które rozwiązanie bardziej ci odpowiada?

Alfred
-
-
Posty: 19
Rejestracja: 22 lip 2004, o 11:25

Postautor: Alfred » 10 lis 2004, o 08:34

No czesc :)

Zdecydowanie wybieram te druga opcje: programowy UART.

Awatar użytkownika
gawel
-
-
Posty: 683
Rejestracja: 24 lis 2003, o 11:19
Lokalizacja: Białystok

Postautor: gawel » 10 lis 2004, o 10:46

A masz wolne wejście na INT0 lub INT1? Dobrze by było, aby odbierany sygnał wchodził na przerwanie.

Alfred
-
-
Posty: 19
Rejestracja: 22 lip 2004, o 11:25

Postautor: Alfred » 12 lis 2004, o 08:28

Witam :)

Chyba wiem do czego zmierzasz :)
Mam wolnego INT'a tylko ze za pomoca INT'a wykryje tylko ewentualna zmine sygnalu wysokiego na niski (czyli np. bit startu lub bity ustawione na 0). Chyba zeby zrobic w ten sposob, ze za pomoca INT'a wykrywac tylko bit startu a zglaszane przewania z pozostalych bitow pomijac. Przydaloby sie jeszcze jakies probkowanie sygnalu zeby stwierdzic wartosc bitu.
To jest jakies wyjscie.

Myslalem raczej o metodzie "ciaglego probkowania" :) to znaczy nie opierac sie na inforamcji z INT'a tylko '51 sprawdza caly czas, co pewien okres czasu, stan lini odbioru. I na podstawie tych informacji decyduje czy to bit startu, dane, itp.

Co o tym sadzisz?

Awatar użytkownika
gawel
-
-
Posty: 683
Rejestracja: 24 lis 2003, o 11:19
Lokalizacja: Białystok

Postautor: gawel » 12 lis 2004, o 09:58

Dokładnie o takim rozwiązaniu myślałem. Ponieważ gdyby wejścia przerwań były zajęte, to wtedy nie byłoby dyskusji (stąd więc było poprzednie pytanie). Za pomocą INT dostajesz sygnał bitu startu. Po jego wykryciu robisz:
1. blokujesz przyjmowanie przerwań z tego INTA
2. programujesz tak timer by przerwał ci po czasie równym 1.5 czasu jednego bitu
Od tej chwili odbierasz bity w przerwaniach od timera, który programujesz by przerwał ci po czasie trwania jednego bitu.
Po skończeniu odbierania blokujesz timer, zezwalasz na przerwania od INT (nie zapomnij wcześniej zgasić flagi zgłoszenia przerwania, bo po zezwoleniu na przerwania natychmiast ci ponownie przerwie).
Obsługa w trybie ciągłego sensowania to zamorduje ci procek, no chyba, że on więcej nic nie robi.

Alfred
-
-
Posty: 19
Rejestracja: 22 lip 2004, o 11:25

Postautor: Alfred » 15 lis 2004, o 15:28

Witam :)

Calkiem fajnie wymysliles z tym sprawdzaniem stanu bitu w polowie jego trwania. To bardzo uprosci sprawe w porownaniu z kilkakrotnym probkowaniem jednego bitu. No coz ale cos za cos, wedlug mnie kilkakrotne probkowanie daje wieksza pewnosc. Ale moze Twoja metoda wystarczy. Sprobuje.

A tego z zerowaniem flagi nie bardzo rozumiem?!? Chyba nie potrzeba nic zerowac bo po przyjeciu przerwania samo sie wyzeruje, a skoro natychmiast po przyjeciu int'a blokuje go to raczej zadne juz sie nie zglosi. Oczywiscie na wszelki wypadek moza tak zrobic jak mowisz.

Pozdrawiam.

Awatar użytkownika
gawel
-
-
Posty: 683
Rejestracja: 24 lis 2003, o 11:19
Lokalizacja: Białystok

Postautor: gawel » 15 lis 2004, o 15:40

Po wykryciu bitu startu (poprzez przerwanie) proponuję zablokowanie przerwań od INT. Stan niski (od bitu startu) spowoduje przerwanie, jego obsługa zeruje flagę przerwania. Oczywiście na tym wejściu nadal będą spełnione warunki do zgłaszania przerwań. W rzeczywistości sygnał z INT ustawia flagę żądania przerwania. Flaga ta jest dopiero sygnałem żądania przerwania. Jeżeli będziesz miał zablokowane przyjęcie przerwania od INT, to ci nie przerwnie, ale zapamięta, że było przerwanie (jako nieobsłużone).

Awatar użytkownika
Maybe
-
-
Posty: 63
Rejestracja: 19 wrz 2004, o 19:58
Lokalizacja: Dziebieszyce
Kontaktowanie:

Postautor: Maybe » 15 lis 2004, o 18:12

Jaka ma być szybkość transmisji? Wydaje mi się, że mam "gotowca", ale chodzi do 1200 bps.

Maybe

Alfred
-
-
Posty: 19
Rejestracja: 22 lip 2004, o 11:25

Postautor: Alfred » 16 lis 2004, o 10:04

Po wykryciu bitu startu (poprzez przerwanie) proponuję zablokowanie przerwań od INT. Stan niski (od bitu startu) spowoduje przerwanie, jego obsługa zeruje flagę przerwania. Oczywiście na tym wejściu nadal będą spełnione warunki do zgłaszania przerwań. W rzeczywistości sygnał z INT ustawia flagę żądania przerwania. Flaga ta jest dopiero sygnałem żądania przerwania. Jeżeli będziesz miał zablokowane przyjęcie przerwania od INT, to ci nie przerwnie, ale zapamięta, że było przerwanie (jako nieobsłużone).
Witam :)

Wydaje mi sie ze wystarczy ustawic zgloszenie przerwania opadajacym zboczem i to powinno problem rozwiazac. Chyba ze zanim zablokuje przerwanie wystapi kolejna zmiana 1->0 syganlu, ale to sie wiaze z nadejsciem 3 bitu (to jest najkrotszy czas kiedy moze zmiana 1->0 nastapic) a w tym czasie '51 z pewnoscia zablokuje przerwanie.

[ Dodano: 16-11-2004, 10:06 ]
Jaka ma być szybkość transmisji? Wydaje mi się, że mam "gotowca", ale chodzi do 1200 bps.

Maybe
Potrzebuje troche szybciej, jakies 9600. Ale podeslij jak mozesz :)

Awatar użytkownika
edwinch
-
-
Posty: 2
Rejestracja: 18 lut 2004, o 14:07
Lokalizacja: ostrów w

Postautor: edwinch » 16 lis 2004, o 14:49

Witam :)

Jaki masz kwarc?

teoretycznie, przy kwarcu 11059200Hz możesz wyciągnąć 38400bps, pod warunkiem, że przy przerwaniu od bitu startu wyrobisz się z ustawieniem wszystkiego w ok. 20 cyklach zegarowych, co w assemblerze nie powinno być problemem. reszta to już pestka.
Co do pewności transmisji - próbkowanie bitu tylko w jednym punkcie nie jest zbyt dobrym rozwiązaniem, ale można zastosować chociażby kontrolę parzystości - w '51 masz znacznik parzystości akumulatora w psw, dołożysz jeszcze sumę Ex-OR i masz już całkiem pewną transmisję.
Życzę powodzenia!!!!!!!!! 8)

Krisoff
-
-
Posty: 2
Rejestracja: 16 lis 2004, o 23:46
Lokalizacja: Śląsk Cieszyński

Postautor: Krisoff » 16 lis 2004, o 23:55

W książce Podstawy programowania mikrokontrolera 8051 jest rozdział poświecony programowej realizacji transmisji przez RSa. Dwa przykłady dla 4800 bod (z wykorzystaniem timera) i 115200 bod (bez timera) w obu przypadkach wykorzystane INT0.

Alfred
-
-
Posty: 19
Rejestracja: 22 lip 2004, o 11:25

Postautor: Alfred » 18 lis 2004, o 09:16

W książce Podstawy programowania mikrokontrolera 8051 jest rozdział poświecony programowej realizacji transmisji przez RSa. Dwa przykłady dla 4800 bod (z wykorzystaniem timera) i 115200 bod (bez timera) w obu przypadkach wykorzystane INT0.
Dzieki Krisoff ! :)
Zdobylem ksiazke i przestudiowalem przyklady. Jesli chodzi o male trasmisje to rozwiazanie jest takie samo jak tu omowiane. Natomiast ciekawe jest rozwiazanie dla wiekszych predkosci.

Pozdrawiam.

Wróć do „8051”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 18 gości