PORTPIN einlesen

Gast #532369
Lesenswert?
• ▲
▼
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
Angehängte Dateien:
Gast #532380
Lesenswert?
• ▲
▼
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 :-(
Gast #532381
Lesenswert?
• ▲
▼
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
}
Gast #532416
Lesenswert?
• ▲
▼
@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
}
#532450
Lesenswert?
• ▲
▼
@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
Gast #532503
Lesenswert?
• ▲
▼
> 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).

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.