2017-09-27 5 views
0

Mit dem Register eines Arduino Mega 2560, versuche ich, die Informationen der PORTA zu greifen. Ich habe mich auf die datasheet (Seiten 69-72) bezogen und verstanden, dass ich dafür PINxn (PINA) verwenden muss. Aber alles, was ich bekomme, ist 0 als Ausgabe. Ich habe den Pin an eine LED angeschlossen.Nicht in der Lage, den PIN-Wert von Arduino Mega mit PINxn zu lesen

Der Code und der Ausgang werden unten erwähnt.

CODE

#define F_CPU 16000000 
#include <avr/io.h> 

int main(void) { 
    DDRA = (1 << DDA0); // sets the pin OUTPUT 
    __asm__("nop\n\t"); 
    PORTA = 0x01; // Sets it HIGH 
    unsigned int i = PINA; 
    Serial.println(i); 
} 

OUTPUT

0 

Vielen Dank im Voraus für Ihre Zeit - wenn ich verpasst habe aus etwas, Über- oder Unter betonte ein bestimmter Punkt mich in den Kommentaren wissen lassen .

+1

Sie benutzen den Pin als Eingang, zumindest nehme ich an, dass DDRA = (1 << DDA0); Was erwartest du mit 'PORTA = 0x01;'? Ich würde mich nicht wundern, wenn der Wert von 'PINA' das Ausmaß der Volatilität widerspiegelt, die von außen auf diesen Pin angewendet wird, ohne Einfluss darauf, was Sie zuvor in dieses Bit geschrieben haben. Bitte erläutern Sie im Detail jede Ihrer Codezeilen, also was Sie denken und was die Dokumentation sagt. – Yunnosch

+0

Und beschreiben Sie, was Sie mit dem physischen Pin machen. Masse auftragen, frei schwebend, Spannung anlegen, eine Art Peripherie anschließen. Welche Spannung messen Sie mit einem Multimeter? – Yunnosch

+0

Wie soll 'DDA0' verwendet werden? Ist es eine Bitposition, Wert 0? Das scheint mit deinem Code übereinzustimmen. Aber könnte es eine Maske sein, Wert 1? Das könnte dazu führen, dass Ihre Code-Einstellung Bit-Position 1 zum Lesen und unabhängig davon, welche Ebene der Pin sieht, nicht in PINA übergeht. – Yunnosch

Antwort

1

Wenn Sie den zuvor ausgegebenen Wert zurücklesen möchten, empfehle ich, ihn aus dem Register zu lesen, in das Sie geschrieben haben, d. H. PORTA.

jedoch nach versehen Doku (fett von mir):

13.2.4 Unabhängigen der Einstellung von Datenrichtung Bit DDxn, die Port-Pin kann durch das Bit PINxn Register gelesen werden.

Eine mögliche Erklärung für das Lesen der alten Wert zurück, sofort nach ein anderes schreiben, ist wohl die kurz im gleichen Kapitel folgenden Teil:

PINxn Register Bit und dem vorhergehenden Riegel Synchronizer bilden . Dies ist erforderlich, um Metastabilität zu vermeiden, wenn der physische Pin den Wert in der Nähe der Flanke des internen Takts ändert, aber es führt auch ein Verzögerung.

Also müssen Sie diese Verzögerung berücksichtigen.
Sehen Sie sich Timing-Funktionen an, die z. nach verfügbaren Bibliotheken und nach verfügbarer Timer-Hardware.
Aber als Proof of Concept, schlage ich vor, von

  • Druck der Wert PINAvor Schreiben der invertierten Wert
  • schreiben den invertierten Wert zu PORTA (inverted nur das entsprechende Bit natürlich) zu demonstrieren
  • lesen und den Wert von PINAdanach (in der Hoffnung, dass Ihr Kopf volatile hier verwendet) gedruckt wird oft (etwa 1000)

Ich erwarte, dass Sie einige alte Werte sehen werden, aber dann den neuen Wert.

Je nachdem, wie der Druckvorgang ausgeführt wird (busy waiting?), Kann es einmal ausreichen.
Ihr NOP (__asm__("nop\n\t");) könnte entworfen werden, um die entsprechende Wartezeit zu erfüllen.Aber ich denke, es ist fehl am Platz (sollte nach dem Schreiben neuer Wert sein) und es könnte zu kurz sein. Wenn es von Beispielcode ist, sollte es ausreichen. Bewege es und mach es vielleicht zweimal, um es beim ersten Versuch zu versuchen. Das ist wahrscheinlich effektiv.

0

Sie sollten den "nop" zwischen die "PORTA =" Zuweisung und "PINA" lesen. Da der Befehl zum Schreiben in das PORTx-Register den Status der Ausgangspins gerade am Ende des Systemtaktzyklus an der ansteigenden Flanke des Taktgenerators aktualisiert, gibt das Lesen aus dem PINx-Register Informationen zurück, die in einem Zwischenpuffer zwischengespeichert sind. Der Puffer verriegelt bei Mitte (d. H. Bei der abfallenden Flanke des Taktgenerators) des vorherigen-Taktzyklus.

So wird das Lesen von der PINx immer für 0,5 bis 1,5 Taktzyklen verzögert. Wenn sich der Logikpegel in einem Systemtakt unmittelbar vor der Mitte (d. H. Vor der fallenden Flanke des Taktgenerators) ändert, wird dieser Wert sofort zwischengespeichert und zum Lesen durch das Lesen des PINx-Registers beim nächsten Systemtaktzyklus verfügbar. Somit beträgt die Verzögerung 0,5 Zyklen. Wenn sich der Logikpegel unmittelbar nach diesem Sperrmoment ändert, wird er nur im nächsten Zyklus zwischengespeichert und steht danach im nächsten Zyklus zum Lesen bereit, wodurch die Verzögerung von 1,5 eingeführt wird Zyklen

Das Schreiben in das PORTx-Register aktualisiert den Ausgangswert am Ende des Taktzyklus, so dass es nur im nächsten Zyklus zwischengespeichert wird und erst danach im nächsten Zyklus zum Lesen verfügbar ist.

Der C-Compiler für optimizaion ziemlich gut, so, zwei aufeinander folgende Linien mit PORTA Zuordnung und PINA Lesung wurden nur zwei aufeinander folgende aus PORTA zusammengestellt, rxx und in ryy, PINA Anweisungen, die diesen Effekt verursachen

Verwandte Themen