2015-12-25 6 views
6

Ich bin neu in C-Programmierung, und ich möchte einen Hex-Code (38) an 8 Pins (auf einem Parallaxen-Propeller-Mikrocontroller) senden, so dass der erste Pin eine 0 erhält, und der nächste Pin bekommt eine 0 und der nächste Pin bekommt eine 1, etc. Das wäre dann einfacher Senden eines Binärcodes an jeden Pin.Senden von Hex-Code

Übrigens ist dies für C-Code. Der Code, den ich so weit bin mit, dass durch die Verwendung binär arbeitet, ist:

//int port[] = {27,26,25,24,23,22,21,20};  
int i = 8; 

while(i >0) 
{  //while start 
    --i; 
    low(27); 
    low(26); 
    high(25); 
    high(24); 
    high(23); 
    low(22); 
    low(21); 
    low(20); 
} 

Was ich tun möchte, ist, sollte ein einzelnes Hex-Code (38) an den Pins 20 bis 27

+0

Normalerweise sind solche Pins in einem 8-Bit-Port und Sie 'write_port (port_no, 0x38)'. Wie ist deine Situation anders? –

Antwort

3

Die Schleife senden

int port = 0x20; // starting port 
int val = 0x38; // value 
int i; 

for(i=0 ; i<8 ; i++) { 
    if (val & 1) high(port); 
    else   low (port); 
    val >>= 1; // shift val one bit right 
    port++; // increment port 
} 

der Schleifenstart von Port 0x20 und Bit 0 von val ein wenig unterschiedlich sein. Wenn dieses Bit 1 ist, wird ein hoch ausgeführt, andernfalls wird ein niedriger auf diesem Port ausgeführt.

Dann val ist ein Bit nach rechts verschoben, Bit 1 zu verwenden, und Port wird erhöht.

Etc ... dies geschieht 8 mal für die acht Bits von val (0x38).

Beachten Sie, dass, wenn Sie Start von der Spitze Hafen haben , diese andere Version

int val = 0x38; // value 
int port; 

for(port=0x27 ; port >= 0x20 ; port--) { // goes from port 0x27~20 
    if (val & 0x80) high(port); 
    else   low (port); 
    val <<= 1; // shift val one bit left 
} 
2

Zum einen, wenn sie mit Mikro-Controller arbeiten, in der Regel gibt es einen Weg, um den Wert passen sollte angeben der 8 Pins gehören zum selben Port auf einmal.

Sie sollten versuchen, es aus dem Microcontroller (uC) Handbuch/Datenblatt herauszufinden, indem Sie Stichwort suchen !! Sonst finden Sie eine höllische Zeit (wirklich, ich bin kein Scherz! Zumindest habe ich!) Zu suchen verstreut in aber ein paar der hundert/tausend Seiten des Handbuchs/Datenblatt.

Versuchen Sie dies zuerst und es sollte viel einfacher werden.

Zweitens, in uC zuweisen hohe und niedrige auf Pin in der Regel nicht verschiedene Funktionen zu nehmen, da sie einfach Wert (hoch oder niedrig) auf den gleichen Pin zuweisen.Also, wann immer möglich, sollten Sie die hohen & low-Funktionen in einzelne Funktion kombinieren (da ich nicht weiß, was ist hoch & niedrig, ich kann nicht wirklich weiter helfen, aber Sie sollten diese Möglichkeit zur Erleichterung Ihrer Aufgabe beachten)

Schließlich jedoch für den Fall, kann es nicht für einen oder anderen Grund getan werden, können Sie Ihre C-Code wie folgt vereinfachen kann,

void assignPort(char val, char portBase){ 
    int i = 0; 
    for (i = 0; i < 8; ++i) 
     if (val & (1 << i)) //masked your val with shifting 1 to get the current bit 
      high(portBase + i); //increase your port address by i 
     else 
      low(portBase + i); 
} 

und die Funktion aufrufen, tun einfach

assignPort(0x38, 20); //notice the 38 using 0x for hex indicator while 20 is written as it is (assuming 20 is not hex) 

Beachten Sie, dass, wenn Ihre high und low Funktionen kombiniert werden können, ist

void highLowCombined(char pinAddress, char highOrLow) { //highOrLow is simply non-zero (high) or zero (low) 
    //do something based on pinAddress and highOrLow 
} 

Ihre Aufgabe viel einfacher in High/Low-Funktionen und val Variable in den assignPort oben Aufruf, da Sie es einfach tun müssen, wie diese

void assignPort(char val, char portBase){ 
    int i = 0; 
    for (i = 0; i < 8; ++i) 
     highLowCombined(portBase + i, val & (1 << i)); //only one line is needed here! 
} 

Jetzt brauchen Sie nur eine Zeile in der for-loop! Versuch es!

+0

Vielen Dank, ich fand auch eine einfache Methode: set_outputs \t (23, 16, h); \t \t \t // Pin über HEX-Code setzen – Gregfox

+0

Ok groß. Wo hast du es gefunden? Das Handbuch? – Ian

+0

Ich habe den Befehl in simpleTools.h gefunden – Gregfox