Habe eine kleine C programmiertechnische Frage.
Ich will jedesmal wenn in eine overflow Interuptroutine gesprungen wird
einen bestimmten Pin eines Ports negieren.(So das ein Rechteck an diesen
Pin mit einer bestimmten Frequenz entsteht). Habe es schonmal so
probiert
ISR{~(PORTD,PD1);} funktioniert leider nicht. Dazu würde ich auch gerne
wissen wie ich einen Zustand eines Pins auslese.
Vielen dank im vornherein.
Hallo Danken,
Folgende Möglichkeiten, für AVRs:
1) den Bitzustand in einer Variablen merken, manuell toggeln und wieder
zum Port schreiben.
2) den Bitstatus vom Port auslesen, mit PINx, nicht mit PORTx wie in
Deinem Beispiel (das ist dann auch Dein Fehler), toggle und
zurückschreiben.
3) Bei den aktuellen AVRS kannst du noch einen anderen, geilen Trick
machen, nämlich eine 1 in PINx,? schreiben. Jedes Schreiben einer 1
kippt den Ausgang von 0->1 bzw. 1->0. Das ist "offiziell" so möglich,
also kein dirty-Trick. Steht so im Datenblatt.
Jochen Müller
Pin toggeln:
while(1)
{
PORTA.x = (!PORTA.x);
}
Pin auslesen(Polling)
while(1)
{
if(PORTA.x) { ... } //wenn Pin(zb. Taster) High ist, dann ...
else { ..... } //sonst .....
}
Hierbei würde ein drücken des Tasters ... bewirken. Ein loslassen
bewirkt dann ein .....
Das dauerhafte Abfragen eines PORTS ist Polling. Normalerweise würde man
das über einen Interrupt abfragen, der per steigender/fallender Flanke
am Pin entsteht.
Bedenke: wenn du einen Digitalen I/O Pin benutzt, ist dieser noch nicht
als I bzw. O deklariert. Das musst du dann im entsprechenden
Tristate-Register tun. zb. TRISA = 0b.0000.0000;//alle Portpins auf
Ausgang
Noch was: Wenn ein Port Pins besitzt, die als "Analog-Pins" dienen
können, musst du den Pin sowieso erst mal auf "Digital" stellen.
Das Register dazu könnte ANSEL heißen.(analog-select)
Dein Datasheet vom MCU gibt dir Aufschluss!
also: auf Einmalig auf digital stellen, auf aus/eingang stellen, dann
erst benutzen!!!
noch ne Frage?
Latissimo wrote:
> was soll falsch sein???
Hat Jochen Müller oben schon vor Deinem Posting geschrieben: PINx
einlesen und nicht PORTx. Außerdem sind die REGISTER.BIT-Schreibweisen
nicht C-Standard und werden nur von einigen kommerziellen
Embedded-C-Compilern unterstützt (und nicht vom AVR-GCC!)...
Johannes M. wrote:
>> was soll falsch sein???> Hat Jochen Müller oben schon vor Deinem Posting geschrieben: *PINx*grummel muss immer alles Vorgekaut werden? Die Leute können lesen;
sollte man zumindest meinen!
Sorry, für den etwas harschen Tonfall. Ist aber nicht bös gemeint.
Latissimo hat seine Antwort weder auf eine bestimmte MCU, noch auf einen
bestimmten Compiler bezogen. Hat der OP ja auch beides nicht genannt.
Insofern war seine Antwort im durch die Frage gesetzten Rahmen völlig
korrekt.
"ISR{~(PORTD,PD1);}" lässt zwar vermuten, dass es AVR und GCC ist, muss
es aber nicht zwangsläufig sein.
zur Rechtfertigung:
Wo im Thread steht was von GCC? und wo im Thread steht was vom
verwendeten Controller? Ich hab allgemein geantwortet!
Das steht nur in den Antworten von Antwortenden ;)
Aber du hattest ja Recht habe gerade was tum pins toggeln via GCC mit
nem atmel gefunden....
Stefan Ernst wrote:
> Latissimo hat seine Antwort weder auf eine bestimmte MCU, noch auf einen> bestimmten Compiler bezogen. Hat der OP ja auch beides nicht genannt.> Insofern war seine Antwort im durch die Frage gesetzten Rahmen völlig> korrekt.> "ISR{~(PORTD,PD1);}" lässt zwar vermuten, dass es AVR und GCC ist, muss> es aber nicht zwangsläufig sein.
Von der Annahme bin ich ausgegangen, und gerade bei AVRs ist es eben so.
Niels Hüsken wrote:
> grummel muss immer alles Vorgekaut werden? Die Leute können lesen;> sollte man zumindest meinen!
Tja, das Problem ist, dass eben jener Latissimo versucht hat, alles
vorzukauen, aber eben nicht ganz korrekt (wenn man mal vom AVR ausgeht,
s.o.). Sollte von meiner Seite nur Schadensbegrenzung sein... Und eben
wegen "Die Leute können lesen (sollte man meinen)" habe ich oben auch
zunächst nur die Links zu den Stellen gepostet, wo alles steht, für den
Fall, dass der OP das noch nicht gefunden hatte... Schließlich sind die
Tutorials genau dazu da, damit hier im Forum nicht jeder Sch*** jeden
Tag dreimal neu geschrieben werden muss!
Da genau das passiert ist:
>Die Abfrage der Zustände der Portpins erfolgt direkt über den >Registernamen.>Dabei ist wichtig, zur Abfrage der Eingänge nicht etwa Portregister PORTx>zu verwenden, sondern Eingangsregister PINx. Ansonsten liest man nicht>den Zustand der Eingänge, sondern den Status der internen Pull-Up->Widerstände. Die Abfrage der Pinzustände über PORTx statt PINx ist ein>häufiger Fehler beim AVR-"Erstkontakt".
liegt die Vermutung nahe, dass er das Tutorial nicht gelesen hat.
Und damit ist aus meiner Sicht jedes Gegrummel mehr als gerechtfertigt.
Frueher haette er nur ein kurzes RTFM bekommen.
robby schrieb:> Als praxisorientierter> einsteiger ist das ganze immernoch zu unverständlich.
Was ist daran unverstaendlich?
wendelsberg
Bitte bedenkt, dass der Thread aus dem Jahre 2008 ist.
Es hat keinen Sinn, da jetzt weiter zu schreiben.
robby, wenn du ein Problem hast, dann stell eine Frage. Aber grab nicht
himmel alte Threads aus, nur um festzustellen, dass du auch nicht
Tutorial lesen willst.