www.mikrocontroller.net

Forum: Compiler & IDEs einzelne pins als eingänge auslesen


Autor: Demerzel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi leutz,

ich hab ja nun eigentlich die wesntlichsten sachen verstanden,aber
ein problem hab ich noch.ich kann zwar einzelne pins durch sbi und cbi
als ausgänge setzen aber wie kann ich einzelne pins auslesen.
beispiel: ich möchte den pin PD0 auslesen und ihn auf eine variable
schreiben.
int taster;
if (taster ==1)
{
....
}


den einzigsten befehl den ich kenne ist inp (PIND)
danke für eure hilfe
ciao peter

Autor: Dirk B (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
if (PIND & _BV(PD0))
    {
        /*...*/
    }

Gruss
Dirk

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da bei mir die Taster einen Pin immer gegen GND ziehen (Low-Aktiv)
müsste die Zeile von Dirk so abgeändert werden:

if (!(PIND & _BV(PD0))) {
...
}

Das Prinzip sollte aber klar sein :-)

Autor: Demerzel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
dank dir,
kannst du mir noch sagen was _BV bedeutet und ob ich dafür eine header
- datei einbinden muss?

Autor: Dirk B (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
_BV bedeutet Bit Value.

_BV(3) => 1 << 3 => 0x08

siehe http://jubal.westnet.com/AVR/doc/avr-libc-user-manual/
bei den Faq

Gruss
Dirk

Autor: Stefan Kleinwort (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Demerzel,

ich gehe so vor:
ich definiere die Register und die Bitnummer für einen Pin, auf den ich
zugreifen will:

   #define taster_bit  1       // 0 bis 7 erlaubt
   #define taster_pin  PINC
   #define taster_port  PORTC
   #define taster_ddr  DDRC

Diese Definitionen mache ich für alle Pins des AVR, die auf meiner
Platine eine spezielle Funktion haben und packe sie in die Datei
hardware_soundso.h.

Im Programm greife ich dann so darauf zu (Taster low-aktiv):

   if (!(taster_pin & _BV(taster_bit))) {
   ...
   }

Für _BV musst Du einbinden:
   #include <avr/io.h>

Viel Spass, Stefan

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Außerdem hast Du offensichtlich noch nicht alles verstanden, sonst
hättest Du verstanden, daß man sbi() und cbi() nicht mehr benutzen
soll. ;-) (In der Tat gibt es sie in der Entwicklerversion der
avr-libc bereits nicht mehr.)  Man benutzt auch dafür (genau wie für
die Eingabe) die Bitmanipulationsoperatoren aus der C-Hausapotheke.

Die Doku zur avr-libc steht übrigens offiziell unter

http://www.nongnu.org/avr-libc/user-manual/index.html

jubal.westnet.com war nur ein Ausweichstandort.

Autor: Demerzel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke leute,

eure antworten haben mir super geholfen.
@ jörg: danke das du mich aufgeklärt hast das man sbi und cbi nicht
mehr benutzt - ich bin da nicht so auf dem laufendem was gerade im
augenblick bei der programmierung " in " ist. nächstes jahr ist eh
alles wieder anders ;-)

ciao and have a nice day
peter

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Demerzel,

das hat nichts mit "in" zu tun, sondern der Tip von Jörg soll Dich
davor bewahren, Code zu schreiben, der mit der nächsten WINAVR-Version
nicht mehr übersetzbar sein wird.
Und uns natürlcih vor dem Gejammere "Hilfeee, die neue WINAVR-Version
macht lauter Fehler ...".

So long, Stefan

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
cbi und sbi waren nicht "in", sondern waren einstmals einfach nur
Hacks, um im AVR-GCC (bzw. der AVR-LIBC) überhaupt einen Zugriff auf
einzelne IO-Bits zu ermöglichen (genauso wie inb und outb).
Mittlerweile ist aber eine Methode implementiert, die erstens
kompatibel zur gängigen Atmel-Syntax (und damit auch zu allen anderen
AVR-C-Compilern) ist und die zweitens ausschließlich mit
Standard-C-Konstrukten (Bitoperatoren eben) auskommt, so daß die
ursprünglichen Hacks auf dem Müllhaufen der Geschichte gelandet sind.

Ähnlich wird sicher __attribute__((progmem)) (hoffentlich) irgendwann
mal auf dem Müllhaufen der Geschichte landen und durch dann
hoffentlich mal implementierte memory spaces ersetzt werden, die einer
dann hoffentlich verabschiedeten Erweiterung des C-Standards für
memory spaces genügen werden, so daß wieder ein lokaler Hack weniger
nötig sein wird.  Aber bis dahin fließt auf jeden Fall noch viel
Wasser die Elbe und den Rhein hinunter...

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

um die Zugriffe auf externe Hardware zu vereinfach mach ich in einer
hardware.h (wird gleich zu Beginn des Projekts aus dem Schaltplan
erstellt) für alle I/O-Signale sowas:

//Ausgänge
#define LED_ON  PORTC|=(1<<3)
#define LED_OFF PORTC&=(unsigned char)(~(1<<3))

//Eingänge
#define IN_KEY1  (PINC&(1<<6))

Dann schreibt sich das Einschalten einer LED einfach:
LED_ON;

bzw. die Abfrage auf Taste 1:
if(IN_KEY1);


Matthias

Autor: Demerzel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke nochmal allen - hoffe es hilft auch anderen.(nix gegen das
tutorial aber mir hilft es einfach mehr wenn ich meine gedanken hier
poste und dann auf die punkte bei denen ich probleme habe speziell eine
antwort bekomme)ciao peter

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.