Jump to content
ELFORUM - Forumul electronistilor

SEMNAL ARDUINO


Guest

Recommended Posts

Salut. Am și eu nevoie de ajutor, fiind la început de Arduino. Doresc să vizualizez un semnal pe un osciloscop de la un pin digital Arduino, dar nu doar ca este în 1 sau 0. As dori să pot vizualiza pe acel pin o combinatie(de ex. 10110011). Dacă știe cineva cum aș putea seta pe acel pin combinația binară. Mulțumesc.

Edited by Guest
Link to comment
  • Replies 50
  • Created
  • Last Reply

Top Posters In This Topic

Foloseşti o buclă for() pt. a serializa aria de biţi.

Dacă vrei doar 8 biţi poţi folosi un singur byte la care manipulezi biţii din componenţă.

De ex. aşa:

byte myByte = b10110011;

for (int i = 0; i < 8; i++) {

  digitalWrite(outputPin, bitRead(myByte, i);

  delay(10);  //sau ce valoare doresti

  }

Link to comment
Acum 15 minute, mihaicozac a spus:

Foloseşti o buclă for() pt. a serializa aria de biţi.

Dacă vrei doar 8 biţi poţi folosi un singur byte la care manipulezi biţii din componenţă.

De ex. aşa:

byte myByte = b10110011;

for (int i = 0; i < 8; i++) {

  digitalWrite(outputPin, bitRead(myByte, i);

  delay(10);  //sau ce valoare doresti

  }

delay(10) in functie de delay = (nr.diviziuni pe ecran x time/div setat pe osciloscop) / 8, cum îmi este sugerat mai sus? Se poate si fara delay?

Mulțumesc pentru ajutor.

Link to comment

Fără întârziere într-un fel sau altul nu se poate. Dacă nu vrei să foloseşti funcţia delay() poţi utiliza millis() sau creezi o funcţie gen clock() bazată pe millis() cu temporizarea care o doreşti, când acea funcţie răspunde cu true mai trimiţi un bit afară:

Vezi că am uitat o paranteză la finalul funcţiei digitalWrite(), acolo e nevoie de paranteză dublă.

 

Edited by mihaicozac
Link to comment

Mulțumesc. Vreau sa te mai intreb, am acum cobinatia de biti dorita pe un pin digital, daca vreau sa fac acum un semnal(vreau un semnal codat Manchester pe baza semnalului meu), dar semnalul are factor de umplere 1/2, pot sa fac un analogWrite(outPin, 127), outPin e semnalul initial.

Link to comment

Pe ieşire digitală nu poţi scrie semnal analogic PWM, însă poţi împărţi fiecare bit al semnalului codat Manchester în 2 părţi, fiecare parte fiind scrisă separat pe ieşire funcţie de valoarea bitului. respectiv Adică dacă ai 0 logic scrii un "0" apoi un "1" sau invers. Astfel un byte va fi transmis în 16 părţi în loc de 8.

Link to comment

Cumva cumva am sarit peste Manchester...

Pe de o parte exista biblioteci care implementeaza "protocolul" asta. Pe de alta, daca vresi sa-l implementezi tu, o sa ai nevoie de un cod in genul

typedef union ManchDataType{
   unsigned int Data16Bits = 0x0000; //datele in format Manchhester intr-un singur cuvant de 16 biti 
   unsigned char Data8BitsArr[] = {0, 0}; //aceleasi date sub forma de array de (2) octeti.
} ManchData;

ManchData myManchesterData; 
unsigned char myData8Bits = 0xAB; //sau ce ai tu de transmis
char i = 0;

for(i = 0; i < 8; i++){ //mai am biti de testat
  myManchesterData.Data16Bits <<= 2; //fa loc la dreapta pentru 2 biti noi (fiecare bit original e inlocuit de 2 biti manchester
  if((myData8Bits & 0x80) == 0){ //MSB = 0
     myManchesterData.Data16Bits |= 1; // adauga b'01' la dreapta                         
  } else { // MSB = 1                
     myManchesterData.Data16Bits |= 2; // adauga b'10' la dreapta                         
  }    
  
  myData8Bits <<= 1; //deplaseaza octetul original la stanga, ca sa testam urmatorul bit (& 0x80)                                  
}    
                  
//acum transmiti cei 16 biti astfel obtinuti sau modificand de mana starea pinului de iesire
// - testezi valoarea fiecarui bit din cei 16 (myManchesterData.Data16Bits) si modifici corespunzator 
// pinul                  
// sau folosind interfata SPI si transmitand 2 octeti (myManchesterData.Data8BitsArr[0] si 
// myManchesterData.Data8BitsArr[1])                  

Nu-i nevoie de uniune (union) decat daca folosesti interfata SPI, altfel poti folosi direct o variabila pe 16 biti.

 

LE PS Codul e netestat, nici nu stiu daca se compileaza, l-am scris direct pe forum. Daca face figuri, posteaza erorile pe care le genereaza si-l reparam.

 

Edited by Liviu M
Link to comment

He, he, recitind topicul, am descoperit functia bitRead. Pornind de la ea, am descoperit in documentatia de la Arduino de pe site ca exista si alte functii "pe bit". Nici nu mi-as fi imaginat ca-si pierde cineva vremea cu asa ceva.  :rade:In fine...

Cu functiile respective, codul meu de mai sus ar arata mult mai elegant,  dar nu-l mai modific acum. In varianta mea pare mai "pedagogic".

Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now



×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.Terms of Use si Guidelines