Forum: Mikrocontroller und Digitale Elektronik PINs abfragen,negieren (Anfänger)


von Danken (Gast)


Lesenswert?

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.

: Gesperrt durch User
von jonas (Gast)


Lesenswert?

mach einfach immer xor mit 1.

von Johannes M. (johnny-m)


Lesenswert?


von Jochen M. (taschenbuch)


Lesenswert?

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

von Latissimo (Gast)


Lesenswert?

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?

von Niels H. (monarch35)


Lesenswert?

Latissimo wrote:


> while(1)
> {
>    if(PORTA.x) { ... }  //wenn Pin(zb. Taster) High ist, dann ...
>    else { ..... }         //sonst .....
> }

*MOEP!* Falsch!

Bitte konsultieren sie umgehend das GCC-Tutorial.

von Latissimo (Gast)


Lesenswert?

was soll falsch sein???

von Niels H. (monarch35)


Lesenswert?

Latissimo wrote:
> was soll falsch sein???

Die Antwort auf diese Frage findest du im besagten GCC-Tutorial.

von Johannes M. (johnny-m)


Lesenswert?

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!)...

von Niels H. (monarch35)


Lesenswert?

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.

von Stefan E. (sternst)


Lesenswert?

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 Latissimo (Gast)


Lesenswert?

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....

von Johannes M. (johnny-m)


Lesenswert?

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!

von robby (Gast)


Lesenswert?

Verweist bitte nicht immer.nur auf das tutorial. Als praxisorientierter 
einsteiger ist das ganze immernoch zu unverständlich.

von wendelsberg (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.