Go Down

Topic: Frage: Direkte Port Manipulation (Read 1 time) previous topic - next topic

michael_x

PINA=(PINA & (1<< PA7)); // löscht alles bis auf Bit 7

ist sicher nicht was du willst.
Deiner Beschreibung nach willst du ein Stück Draht *) simulieren

PORTA = PORTA << 7; // wenn alle anderen Bits gelöscht werden können. Bit 7 enthält danach den Zustand von Bit 0.
oder etwas langsamer:
PORTA = PORTA & ~(1<<PA7) ) | PORTA << 7; // wenn die anderen Bits erhalten bleiben müssen

Wenn es nicht von Bit 0 nach 7 ginge, wäre noch etwas mehr Bitmaskiererei erforderlich.

Das hat jetzt nichts mit einem 1.5MHz Takt zu tun, oder willst du eigentlich was in der Richtung ?



*) Je nach den Umständen könntest du diesen Code auch durch ein Stück Draht, eine Diode oder irgend einen Logik-IC ersetzen

DANINO24

ich will folgendes programm mit direkter port manupilation umsetzen:

Code: [Select]
int testeingang=29;
int testausgang = 22;

void setup(){
pinmode(testeingang,input);
pinmode(testausgang,output);
}

void loop(){
digitalwrite(testausgang,digitalread(testeingang);


Wäre für jede hilfe sehr dankbar :-]

MaFu

Ich würds bei Pin 52 und 36 lassen, da sparst Du die Bitschieberei.
Code: [Select]
// Pin 52 = Port B Bit 1
// Pin 36 = Port C Bit 1

void setup()
{
 // Setzt Pin 52 als INPUT
 DDRB = DDRB & B11111101;

 // Setzt Pin 36 als OUTPUT
 DDRC = DDRC | B00000010;
}

void loop()
{
 // Lese Pin 52 und Schreibe den Wert nach Pin 36
 PORTC = (PORTC & B11111101) | (PINB & B00000010);
}
_______
Manfred

michael_x

Wie schnell ist denn nun
Code: [Select]

void setup(){

pinMode(13,OUTPUT); // for speed indication

DDRA &= ~(1<<PA7);
DDRA|=(1<<PA0);
}

void loop() {
 unsigned long timsignal;
 static boolean blinkstate;
 PORTA = PORTA << 7;
 if (timsignal++ >= 1500000UL) {
     timsignal = 0;
     blinkstate = !binkstate;
     digitalWrite(13,blinkstate);
 }
}


?

Wenn eine LED an Pin 13 schneller als mit 0.5 Hz (1 sec an, 1 sec aus) blinkt, wäre deine Geschwindigkeitsanforderung 1.5 MHz erfüllt ?

DANINO24

Das hört sich perfekt an, danke! Werde es morgen mal testen....


Ich würds bei Pin 52 und 36 lassen, da sparst Du die Bitschieberei.
Code: [Select]
// Pin 52 = Port B Bit 1
// Pin 36 = Port C Bit 1

void setup()
{
 // Setzt Pin 52 als INPUT
 DDRB = DDRB & B11111101;

 // Setzt Pin 36 als OUTPUT
 DDRC = DDRC | B00000010;
}

void loop()
{
 // Lese Pin 52 und Schreibe den Wert nach Pin 36
 PORTC = (PORTC & B11111101) | (PINB & B00000010);
}



Jetzt zum Hintergrund:

Ich habe als Input ein Taktsignal, das ca. 1,5 MHz schnell ist. Jetzt wollte ich schauen ob mein Arduino Board schnell genug ist dieses Signal zu verarbeiten. Sprich Taktsignal lesen und auf einen anderen Pin schreiben. Den Pin dann mit einem Oszilloskop betrachten und schauen, ob ich da auch 1,5 MHz erhalten.

Go Up