Cilibiu Postat Mai 1, 2020 Partajează Postat Mai 1, 2020 Salut tuturor. Cum convertesc un byte in 8 bit? Am o comunicatie SPI intre master si slave . Master: Dim A as byte A=PORTD Spiout A,1 end Slave: Dim A as byte Spiin A,1 PORTD=A end Codul acest merge, cum fac in slave sa extrag din variabila A fiecare portd ca bit? As vrea ca masterul sa raman la fel dar la slave sa convertesc valoarea decimala care o primesc ca variabila A si sa o transform in biti: Un ex de slave ce as vrea: Dim A as byte Dim B as bit Dim C as bit Dim D as bit Dim E as bit Dim F as bit Dim G as bit Dim H as bit Dim I as bit Spiin A, 1 "A convert to b,c,d,e,f,g,h,i as bit" PORTD.0=B PORTD.1=C PORTD.2=D PORTD.3=E PORTD.4=F PORTD.5=G PORTD.6=H PORTD.7=I Link spre comentariu
gas2 dan Postat Mai 1, 2020 Partajează Postat Mai 1, 2020 Fara sa te superi si poate scap si fara avertizare de offtopic, eu ma gandesc (dupa ceva mici cu bere) , poate si altii: fi-ţi-ar BASCOMUL sa-ti fie... Scuze. Dar, incearca domnule un limbaj de programare mai spre secolul asta. Inca o data, scuze. Link spre comentariu
djvas Postat Mai 1, 2020 Partajează Postat Mai 1, 2020 (editat) nu ma pricep la bascom si nici la basic deci trebuie sa fii tu atent la sintaxa dar se poate face asha : PORTD.RD7 = A AND 10000000 unde AND este operator logic si 10000000 este reprezentat in binar, poate fi 128 in DEC, adica expresia poate fi PORTD.RD7 = A AND 128 PORTD.RD6= A AND 01000000 ... PORTD.RD1= A AND 00000010 PORTD.RD0= A AND 00000001 Da care e utilitatea ? Ca daca faci PORTD= A va face exact ce vrei tu Editat Mai 1, 2020 de djvas Link spre comentariu
Cilibiu Postat Mai 1, 2020 Autor Partajează Postat Mai 1, 2020 (editat) Eu am dat un mic exemplu. Sa intru un pic in detaliu. Folosesc 3 placi de dezvoltare ARDUINO UNO, 1 Master si 2 Slave. Din cauza a foarte multe intrari folosite am zis ca prima placa master sa fie setat ca inputuri si care trimite aceste inputuri catre cele 2 slave, un slave are conectat un LCD grafic conexiune parallel care a ocupat aproape toti pini arduinoului si sa afiseze starea fiecarui input din master , iar al 2 arduino slave care se va ocupa de main program si setare outputuri. Am reusit sa trimit fiecare bit separat si am reusit deocamdata sa trimit 2 byte ca 16 bit pe spi. Acum am dat de alta problema. Cand vreau sa mai trimit 2 byte, in total 4 byte pe spi, eu trimit gen 128,129,130,131 ca ordine si primesc 131,128,129,130. Nu mai stiu ce sa ii fac sa citeasca primul byte sau sa trimita primul byte. Motivul cara ma facut sa ma intorc la BASCOM a fost ca arduino nu imi ofera acces asa bine ca Bascom. De exemplu eu o configuratie in bascom pentru afisare ceva pe LCD grafic ocupa 2% din memorie, acelasi lucru facut in arduino imi ocupa 43%. In bascom pot incarca grafic si dupaia sa fac update doar la text, in arduino nu se poate asa ceva, si cand dau refres sa afisez urmatoarele valori , dispare tot si dureaza 1-2 secunde pana se populeaza tot afisajul,tinand cont ca refresul in vreau la 100ms, ceea ce nu imi permite arduino. Plus ca limbajul c nu il stapanesc asa bine ca Basic, ma ajuta mult help-ul arduino-ului dar nu asa bine ca in basic. Editat Mai 1, 2020 de Cilibiu Link spre comentariu
djvas Postat Mai 1, 2020 Partajează Postat Mai 1, 2020 Acum 18 minute, Cilibiu a spus: Folosesc 3 placi de dezvoltare ARDUINO UNO, 1 Master si 2 Slave. Din cauza a foarte multe intrari folosite am zis ca prima placa master sa fie setat ca inputuri si care trimite aceste inputuri catre cele 2 slave, un slave are conectat un LCD grafic conexiune parallel care a ocupat aproape toti pini arduinoului si sa afiseze starea fiecarui input din master , iar al 2 arduino slave care se va ocupa de main program si setare outputuri. Mi se pare ca te complici inutil. De ce nu folosesti un micro controler cu suficiente I/O pentru aplicatia ta ? Acum 19 minute, Cilibiu a spus: Am reusit sa trimit fiecare bit separat si am reusit deocamdata sa trimit 2 byte ca 16 bit pe spi. Acum am dat de alta problema. Cand vreau sa mai trimit 2 byte, in total 4 byte pe spi, eu trimit gen 128,129,130,131 ca ordine si primesc 131,128,129,130. Nu mai stiu ce sa ii fac sa citeasca primul byte sau sa trimita primul byte. Daca pui si codul poate te putem ajuta, altfel .... Link spre comentariu
Cilibiu Postat Mai 1, 2020 Autor Partajează Postat Mai 1, 2020 (editat) Am nevoie de cel putin 6 byte. Mai jos codurile de la master si slave care imi da bataie de cap. Master: $regfile = "m328pdef.dat" $crystal = 16000000 'Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = High , Phase = 0 , Clockrate = 4 , Noss = 0 Config Spi = Soft , Din = Pinb.4 , Dout = Portb.3 , Ss = Portb.2 , Clock = Portb.5 , Spiin = 0 , Mode = 1 , Speed = 1 , Setup = 1 Spiinit Enable Spi Dim A(4) As Byte 'Status Sursa pozitiva canal R A(1) = 0 A(2) = 0 A(3) = 0 A(4) = 0 Do A(1) = 248 A(2) = 128 A(3) = 200 A(4) = 116 Spiout A(1) , 2 Loop End Slave: $regfile = "m328pdef.dat" $crystal = 16000000 Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = No , Polarity = High , Phase = 0 , Clockrate = 4 , Noss = 1 Spiinit Enable Spi $lib "glcdra6963.lib" Config Graphlcd = 240 * 128 , Dataport = Portd , Controlport = Portc , Cd = 1 , Rd = 3 , Wr = 4 , Ce = 0 , Reset = 2 , Fs = 5 , Mode = 8 Cursor Off Noblink Cls Dim A(4) As Byte 'Status Sursa pozitiva canal R Do Spiin A(1) , 2 Locate 8 , 2 Lcd A(1) Locate 9 , 2 Lcd A(2) Locate 10 , 2 Lcd A(3) Locate 11 , 2 Lcd A(4) Loop End Pe display imi afiseara in ordinea asta: 116 248 128 200 Editat Mai 1, 2020 de Cilibiu Link spre comentariu
djvas Postat Mai 1, 2020 Partajează Postat Mai 1, 2020 Poti sa ne spui si ce receptionezi ? Link spre comentariu
Cilibiu Postat Mai 1, 2020 Autor Partajează Postat Mai 1, 2020 (editat) Masterul trimite 4 byte pe spi, respectiv 248 pe primul byte, 128 pe al doilea byte, 200 pe al treilea byte si 116 pe al patrulea byte. Slave-ul este conectat la display si afisez valorile trimise pe SPI in oardinea care sunt trimise, pe display ar fi trebuie sa imi apara oridnea de mai sus, 248,128,200,116. In schimb mie al 4 byte trimis imi ajunge primul byte receptionat, primul byte trimis imi vine al 2 byte receptionat etc.... Editat Mai 1, 2020 de Cilibiu Link spre comentariu
djvas Postat Mai 1, 2020 Partajează Postat Mai 1, 2020 incearca sa trimiti o singura data fara loop si tot asha sa receptionezi o singura data tot fara loop si vezi ce-ti da Link spre comentariu
Cilibiu Postat Mai 1, 2020 Autor Partajează Postat Mai 1, 2020 Am incercat si rezultatele sunt astea. Prima trimitere: 116 248 128 200 Cand am resetat masterul din nou sa mai trimita o data codul am receptionat. 248 128 200 248 Fara 116 ! Link spre comentariu
djvas Postat Mai 1, 2020 Partajează Postat Mai 1, 2020 (editat) Parerea mea este ca nu se sincronizeaza masterul cu slave-ul si nici nu prea ar avea cum sa o faca in codul tau. Incearca ca acele 4 valori sa le modifici cumva in master si sa le trasmiti, Daca am dreptate cu desincronizarea atunci rezultatele for si mai dramatice la receptie. Dupa cunostintele mele SPI-ul este asha ; CS ( sau SS) este o linie de control pe care masterul o pune in 0 atunci cand vrea sa trasmita. In mod normal Slave-ul ar trebui sa sesizeze asta si sa fie pe receptie. La tine nu prea vad cum s-ar putea intampla asta. Cred ca logic ar fi ca linia de SS sa genereze o intrerupere in slave atunci cand e in LOW si sa-l forteze sa receptioneze atunci . Problema cu SPI este ca masterul poate sa trasmita date si habar nu are daca slave-ul le-a receptionat pentru ca nu exista un bit de ACK ca la i2C de exemplu. Editat Mai 1, 2020 de djvas Link spre comentariu
Liviu M Postat Mai 1, 2020 Partajează Postat Mai 1, 2020 (editat) La master pune un delay dupa Spiout, ca poate nu asteapta dupa slave, sa si afiseze dupa ce receptioneaza. Pe de alta parte, ma mir ca transmiti toti cei 4 octeti, ca conform helpului: Citat SPI1OUT var , bytes var The variable whose content must be send to the SPI-bus. bytes The number of bytes to send. Maximum value is 255. Adica pentru 4 octeti comanda ta ar trebui sa fie (ca in help) cu bytes = 4, nu 2 ca la tine: Spiout A(1), 4 'write 4 bytes a(1), a(2) , a(3) and a(4) Editat Mai 1, 2020 de Liviu M Link spre comentariu
Cilibiu Postat Mai 1, 2020 Autor Partajează Postat Mai 1, 2020 (editat) Imi cer scuze acum am vazut ca am copiat un cod de test care mergea. La codul de mai sus imi afisa doar 2 valori nu 4 , in poza se vad 4 valori. Codurile cu probleme. Master $regfile = "m328pdef.dat" $crystal = 16000000 'Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = High , Phase = 0 , Clockrate = 4 , Noss = 0 Config Spi = Soft , Din = Pinb.4 , Dout = Portb.3 , Ss = Portb.2 , Clock = Portb.5 , Spiin = 0 , Mode = 1 , Speed = 1 , Setup = 1 Spiinit Enable Spi Dim A(4) As Byte 'Status Sursa pozitiva canal R A(1) = 0 A(2) = 0 A(3) = 0 A(4) = 0 Do A(1) = 248 A(2) = 128 A(3) = 200 A(4) = 116 Spiout A(1) , 4 Loop End Slave $regfile = "m328pdef.dat" $crystal = 16000000 Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = No , Polarity = High , Phase = 0 , Clockrate = 4 , Noss = 1 Spiinit Enable Spi $lib "glcdra6963.lib" Config Graphlcd = 240 * 128 , Dataport = Portd , Controlport = Portc , Cd = 1 , Rd = 3 , Wr = 4 , Ce = 0 , Reset = 2 , Fs = 5 , Mode = 8 Cursor Off Noblink Cls Dim A(4) As Byte 'Status Sursa pozitiva canal R Do Spiin A(1) , 4 Locate 8 , 2 Lcd A(1) Locate 9 , 2 Lcd A(2) Locate 10 , 2 Lcd A(3) Locate 11 , 2 Lcd A(4) Loop End O sa incerc cu delay sa vad. L.E am incercat si cifrele clipocesc dar tot primul este 116. Editat Mai 1, 2020 de Cilibiu Link spre comentariu
Liviu M Postat Mai 1, 2020 Partajează Postat Mai 1, 2020 Cum adica clipocesc? Cat de mare ai pus intarzierea? Link spre comentariu
Cilibiu Postat Mai 1, 2020 Autor Partajează Postat Mai 1, 2020 Am pus 100mS, am incercat si cu 10ms si tot la fel. Zici ca se suprapune alt numar peste dar acel numar sta mai putin timp afisat decat 116. Am gasit pe acasa un Atmega128 care are destui pini, dar trebuie sa caut un adaptor din SMT in THD. Cred ca renunt la comunicatia asta SPI, vad ca este destul de instabila, am programat iara MCU-urile pentru 2 byte, si daca dau refresh de mai multe ori isi schimba ordinea in afisare. Link spre comentariu
Postări Recomandate
Creează un cont sau autentifică-te pentru a adăuga comentariu
Trebuie să fi un membru pentru a putea lăsa un comentariu.
Creează un cont
Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!
Înregistrează un nou contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum