Bis jetzt mache ich glaube ich gute Fortschritte
die Originalzeile habe ich immer Auskommentiert und darunter die Neue Zeile mit dem Variablem Port Bezeichnung geätzt.
das ist der Bisherige Code:
#include "math.h"
unsigned long temp_millis;
void setup()
{
Serial.begin(9600); // Seriele Einstellungen
}
void loop()
{
float Ergebnis_Schieber = NAN;
// while ( isnan(Ergebnis_Schieber) ) { Ergebnis_Schieber = Schieber(); } // Schieber abfragen
while ( isnan(Ergebnis_Schieber) ) { Ergebnis_Schieber = Schieber(&PINA, PA0, PA1); } // Schieber abfragen
Serial.println(Ergebnis_Schieber); // Schieber Wert ausgeben
} // ENDE --> void loop
// float Schieber()
float Schieber(volatile byte* port, byte clock, byte data)
{
int Schieber_5_ClockPin = 22; // Pin 22 das 0. Bit vom Port A (PINA PA0)
int Schieber_5_DataPin = 23; // Pin 23 das 1. Bit vom Port A (PINA PA1)
pinMode(Schieber_5_ClockPin, INPUT);
pinMode(Schieber_5_DataPin, INPUT);
// while (digitalRead(Schieber_5_ClockPin) == LOW) {} // wenn CLOCK auf LOW, dann warten bis wieder HIGH
while ( !(*port & (1 << clock)) ) {} // wenn CLOCK auf LOW, dann warten bis wieder HIGH
temp_millis = millis(); // aktuelle Zeitnahme
// while (digitalRead(Schieber_5_ClockPin) == HIGH) {} // wenn CLOCK auf HIGH, warten bis wieder LOW
while ( *port & (1 << clock) ) {} // wenn CLOCK auf HIGH, warten bis wieder LOW
if ((millis() - temp_millis) > 100) // wenn High-Pegel länger wie 100ms war, springe in 'decode' Funktion
{
long value = 0;
byte SIGN_Bit = 0; // Vorzeichen Bit 21
for (int i=0;i<24;i++) // 24 Durchläufe, 0 bis 23
{
// if ( PINA & ( 1 << PA1 )) // wenn Data (Port.A Bit.1) HIGH ist,
if ( *port & ( 1 << data )) // wenn Data (Port.A Bit.1) HIGH ist,
{ // eine 1 in die Variable 'value' an Bitnummer i
value |= 1UL << i; // Syntax Hinweis aus dem Forum, wegen default 16 bit int Arithmetik
}
// while ( !(PINA & (1 << PA0))) { } // solange warten bis Clock (Port.A Bit.0) wieder HIGH ist
while ( !(*port & (1 << clock))) { } // solange warten bis Clock (Port.A Bit.0) wieder HIGH ist
// while ( PINA & (1 << PA0 )) { } // solange warten bis Clock (Port.A Bit.0) wieder LOW ist
while ( *port & (1 << clock )) { } // solange warten bis Clock (Port.A Bit.0) wieder LOW ist
} // ENDE --> for Schleife
SIGN_Bit = (value >> 21) & B01; // Vorzeichen Bit 21 separieren
value = value & 0xFFFF; // nur Bit 0 bis Bit 15 behalten, den Rest davor nullen
value = value >> 1; // und alles um ein Bit nach rechts schieben, Startsignal wird entfernt
if (SIGN_Bit == 1) // wenn Vorzeichen-Bit gesetzt war, alles mit -1 multiplizieren
{ value = value * -1; }
return (float)value / 100; // Kommastelle setzen und man erhält den endgültigen Meßwert (Rückgabe wert)
}
return NAN; // Fehlerwert ausgeben
} // ENDE --> Schieber
ich möchte jetzt aber noch den teil:
int Schieber_5_ClockPin = 22; // Pin 22 das 0. Bit vom Port A (PINA PA0)
int Schieber_5_DataPin = 23; // Pin 23 das 1. Bit vom Port A (PINA PA1)
pinMode(Schieber_5_ClockPin, INPUT);
pinMode(Schieber_5_DataPin, INPUT);
über die Register Sätzen.
Das müsste dann das Register DDRx sein.
und ich muss dann also
*port & clock = 0;
machen?
doch das macht eine Fehlermeldung, ... die Frage ist wie kann ich das Bit Sätzen?
ich dachte ich rufe das Register mit den Registerbit auf und sage das das Gleich 0 für Eingang ist.