Port Byteweise abfragen JO-IT-Mega r3

Hallo zusammen,

Ich versuche meinen Scetch zu beschleunigen für eine schnellere Portausgabe.
Vorerst geht es um die Eingänge.
Dazu frage ich mit PORTA .. PORTF die Ports Byteweise ab, bekomme aber als Rückgabewert immer eine 0.
Die Pins 8 bis 13 sollten PORTB entsprechen.

//# include "iomxx0_1.h" //fehler beim compilieren           
void setup() 
{
  // Pins als OUTPUT=1 als Input=O definieren  
  DDRA = B00000000;
  DDRB = B00000000;
  DDRC = B00000000;
  DDRD = B00000000;
  DDRE = B00000000;
  DDRF = B00000000;
  PORTC = B11111111;
  Serial.begin(115200);
}
void loop()
{
Serial.print("Port A.");
Serial.println(PORTA);  
Serial.print("Port B.");
Serial.println(PORTB);
Serial.print("Port C.");
Serial.println(PORTC);
Serial.print("Port D.");
Serial.println(PORTD);
Serial.print("Port E.");
Serial.println(PORTE);
Serial.print("Port F.");
Serial.println(PORTF);
delay(88);

Hardware ist O.K. Serial.println(digitalRead(8)); liefert mir korrekt 1 oder 0.

Wenn ich einmalig PORTC = B11111111; schreibe kommt wie erwartet der Wert 255 zurück, dieser wird auch nicht mehr überschrieben.

"Go to Definition" von PORTB führt mich zur iomxx0_1.h. sollte auch passen.

Sieht eigentlich ganz easy aus, was übersehe ich da.
Kann es sein das der Joy-It nicht kompatibel ist?

Gruß Tin-ber

Dummer weise sagst du nicht, wie du testest!

Du möchtest PINA lesen, und nicht PORTA

Das ist unnötig!

Ist es auch.

Das Datenblatt!

Hihihihi .....

Ich Frage die PORT A bis F Byteweise ab um die Eingänge 8 und 9 zu identifizieren.
Nachdem es Hardwareseitig passt sollte doch einer davon ein Ergebnis ungleich Null liefern.

Auch wenn ich mich wiederhole: Das ist falsch!

In den PORTx Registern findest du nur die gesetzten Pullup

Oha
Wie muss ich dann vorgehen?

Darauf ist die Antwort einfach!

  1. Datenblatt lesen, solange, bis der Groschen fällt
  2. Meinem Posting #2 glauben schenken

Im Mega Datenblatt bin ich nicht wirklich fündig geworden bzw. Bahnhof verstanden.
Was genau soll ich zum testen beschreiben?

Sachte ich doch schon:

Das gilt natürlich für alle Ports!

Three I/O memory address locations are allocated for each port, one each for the Data Register – PORTx, Data
Direction Register – DDRx, and the Port Input Pins – PINx. The Port Input Pins I/O location is read only, while the
Data Register and the Data Direction Register are read/write. However, writing a logic one to a bit in the PINx Register, will result in a toggle in the corresponding bit in the Data Register

Dieses: https://ww1.microchip.com/downloads/en/devicedoc/atmel-2549-8-bit-avr-microcontroller-atmega640-1280-1281-2560-2561_datasheet.pdf
So oft lesen, bis es sitzt.

Sorry bin neu in dieser Welt. Im Datenblatt muss man schon einiges Vorwissen haben um da klarzukommen.

Du meinst PIN lesen, dann bin ich mit PORTA mit einem Denkfehler eingestiegen.
Kannst du mir sagen wie ich vorgehen kann um die Pins 8 und 9 zu bekommen.

Wenn du auf Hardwareebene arbeiten willst, musst du wohl das Datenblatt lesen lernen.
Die einzige Alternative wäre wohl eine Library nutzen, welche den LowLevel Kram für dich erledigt.

Wo ist da dein Problem?

Mein Problem ist einen für mich verständlichen Ansatz zu finden.
Geht PORTA nicht über eine Library
iomxx0_1.h

Verstehe ich nicht!

PINx lesen, und mit der richtigen Bitmaske verodern

Verodern? Nee, verunden!

Danke dir
Werde mich daran versuchen….

Darf ich verUNDen vorschlagen?

Du darfst

Ja!

Warum?

Manchmal kann man das gebrauchen.

  1. es kann/wird Speicher sparen (wenn man es richtig macht)
  2. ca. Faktor 20 bis 30 kann man an Geschwindigkeit raus holen

Hier mal ein Test für meine Lib:

#include <CombiePin.h>

using Out = Combie::Pin::OutputPin<8>;

int main(void) 
{
   Out{}.init();
   for(;;) Out{}.toggle(); // 2,66Mhz mit einem UNO
}

Der Sketch verwendet 140 Bytes (0%) des Programmspeicherplatzes. Das Maximum sind 32256 Bytes.
Globale Variablen verwenden 0 Bytes (0%) des dynamischen Speichers, 2048 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.

Die 140 Bytes Bytes sind übrigens zu größten Teil die Interrupt Tabelle

Vielleicht hilft dir ja folgende Abhandlung weiter....

Lese sie ganz. Zu deiner speziellen Frage wirst du aber im Abschnitt "Eingänge (Wie kommen Signale in den µC)" fündig.

https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial

Es geht um einen Phsenanschnittdimmer, funktioniert soweit gut.
Nur die Regelung ist mir zu sprunghaft, ich arbeite mit Micros am Ausgang sehe ich die Änderung eher in Milli schritten.