Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Mikrokontroler na PC i nazad preko USB-a ?

[es] :: Elektronika :: Mikrokontroler na PC i nazad preko USB-a ?

Strane: 1 2

[ Pregleda: 7868 | Odgovora: 24 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

pp.peca
Predrag Pešić
Beograd

Član broj: 177279
Poruke: 10
93.87.130.*



Profil

icon Re: Mikrokontroler na PC i nazad preko USB-a ?23.11.2009. u 00:36 - pre 174 meseci
Zdravo!

Evo, posle skoro deset meseci imam malo vremena i rešio sam da ovu priču nekako dovedemo do kraja i krunišemo jednim "živim" projektom. Naravno, sve što budem uradio dokumentovaću i okačiti ovde.
Pa, da nastavimo tamo gde smo stali.
Dakle, ja se preslišavam: kada je UOWN postavljen na 0 (postavila ga je SIE) i posle generisanja TRNIF moramo da pogledamo sadržaj registra USTAT da bismo ustanovili šta je odrađeno.
E, sada postaje malo konfuzno jer ovaj registar ima 4 bajta i tipa je FIFO (prvi ušao-prvi izašao). Gledajući memorijsku mapu u podacima za ovaj tip controlera (DS39632C-page 66) ovaj registar se pojavljuje na adresi 0xF6C i širine je jedan bajt. Ostalim trima bajtovima izgleda ne možemo da pristupimo direktno nego samo pomeranjem sadržaja (bajtova) od "pozadi" ka "napred" tj. kada bajt koji vidimo na ovoj adresi "ispadne" a na njegovo mesto dođe bajt koji je "iza" njega.
To mi je jasno kada je registar pun tj. ima sva četiri bajta. To, dalje, znači da je SIE odradila četiri transakcije (ili SETUP ili OUT ili IN) i dokle god ne oslobodimo bar jedno "zadnje" mesto ona će hostu da šalje NAK. Oslobađanje mesta odn. pomeranje "u napred" postižemo brisanjem bita TRNIF (ukoliko grešim, ispravite me).
Dakle, šta se dešava kada je ovaj registar u nedefinisanom stanju (DS39632C-page 55) posle uključenja uređaja ili internih reset-a? Jer posle prvog RESET-a od strane hosta potrebno je pogledati da li imamo TRNIF i šta imamo u USTAT: u kom bajtu? U prvom ("prednjem") na adresi 0xF6C (što mi je logično) ili u "zadnjem" pa moram tri puta da obrišem TRNIF da bih "dovukao zadnji bajt" na mesto "prednjeg" bajta (što mi je nelogično).
Zašto mi je ono prvo logičnije? Zato što bi SIE trebalo da napuni prvi ("prednji") bajt, pa sledeći i tako redom dok ne napuni i "zadnji" bajt.
Još nešto.
Recimo da Ping-Pong baferovanje nije uključeno i da smo dobili OUT transakciju za Endpoint1_OUT i da je SIE u Endpoint1_OUT_bafer-u upisala neke podatke i UOWN prebacila u 0. I sada, dok mi to čitamo i spremamo odgovor (jer ipak nam je za to potrebno neko vreme), host u međuvremenu pošalje ponovo OUT transakciju za Endpoint1_OUT. SIE bi trebala da tu novu transakciju registruje u USTAT (ako ima mesta) i te nove podatke ponovo upiše u Endpoint1_OUT_bafer, zar ne? Pošto jezgro i dalje drži UOWN bit na 0 ... gde će SIE da upiše podatke jer joj je pristup onemogućen?
Da li grešim ako mislim da SIE neće ništa da upisuje u USTAT i u Endpoint1_OUT_bafer (pošto su joj i endpoint i ovaj bafer nedostupni) i da će da izbaci NAK svaki put kada host pošalje OUT transakciju za Endpoint1_OUT dokle god mi ne obrišemo TRNIF i ne prebcimo UOWN na 1 ali da će normalno da primi transakcije za ostale endpointe koje nisu opisane u "prednjem" bajtu?
Ili postoji neki drugi hardverski mehanizam koji rešava ovaj problem pa programer ne mora o tome da brine?
Za sada toliko.
Pozdrav od Pece.
Pozdrav, Peca.
 
Odgovor na temu

barum
Bojan Radosavljevic

Član broj: 52522
Poruke: 418
*.uforce.net.



+1 Profil

icon Re: Mikrokontroler na PC i nazad preko USB-a ?30.11.2009. u 16:34 - pre 174 meseci
Citat:
 kada je UOWN postavljen na 0 (postavila ga je SIE)

Da, ti u programu trebaš samo da setuješ UOWN na 1 a SIE kad obavi transakciju vrati na 0.

Citat:
i posle generisanja TRNIF moramo da pogledamo sadržaj registra USTAT da bismo ustanovili šta je odrađeno.
E, sada postaje malo konfuzno jer ovaj registar ima 4 bajta i tipa je FIFO (prvi ušao-prvi izašao).
Gledajući memorijsku mapu u podacima za ovaj tip controlera (DS39632C-page 66) ovaj registar se pojavljuje na adresi 0xF6C i širine je jedan bajt. Ostalim trima bajtovima izgleda ne možemo da pristupimo direktno nego samo pomeranjem sadržaja (bajtova) od "pozadi" ka "napred" tj. kada bajt koji vidimo na ovoj adresi "ispadne" a na njegovo mesto dođe bajt koji je "iza" njega.

Prilikom vraćanja TRNIF bita na 0 hardverski se tekuća vrednost USTAT registra prepisuje sa sledećom vrednošću koja čeka u redu. Funkcionisanje ovog FIFO reda je potpuno nezavisno od izvršenja programa to jest ne oduzima cikluse.

Citat:
To mi je jasno kada je registar pun tj. ima sva četiri bajta. To, dalje, znači da je SIE odradila četiri transakcije (ili SETUP ili OUT ili IN) i dokle god ne oslobodimo bar jedno "zadnje" mesto ona će hostu da šalje NAK. Oslobađanje mesta odn. pomeranje "u napred" postižemo brisanjem bita TRNIF (ukoliko grešim, ispravite me).

Prilikom svakog "bcf UIR,TRNIF" FIFO se oslobađa za jedno mesto. Hardver ne stiže da upali flag odmah u narednoj instrukciji pa se obično stavi NOP instrukcija, na primer kada se desi da host naredi reset odbacanje neobrađenih transakcija kod mene izgleda ovako:

Code:

                      bcf  UIR,TRNIF, ACCESS                               ; isprazni USTAT FIFO
                      nop                                                  ;
                      bcf  UIR,TRNIF, ACCESS                               ;
                      nop                                                  ;
                      bcf  UIR,TRNIF, ACCESS                               ;
                      nop                                                  ;
                      bcf  UIR,TRNIF, ACCESS                               ;



Citat:
Dakle, šta se dešava kada je ovaj registar u nedefinisanom stanju (DS39632C-page 55) posle uključenja uređaja ili internih reset-a?

Ovaj registar ima smisla samo ako imaš signaliziranu transakciju (TRNIF). Postoji noviji datasheet, revizija E.

Citat:

Jer posle prvog RESET-a od strane hosta potrebno je pogledati da li imamo TRNIF

Ne, kada se desi Reset obrađuješ samo reset događaj, resetuješ deskriptore, onaj FIFO, vraćaš status na default, podešavaš bafer na osnovnom EP0 OUT i čekaš od šefa SETUP token da ti stigne na njemu.
Kada nemaš reset obrađuješ eventualne transakcije.

Citat:

i šta imamo u USTAT: u kom bajtu? U prvom ("prednjem") na adresi 0xF6C (što mi je logično) ili u "zadnjem" pa moram tri puta da obrišem TRNIF da bih "dovukao zadnji bajt" na mesto "prednjeg" bajta (što mi je nelogično).

Znači uvek gledaš taj jedini "bajt" registar a hardver se brine da tu stavi aktuelnu vrednost.

Citat:

Još nešto.
Recimo da Ping-Pong baferovanje nije uključeno i da smo dobili OUT transakciju za Endpoint1_OUT i da je SIE u Endpoint1_OUT_bafer-u upisala neke podatke i UOWN prebacila u 0. I sada, dok mi to čitamo i spremamo odgovor (jer ipak nam je za to potrebno neko vreme), host u međuvremenu pošalje ponovo OUT transakciju za Endpoint1_OUT. SIE bi trebala da tu novu transakciju registruje u USTAT (ako ima mesta) i te nove podatke ponovo upiše u Endpoint1_OUT_bafer, zar ne? Pošto jezgro i dalje drži UOWN bit na 0 ... gde će SIE da upiše podatke jer joj je pristup onemogućen?
Da li grešim ako mislim da SIE neće ništa da upisuje u USTAT i u Endpoint1_OUT_bafer (pošto su joj i endpoint i ovaj bafer nedostupni) i da će da izbaci NAK svaki put kada host pošalje OUT transakciju za Endpoint1_OUT dokle god mi ne obrišemo TRNIF i ne prebcimo UOWN na 1 ali da će normalno da primi transakcije za ostale endpointe koje nisu opisane u "prednjem" bajtu?
Ili postoji neki drugi hardverski mehanizam koji rešava ovaj problem pa programer ne mora o tome da brine?

Da tako nekako, postoji hardverski imlementirani handshake mehanizam koji odgovara hostu na njegove periodične zahteve da endpoint još nije slobodan. U okviru endpointa komunikacija je sinhronizovana i neće biti izgubljenih podataka niti problema sa redosledom pristizanja već će samo brzina prenosa podataka biti smanjena zbog odlaganja. Ping-pong bafering je vrlo jednostavan mehanizam kojim se može duplirati performansa sistema.

Pozdrav
 
Odgovor na temu

pp.peca
Predrag Pešić
Beograd

Član broj: 177279
Poruke: 10
93.86.151.*



Profil

icon Re: Mikrokontroler na PC i nazad preko USB-a ?30.11.2009. u 21:57 - pre 174 meseci
Hvala Bojane.

Sada je vreme da ovo malo "sažvaćem" i napišem nešto koda da ovo i proradi (ako i kad proradi ).
Ranije u jednoj poruci si napisao
Citat:
Nemam ni ja ali mi to nije bio problem jer imam serijsku vezu i u asm kodu imam gomilu PRINTF makroa koji detaljno loguju u Realterm sve što se dešava u programu

pa te molim da nas uputiš kako si to uradio (ukoliko može u C-u).
Ja sam pokušao da odrađujem simulaciju u Proteus-u 7 Professional međutim ono što mi prikazuje simulacija i ono što mi prikazuje moj razvojni sistem (EasyPIC3 sa pic18f4550 sa ext. osc. na 8MHz) se prilično razlikuje pa mi treba nešto pouzdano.

Opet, dosta za sada.

Pozdrav od Pece.

Pozdrav, Peca.
 
Odgovor na temu

barum
Bojan Radosavljevic

Član broj: 52522
Poruke: 418
*.uforce.net.



+1 Profil

icon Re: Mikrokontroler na PC i nazad preko USB-a ?01.12.2009. u 13:24 - pre 174 meseci
Evo kako to izgleda na primeru reset handler-a

Code:

URSTIF_Handler             
                  println  "USB Reset..."


i kada dobijem usb reset događaj ovaj makro će odštampati ovaj tekst na terminalu PC-a i programu "realterm".
Kada dobijem druge događaje štampam druge tekstove i na taj način mogu da pratim šta se događa i gde je problem.
Rekli su mi neki da će ovo praviti priličan zastoj i da u USB protokolu postoje precizni tajminzi koje treba ispoštovati. To jeste tačno na avr mikrokontrolerima koji imaju softverski handshake ali ispostavilo se da ne mogu da izazovem naročite probleme na pic-evima sa usb hardverom. Kada je uređaj proradio uklonio sam sva štampanja ovih opisnih tekstova i dobio uređaj koji se inicijalizuje u deliću sekunde (inače dve tri sekunde sa štampanjem).

E sad kako ovo radi.

Glavna fora koju sam koristio je ugrađivanje unutar samog koda karaktera stringa za prikaz na terminal. Ovo sam radio samo u assembleru. Prvo je potrebno napraviti ovaj makro. Makroi su u *.inc fajlu i uključuju *.asm kod ih include-uje po potrebi. On izgleda ovako

Code:



println             macro  text
                    local  string_start, string_end
                      bra  string_end                                      ; skipping data
string_start           DB  text, 0x0A, 0                                   ;
string_end          movlw  upper(string_start)                             ;
                    movwf  TBLPTRU, ACCESS                                 ;
                    movlw  high(string_start)                              ;
                    movwf  TBLPTRH, ACCESS                                 ;
                    movlw  low(string_start)                               ;
                    movwf  TBLPTRL, ACCESS                                 ;
                     call  StringOutTableRead                              ;
                     endm                                                  ;




šta je ovo: tekst je neki string pod navodnicima, u kod se ubacuje na lokaciju sa labelom string_start i proteže se do lokacije string_end, nakon teksta pod navodnicima ubacio sam karakter 0x0A koji prebacije u nov red i na kraju ide null termination character ( u C se označava sa '\0' a ovde samo nula). Podrazumeva se da izvršenje mora da preskoči podatke, to ti je ona branch naredba pre.
Adresu stringa ubacim u table pointer i zovem funkciju koja StringOutTableRead koja će raditi table read karakter po karakter sve dok ne pročita nulu - null termination character:

Code:


                           
StringOutTableRead         
                    TBLRD  *+                                              ; read into TABLAT and increment
                     movf  TABLAT, W, ACCESS                               ; get char
                    btfsc  STATUS, Z, ACCESS
                   return  
                     call  SerialTX              
                      bra  StringOutTableRead



i nedostaje još primitivna funkcija za slanje karaktera na serijsku vezu

Code:


SerialTX                                                                   ;-----------------------------------------    
                    btfss  PIR1, TXIF, ACCESS                              ;
                      bra  SerialTX                                        ;
                    movwf  TXREG, ACCESS                                   ;
                   return                                                  ;




i to je to. Sa ovim može da se debaguje skoro sve. Imam i verziju makroa print skoro sve isto samo nema karaktera za novi red. Imam i verziju koja ne poziva StringOutTableRead već jednu malo drugačiju koja kada naiđe na karakter '%' gleda koji je sledeći karakter i ako je 'd' onda konvertuje argument u decimalni ispis a ako je 'x' onda heksadecimalni. Ali to ne planiram da poklanjam ovako lako. Pozdrav i sve najbolje
 
Odgovor na temu

pp.peca
Predrag Pešić
Beograd

Član broj: 177279
Poruke: 10
93.86.151.*



Profil

icon Re: Mikrokontroler na PC i nazad preko USB-a ?01.12.2009. u 17:12 - pre 174 meseci
Kao i uvek - kratko i jasno.
I opet: hvala!
Ovo ću da proučim (iako ga ne koristim, poznajem asembler) pa da napravim ekvivalent u C-u.

Pozdrav od Pece.
Pozdrav, Peca.
 
Odgovor na temu

[es] :: Elektronika :: Mikrokontroler na PC i nazad preko USB-a ?

Strane: 1 2

[ Pregleda: 7868 | Odgovora: 24 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.