PORTD als Ausgang auslesen und Zustand anzeigen

Hallo Leute!

Ich bin dabei ein Programm zu schreiben, welches 6 Lichtschranken simulieren soll.
Hierzu arbeite ich mit 6 digitalen Ausgängen von PORTD.
Bei HIGH ist die Lichtschranke geschlossen bei LOW unterbrochen.
Hier kurz ein Auschnitt aus dem Programm:

#include <avr/io.h>

void setup()
  {
   
  DDRD = DDRD | B11111100; // D7;D6;D5;D4;D3;D2; als Ausgänge D1;D0 als 
                           // Eingang
  }

// 
void loop()
  {

    
PORTD = B00000000; // Contact -2 D7 bis D2 auf LOW für 348ms
  delay(348);  
 
PORTD = B11111100; // Flight -2 Pin D7 bis D2 auf HIGH für 1700ms
  delay(1700);
  
PORTD = B00000000; // Contact -1 D7 bis D2 auf LOW für 358ms
  delay(358);
PORTD = B11111100; // Flight -1 D7 bis D2 auf HIGH für 1800ms
  delay(1800);

PORTD = B00000000; // Contact 0 D7 bis D2 auf LOW für 353ms
  delay(353);

PORTD = B11111100; // Flight 0 D7 bis D2 auf HIGH für 1740ms
  delay(1740);
PORTD = B00011100; // Flight 0 D7 bis D5 auf LOW & D4 bis D2 auf HIGH für
   delay(10);      // weitere 10ms

usw. usw.

Jetzt möchte ich den momentanten Zustand der Ausgänge im serielen Monitor anzeigen lassen. AM besten wäre es, wenn man noch die Zeit angezeigt bekommt, wie lange ein Zustand (HIGH, LOW) anhält.

Ich stelle mir das so vor:

11111100 -- 1740ms
00011100 -- 10ms
.
.
.

Leider habe ich keinen blassen schimmer wie man das anstellen kann...
über jeden Hinweis wäre ich sehr dankbar.

Beste Grüße,

curverer

Hallo,

du kannst den Port bzw. Pins auch wieder einlesen, auch wenn es ein Ausgang ist. Die Zeit merkst du dir jeweils mit millis() und rechnest die Differenzen aus.

und google mal nach "arduino cheat sheet"
+

+

+
die Referenz hier auf der Seite unter Learning

Wenn alles Ausgänge sind, dann weißt Du doch, wie Du sie gesetzt hast, und wie lange?

Irgendwie errinnert mich das an den Ostfriesen, der das Licht mit dem Hammer ausmacht, und dann mit der Taschenlampe nachschaut, ob es tatsächlich aus ist :wink:

Zum Einlesen ist PINx besser geeignet als PORTx, das liefert den Zustand der Pins, nicht den des Port-Registers.

Also kann ich den Zustand z.B. so auslesen und im seriellen Monitor anzeigen.

for(byte j = 7;j > 1;j--)
  Serial.print(PIND & bit(j) ? 1 : 0);
Serial.println();

Das mit den millis(); verstehe ich nicht so richtig^^

Ich selber weiß ja wie ich die Ausgänge setze.
Nur muss ich jemandem zeigen, das sich die Zustände der Ausgänge tatsächlich in der vorgegebenen Zeit ändern.

Vielen Dank und besten Gruß,

curverer

Hallo,

du fängst gleich mit Bitmanipulation an? Aha. Na gut.

Wie millis() genau funktioniert mußte selbst herausfinden. Das ist Hausaufgabe. :slight_smile: Das Netz ist voll davon.
Zudem deine delays bekannt sind, was willste da rechnen?

void setup()
  {
  Serial.begin(9600); 
  DDRD = B11111100; // D7;D6;D5;D4;D3;D2; als Ausgänge D1;D0 als
                           // Eingang
  }

//
void loop()  {

PORTD = B00000000; // Contact -2 D7 bis D2 auf LOW für 348ms
read_PortD();
delay(348); 
 
PORTD = B11111100; // Flight -2 Pin D7 bis D2 auf HIGH für 1700ms
read_PortD();
delay(1700);
 
PORTD = B00000000; // Contact -1 D7 bis D2 auf LOW für 358ms
read_PortD();
delay(358);

PORTD = B11111100; // Flight -1 D7 bis D2 auf HIGH für 1800ms
read_PortD();
delay(1800);

PORTD = B00000000; // Contact 0 D7 bis D2 auf LOW für 353ms
read_PortD();
delay(353);

PORTD = B11111100; // Flight 0 D7 bis D2 auf HIGH für 1740ms
read_PortD();
delay(1740);

PORTD = B00011100; // Flight 0 D7 bis D5 auf LOW & D4 bis D2 auf HIGH für
read_PortD();
delay(10);      // weitere 10ms     

}


void read_PortD ()  {   
  byte Bits = PIND;  
  Serial.print(F("Port.D ")); 
  for (int i=7;i>=0;i--) Serial.print(bitRead(Bits,i));   // Danke an jurs  :-)
  Serial.print(F("\t millis ")); Serial.println( millis() );
  
}

curverer:
Ich selber weiß ja wie ich die Ausgänge setze.
Nur muss ich jemandem zeigen, das sich die Zustände der Ausgänge tatsächlich in der vorgegebenen Zeit ändern.

Du arbeitest nicht zufällig für VW? :wink:

Aber Du hast mein volles Mitgefühl, wenn der Auftraggeber bzw. Chef keine Ahnung von der Materie hat. Sonst wüßte er, daß man das zeitliche Verhalten von Signalen nicht mit Software bestimmen kann, die genau dieses zeitliche Verhalten ändert, wenn sie auf dem gleichen single-threaded Prozessor läuft :frowning:

Was Dein Chef braucht ist ein Logikanalysator, der die Signale an den Ausgängen darstellt, ohne in das Programm einzugreifen. Und selbst wenn Du hier Dein eigener Chef bist, empfiehlt sich so eine Anschaffung auf jeden Fall, denn es dürfte nicht bei diesem einen Fall bleiben, wo der nützlich ist. Damit kannst Du ja auch Dein Programm so hintrimmen, das das Timing den Anforderungen entspricht, was insbesondere bei Verwendung von delay() und Serial.print nicht unbedingt garantiert werden kann.