Hi Leute, ich hab einen ATMEGA32 und bin grad an dem Versuch einzelnen POTPINS einzulesen. Hab schon sämtlich Varianten aus dem Form probiert, bin bisher aber leider nicht weitergekommen. Ich möchte PC0, PC1 & PC2 einlesen. Mein Code schaut dazu so aus: PORTC = 0xff; //Pullups aktivieren DDRC = 0x00; //als Eingang schalten . . . . Weiter unten in ner Funktion will ich nun den Status der o.g. Pins wissen, und das versuche ich so: int Px(void) { if (PC0=0) return1; //1 if (PC1=0) return2; //2 if (PC2=0) return3; //3 return0; } Die Returnwerte wählen dann verschiedene Cases in meinem switch an, wodurch einzelne Funktionen mit verschiedenen Programmabläufen gestartet werden sollen. Das Problem an der ganzen Geschichte ist, dass es mein Programmm nicht interessiert was für ein PCx auf 0 liegt, es wird immer der obenstehende Wert zurückgegeben. Vieln Dank für eure Hilfe, das komplette Programmm hab ich auch noch mit eigefügt. Thorsten
ich habe meine Funktion auch schon so geschrieben: int Px(void) { if (PORTC0<=0b01111111)return 1 ; if (PORTC1<=0b10111111)return 2 ; if (PORTC2<=0b11011111)return 3 ; return 0; } hat aber ebesowenig funktioniert :-(
PC0, PC1 und PC2 sind Makros, die eine Zahl zurückgeben (in der Reihenfolge 0, 1 und 2). Die sind in der Headerdatei definiert. Wenn Du einen Pin einlesen willst, musst Du schreiben
1 | if(PINC & (1 << PC0)) |
2 | {
|
3 | //Machwas
|
4 | }
|
5 | if(PINC & (1 << PC1)) |
6 | {
|
7 | //Machwasanderes
|
8 | }
|
...Und über PORTC liest Du nur den Zustand der Ausgangsstufen der Porttreiber ein. Das ist sicher nicht das, was Du willst.
schreib doch deine Funktion einfach so:
1 | #define PINMASK 0x07
|
2 | |
3 | int Px(void){ |
4 | return(PINC&PINMASK); |
5 | }
|
liefert 0 zurück wenn alle Pins 0 sind, 1 wenn PC0 an ist, 2 PC1 an, usw. ... nur so ne schnelle Idee!? Gruß Uwe
@Uwe: Um Himmels Willen, so was macht man doch nicht bei einer so elementaren Operation... Wenn überhaupt, dann mit einem Makro, das erzeugt wenigstens keinen unnötigen Overhead!
1 | #define PIN_READ(PORT,PIN) (PORT) & (1 << (PIN))
|
und dann
1 | if(PIN_READ(PINC, PC0)) |
2 | {
|
3 | //Machwas
|
4 | }
|
@jonny: =) war ja nur n Vorschlag ... ich würds auch über ein Makro machen aber Thorsten hatte ja den Ansatz mit der Funktion! Für seinen switch/case kann er auch einfach
1 | switch(PINC&PINMASK){ |
2 | case 0: |
3 | // tu bla wenn keine taste
|
4 | break; |
5 | case 1: |
6 | // tu blubber bei PC0
|
7 | break; |
8 | [...]
|
9 | default:
|
10 | // whatever;
|
11 | break; |
12 | }
|
schreiben! Ich wollt eigentlich nur die Möglichkeit mit ganzem Port und Bitmaske aufzeigen! greetz
Ich habe die Vorschläge mal soweit durchprobiert und sie funktionieren durchweg. Besten Dank.... Thorsten
...eine Frage hab ich aber noch, und zwar kann lt. Datenblatt PC4 nicht als I/O Port verwendet werden. Hat dies eine Auswirkung auf meinen return? Thorsten
Thorsten wrote: > ...eine Frage hab ich aber noch, und zwar kann lt. Datenblatt PC4 nicht > als I/O Port verwendet werden. Wieso soll PC4 nicht als I/O Port verwendet werden können?
> und zwar kann lt. Datenblatt PC4 nicht als I/O Port verwendet werden. Wo steht das denn? Solange das JTAG-Interface nicht aktiviert ist, ist PORTC.4 ein General Purpose I/O Pin wie die anderen auch. Das JTAG-Interface muss man dazu allerdings abschalten (JTAGEN-Fuse löschen, ist im Auslieferungszustand gesetzt).
ja, aber ich programmiere über JTAGICE MK2, dazu benötige ich dies doch, oder?!?
Dann hast Du da ein Problem. Das trifft aber dann nicht nur auf PORTC.4 zu sondern auch auf PORTC.2, 3 und 5.
so wie ich das Daenblatt lese hast du da vollkommen recht, aber diese Ports lassen sich komischerweise auf 5V bringen, auch die Änderungen an diesen Ports werden vollständig erkannt...
...so, um diesem Problem zu entgehn hab ich nun den PORTD verwendet. Vielen Dank nochmal für eure Unterstützung Thorsten
Thorsten wrote: > ja, aber ich programmiere über JTAGICE MK2, dazu benötige ich dies doch, > oder?!? Nur zum Programmieren, nicht zum Laufenlassen der Applikation. (Hinweis: du kannst das JTAG-Interface zur Laufzweit mit dem JTD-Bit abschalten.) <nitpickmode>Du kannst mit dem JTAG ICE mkII auch via ISP programmieren.</nitpickmode> ;-)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.