PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : INT Variable einem Port (Ausgang) zuweisen



xrzr
18.01.2016, 14:44
Hallo,

ich würde gerne eine int16_t Variable einem Port zuweisen (in C).
Einen gesamten Port setzten kann ich ja z.B. nur mit Hex oder Binär --> PORTA = 0xAA; oder PORTA = 0b10101010;

Wie kann ich jetzt z.B: int a = 150; einem Ausgang zuweisen?


Danke.

botty
18.01.2016, 16:10
Hallo,

grundsätzlich läßt sich ein 16bit Wert nicht an ein 8bit Register zuweisen.

Wenn Du aber den 16bit Wert nur für eine Berechnung gebraucht hast, wo 8bit hätten überlaufen könnten und das Ergebnis wieder zwischen 0 und 255 liegt, läßt sich die Zuweisung nach einer Bereichsüberprüfung mit einem Downcast erreichen:



int var = /* Berrechnung */

if(var >= 0 && var <= 255) {
PORTA = (uint8_t)var; // Downcast
} else {
/* Fehler der behandelt werden sollte */
}


Gruß

Chris

xrzr
18.01.2016, 16:25
Ok danke, ja hatte vergessen zu erwähnen das ich nur Werte bis 255 erwarte in der Variable.
Werde in einem auch den Datentyp bei der initalisierung auf uint8_t ändern.
Also kurz gefasst:
PORTA = var; // var vom typ uint8_t

oberallgeier
18.01.2016, 16:43
.. Werde .. den Datentyp bei der initalisierung auf uint8_t ändern .. PORTA = var; // var vom typ uint8_t
.. z.B: int a = 150; einem Ausgang zuweisen ..Was bezweckst Du damit? WENN Dir so ohne weiteres klar ist, dass 150dez gleich 0b10010110 ist, dann macht das meiner Meinung nach einen (Teil-) Sinn. Teil deshalb weil es wohl nur sinnig ist, wenn der Port mit diesen Daten auch was anfangen kann. Wenn der Port komplett als Ausgang konfiguriert ist - DDRA = 0b11111111 - dann gehen bei "150" die Bits 7, 4, 2 und 1 an (auf high).

Das Vorgehen dürfte also wohl nur dann sinnvoll sein, in denen der Port komplett als Ausgang konfiguriert ist, siehe oben. Denn der Sinn die Pullups wahlweise komplex zu setzten oder zu löschen ist für mich nicht wirklich einsichtig. Ich selbst operiere mit kompletten Ports nur in der binären Form - weil ich zu dämlich bin das Bitmuster von Dezimalzahlen mir ohne Hilfe vorstellen zu können. Einzelne Bits schalte ich in der üblichen Weise.

Ausnahme: Bei meiner PingPongPlatine, 120 LEDs auf einer Karte, schalte ich mitunter auch schon mal "im Prinzip" mit ner 38015 einige >bestimmte< LEDs ein. (Im Prinzip, weil das über ein Schieberegister geschieht).

xrzr
18.01.2016, 17:19
Ja, der Port ist komplett als Ausgang konfiguriert.
Ich erhalte per UART bestimtme Werte von 0-255, die ich nicht als Zahl sondern als Bit-muster für die Ausgänge deute.

Liquidator
20.04.2016, 22:25
Der Post hier ist schon alt, ich antworte jedoch trotzdem, falls jemand es doch brauchen sollte.

Dann nimm doch einen cast-Operator, sowie botty es sagte. Stichwort "implizite Datentypkonvertierung". Heißt also eine "gewaltsame" Konvertierung von einem größeren Datentyp (uint16_t) zu einem kleineren (uint8_t).
Dann werden nur die niedrigsten 8 Bits der uint16_t - Variable in das Portregister eingetragen.



uint8_t LowByte;
uint16_t DualByte;

// hier folgt die Zuweisung der 16-Bit-Variable

// Bei einer impliziten Datentypkonvertierung findet kein Runden etc. statt,
// lediglich ein "Abschneiden" der höheren 8 Bits. Die niedrigen 8 Bits werden
// der 8-bit-Variable zugewiesen
LowByte = (uint8_t) DualByte;