Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

gelöst Int to byte

Mitglied: Power-Poler

Power-Poler (Level 1) - Jetzt verbinden

28.07.2016, aktualisiert 19:14 Uhr, 1363 Aufrufe, 11 Kommentare

Guten Tag,

Habe gerade ein kleines Problem, welches mir Kopfzerbrechen bereitet.
Und zwar will ich über den Pi an einen der GPIO pins einen byte ausgeben, mittels digitalWrite(x,x)
Die ganze zeit verwende ich hierfür 8 int werte (0 und 1 halt) was natürlich nicht Sinn der Sache ist.

Ist es möglich einen int (oder einen char) in eine bit folge umzuwandeln, also 1 byte?

also sowas zu schreiben pseudocode:
01.
void WRITE(int a){
02.
 digitalWrite(DATAPIN, inttobit(a,7);
03.
 digitalWrite(DATAPIN, inttobit(a,6);
04.
 digitalWrite(DATAPIN, inttobit(a,5);
05.
 digitalWrite(DATAPIN, inttobit(a,4);
06.
usw...
habe es mit dem Dateitype byte versucht, den kennt aber gcc nicht (oder ich mache etwas falsch).

oder Denke ich gerade in die völlig falsche Richtung?
Schonmal Danke für eine Antwort.
Mit freundlichen Grüßen
Power-Poler
Mitglied: rubberman
LÖSUNG 28.07.2016 um 19:32 Uhr
Hallo Power-Poler,

vielleicht verlinkst du mal auf eine Funktionsreferenz dieser digitalWrite() Funktion, die du nutzen möchtest. Irgendwie scheinst du tatsächlich Bit und Byte zu verwechseln. I.d.R. hat ein char eine Breite von 8 Bit, was in deinem Fall auch einem Byte entspricht. Einen separaten Datentyp kennt weder der C noch C++ Standard.
Das bitweise auseinanderdröseln einer Zahl machst du mit dem & Operator.
zahl & 1 für das niedrigste Bit
zahl & 2 für das zweitniedrigste Bit
zahl & 4 ...
...
zahl & 128 für das höchste Bit
... eben in Zweierpotenzen.

Grüße
rubberman
Bitte warten ..
Mitglied: pelzfrucht
28.07.2016 um 21:22 Uhr
Hi,

vielleicht verlinkst du mal auf eine Funktionsreferenz dieser digitalWrite() Funktion
Ich vermute mal es handelt sich um die digitalWrite Funktion der WiringPi API.

Soweit ich verstehe möchtest du ein Byte über einen Pin bitweise ausgeben.
Das funktioniert so nicht direkt, du müsstest dafür selber eine Funktion schreiben die dies tut.
digitalWrite() dient zum Schalten eines GPIO Pin und nicht zur (formatierten) Datenausgabe.

Du könntest eine Funktion schreiben die alle 8 Bits nacheinander auf dem Pin ausgibt. Beispiel:

I (6ms)
0 (6ms)
I (6ms)
I (6ms)
0 (6ms)
0 (6ms)
0 (6ms)
I (6ms)

(Der Byte und millisekunden Wert ist jetzt willkürlich gewählt, aber um das zu verdeutlichen )

Viele Grüße
pelzfrucht
Bitte warten ..
Mitglied: rubberman
28.07.2016 um 21:37 Uhr
Ich vermute mal
Ja, das könnte sein.

01.
void WRITE(int num)
02.
{
03.
  for (int i = 8; i; )
04.
    digitalWrite(DATAPIN, (num >> --i) & 1);
05.
}
Welche Möglichkeiten du auf dem Pi hast, um ein Delay von ein paar ms einzubauen, weiß ich nicht.

Grüße
rubberman
Bitte warten ..
Mitglied: pelzfrucht
28.07.2016 um 22:32 Uhr
Welche Möglichkeiten du auf dem Pi hast, um ein Delay von ein paar ms einzubauen, weiß ich nicht.

Ich schätze mal ganz normal

#include <unistd.h>
[...]
usleep(20*1000);

(20 mikrosekunden * 1000 = 20 millisekunden)

Viele Grüße
pelzfrucht
Bitte warten ..
Mitglied: rubberman
28.07.2016 um 23:14 Uhr
ganz normal
Joa, "ganz normal" wäre ANSI C. Das ist dann wohl eher POSIX

Grüße
ruberman
Bitte warten ..
Mitglied: pelzfrucht
28.07.2016 um 23:24 Uhr
Joa, "ganz normal" wäre ANSI C. Das ist dann wohl eher POSIX

Ups

Aber trifft in dem Fall trotzdem zu.

Er kann per sleep / usleep verzögern.
Alternativ kann er aber auf seine genutzte WiringPi API zurückgreifen. Dann wäre es:

01.
void delay (unsigned int howLong)
01.
void delayMicroseconds (unsigned int howLong)
Für Sekunden bzw. Mikrosekunden.

Viele Grüße
pelzfrucht
Bitte warten ..
Mitglied: Friemler
28.07.2016, aktualisiert 29.07.2016
[EDIT]

ACHTUNG!!!

Besser nicht verwenden. Siehe hier.

[/EDIT]


Hallo Power-Poler,

in C gibt es einige nettes Features, die für Dein Problem optimal geeignet sind: Bitfelder und Unions. Teste mal folgendes:

01.
typedef struct _bitfield
02.
{
03.
  unsigned int bit0: 1;
04.
  unsigned int bit1: 1;
05.
  unsigned int bit2: 1;
06.
  unsigned int bit3: 1;
07.
  unsigned int bit4: 1;
08.
  unsigned int bit5: 1;
09.
  unsigned int bit6: 1;
10.
  unsigned int bit7: 1;
11.
} bitfield;
12.

13.

14.
typedef union _serializer
15.
{
16.
  unsigned char byteValue;
17.
  bitfield      bitsValue;
18.
} serializer;
19.

20.

21.

22.
void WRITE(unsigned char byteValue)
23.
{
24.
  serializer s;
25.
  
26.
  s.byteValue = byteValue;
27.
  
28.
  digitalWrite(DATAPIN, s.bitsValue.bit0);
29.
  digitalWrite(DATAPIN, s.bitsValue.bit1);
30.
  digitalWrite(DATAPIN, s.bitsValue.bit2);
31.
  digitalWrite(DATAPIN, s.bitsValue.bit3);
32.
  digitalWrite(DATAPIN, s.bitsValue.bit4);
33.
  digitalWrite(DATAPIN, s.bitsValue.bit5);
34.
  digitalWrite(DATAPIN, s.bitsValue.bit6);
35.
  digitalWrite(DATAPIN, s.bitsValue.bit7);
36.
}

Gruß
Friemler
Bitte warten ..
Mitglied: rubberman
29.07.2016 um 00:49 Uhr
Hallo Friemler.

Bitfelder und Unions
Hab ich mir nicht getraut vorzuschlagen. Keine Ahnung in welcher Reihenfolge die Bits auf einem Pi im Speicher liegen ...

Grüße
rubberman
Bitte warten ..
Mitglied: Friemler
29.07.2016 um 08:28 Uhr
Moin rubberman,

hast Recht, Bitfelder sind auch eines dieser Desaster in C was die Portierbarkeit anbelangt. Da ich C nur für Hobbyzwecke auf der PC-Plattform verwende, verliere ich solche Dinge öfter aus dem Blick.

[OT]
@Frank: Ich wollte meinem obigen Posting eigentlich etwas mehr Text zur Erklärung hinzufügen, warum man den Code nicht benutzen sollte. Aber 14,28% Änderungsquote war beim Speichern schon wieder zu viel, da das Posting bereits von rubberman kommentiert wurde (da war doch schonmal was... ). Diese Schwelle finde ich viel zu niedrig, vor allem da es sich nur um eine Ergänzung des bestehenden Textes gehandelt hätte.
[/OT]

Gruß
Friemler
Bitte warten ..
Mitglied: Power-Poler
29.07.2016, aktualisiert um 09:30 Uhr
@rubberman

Vielen Dank. Genau so was habe ich gesucht. Macht genau was es soll.
Bitte warten ..
Mitglied: rubberman
29.07.2016 um 17:44 Uhr
Hallo Friemler

Bitfelder sind auch eines dieser Desaster in C was die Portierbarkeit anbelangt.
Das hat eigentlich nichts mit C zu tun, sondern mit der Implementierung auf dem jeweiligen OS.
Workaround wäre, die union mit byteValue 1 zu initialisieren und anschließend zu prüfen ob die 1 sich im höchsten oder im niedrigsten Bit wiederfindet.
Da ich C nur für Hobbyzwecke auf der PC-Plattform verwende
Da bist du nicht der einzige

Grüße
rubberman
Bitte warten ..
Ähnliche Inhalte
TK-Netze & Geräte

Auerswald Anzeige Status andere int. Teilnehmer

gelöst Frage von the-buccaneerTK-Netze & Geräte5 Kommentare

Hi! Gibt es in der Kombination Auerswald Compact 5200 und Comfortel 2600IP die Möglichkeit, den Status der Mitarbeiter direkt ...

Java

Methode um alle Kombinationen eines (int-)Arrays zu bestimmen - Optimierungsmöglichkeiten?

gelöst Frage von keb2308Java

Hallo, ich brauch eine Methode die einen Array als parameter nimmt und dann ein Array von Arrays aller Kombinationsmöglichkeiten ...

Neue Wissensbeiträge
Humor (lol)

Warum Linux in einer vernetzten Welt einfach keinen Komfort bietet!

Tipp von Snowbird vor 16 StundenHumor (lol)12 Kommentare

Ein interessanter Einblick warum Linux nichts für Geräteübergreifende Arbeit ist :)

Humor (lol)
Zuviel Speicher ist ungesund. :-)
Tipp von Lochkartenstanzer vor 1 TagHumor (lol)14 Kommentare

Moin Kollegen, Heute hatte ich ein ungewöhnliches Aha-Erlebnis: Über das Wochenende habe ich einen einen 6 Jahre alten Bare-Metal ...

Windows Update

KB4517297 verfügbar, behebt Fehler in VB6 VBA VBScript

Information von sabines vor 1 TagWindows Update

Das Update behebt mögliche Fehler in VB6, VBA und VBScript, die durch das Update KB4512486 vom August entstanden sind. ...

Viren und Trojaner

Staatstrojaner soll auch per Einbruch installiert werden können

Information von transocean vor 2 TagenViren und Trojaner5 Kommentare

Moin, Bundesinnenminister Horst Seehofer will dem Verfassungsschutz Wohnungseinbrüche erlauben, um den geplanten Staatstrojaner zu installieren. Gruß Uwe

Heiß diskutierte Inhalte
Hyper-V
Bei Neuaufbau auf Core-Server setzen?
gelöst Frage von dertowaHyper-V33 Kommentare

Hallo zusammen, ich habe vor einigen Monaten die Verantwortung für eine EDV-Landschaft übernommen die seit Jahren von einem Dienstleister ...

Router & Routing
Deinstalliertes Geräte wird in FritzBox noch immer als verbundenes Gerät angezeigt
Frage von imebroRouter & Routing14 Kommentare

Hallo, in meiner FritzBox 7490 wird im Bereich "Funknetz" ein Gereät bei den verbundenen Geräten angezeigt, wobei ich nicht ...

Humor (lol)
Zuviel Speicher ist ungesund. :-)
Tipp von LochkartenstanzerHumor (lol)14 Kommentare

Moin Kollegen, Heute hatte ich ein ungewöhnliches Aha-Erlebnis: Über das Wochenende habe ich einen einen 6 Jahre alten Bare-Metal ...

Batch & Shell
PowerShell - Text an HTMLbody übergeben mit UTF-8 Kodierung
Frage von Pat.batBatch & Shell13 Kommentare

Hallo zusammen, ich stoße momentan auf folgendes Problem. Ich möchte mit meinem Skript E-Mails versenden. Text und Signatur samt ...