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
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: > while(1) > { > if(PORTA.x) { ... } //wenn Pin(zb. Taster) High ist, dann ... > else { ..... } //sonst ..... > } *MOEP!* Falsch! Bitte konsultieren sie umgehend das GCC-Tutorial.
Latissimo wrote:
> was soll falsch sein???
Die Antwort auf diese Frage findest du im besagten GCC-Tutorial.
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!
Verweist bitte nicht immer.nur auf das tutorial. Als praxisorientierter einsteiger ist das ganze immernoch zu unverständlich.
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.