Sari la conținut
ELFORUM - Forumul electronistilor

Convert 1 byte to 8 bit BASCOM / SPI comunication


Cilibiu

Postări Recomandate

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
  • Răspunsuri 62
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • Cilibiu

    32

  • Liviu M

    23

  • djvas

    6

  • gas2 dan

    2

Top autori în acest subiect

Imagini postate

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

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 de djvas
Link spre comentariu

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 de Cilibiu
Link spre comentariu
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

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 de Cilibiu
Link spre comentariu

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....

20200501_211452.jpg

Editat de Cilibiu
Link spre comentariu

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

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

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 de djvas
Link spre comentariu

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 de Liviu M
Link spre comentariu

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 de Cilibiu
Link spre comentariu

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

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 cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări