mikrocontroller.net

Forum: Compiler & IDEs PORTPIN einlesen


Autor: Thorsten (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Thorsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :-(

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
if(PINC & (1 << PC0)) 
{
//Machwas
}
if(PINC & (1 << PC1))
{
//Machwasanderes
}

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...Und über PORTC liest Du nur den Zustand der Ausgangsstufen der 
Porttreiber ein. Das ist sicher nicht das, was Du willst.

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach, noch was: Das steht alles im AVR-GCC-Tutorial...

Autor: Uwe M. (lifthrasil)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
schreib doch deine Funktion einfach so:
#define PINMASK 0x07

int Px(void){
   return(PINC&PINMASK);
}

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

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!
#define PIN_READ(PORT,PIN) (PORT) & (1 << (PIN))
und dann
if(PIN_READ(PINC, PC0))
{
//Machwas
}

Autor: Uwe M. (lifthrasil)
Datum:

Bewertung
0 lesenswert
nicht 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
switch(PINC&PINMASK){
   case 0:
      // tu bla wenn keine taste
      break;
   case 1:
      // tu blubber bei PC0
      break;
   [...]
   default:
      // whatever;
      break;
}
schreiben! Ich wollt eigentlich nur die Möglichkeit mit ganzem Port und 
Bitmaske aufzeigen!

greetz

Autor: Thorsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe die Vorschläge mal soweit durchprobiert und sie funktionieren 
durchweg. Besten Dank....

Thorsten

Autor: Thorsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Thorsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja, aber ich programmiere über JTAGICE MK2, dazu benötige ich dies doch, 
oder?!?

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann hast Du da ein Problem. Das trifft aber dann nicht nur auf PORTC.4 
zu sondern auch auf PORTC.2, 3 und 5.

Autor: Thorsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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...

Autor: Thorsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...so, um diesem Problem zu entgehn hab ich nun den PORTD verwendet.

Vielen Dank nochmal für eure Unterstützung

Thorsten

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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> ;-)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.