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


von Demerzel (Gast)


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

von Dirk B (Gast)


Lesenswert?

if (PIND & _BV(PD0))
    {
        /*...*/
    }

Gruss
Dirk

von Alex (Gast)


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 :-)

von Demerzel (Gast)


Lesenswert?

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

von Dirk B (Gast)


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

von Stefan Kleinwort (Gast)


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

von Jörg Wunsch (Gast)


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.

von Demerzel (Gast)


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

von Stefan (Gast)


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

von Jörg Wunsch (Gast)


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...

von Matthias (Gast)


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

von Demerzel (Gast)


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

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
Noch kein Account? Hier anmelden.