PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Port einlesen



Bulldozer
08.12.2009, 17:11
Hallo,

Ich möchte über einen Interrupt alle 10ms den Zustand von PINB einlesen und in die Variable "EingangB" schreiben. Anschließend möchte ich die verschiedenen Bits in "EingangB" (die jeweils 1 Pin wiederspiegeln) verarbeiten.

Ist das möglich? Bin Anfänger und möchte einiges ausprobieren. Leider komme ich mit dem Tutorial hier nicht weiter.

unsigned char EingangB;
....
....
EingangB = PINB;
....
if EingangB = 0x02
{
....
....


Vielen Dank im Voraus für jeden kleinen Tipp.

shedepe
08.12.2009, 18:08
Klar doch ist das möglich. Ist dir bereits klar wie man Interruptsverarbeitet ?
Ansonsten würde ich dir vorschlagen das ganze erst enmal in einer endlosschleife ausliest.

Aussehen würde die abfrage dann in etwa so



uint8_t foo = PINB

if ( foo & ( ( 1 << MEINBIT0 ) | ( 1 << MEINBIT2 ) ) )
{

Mach was
}

MEINBIT steht halt jeweils für das entsprechende Bit in dem Register

Dürfte ich noch erfahren welches Tutorial du verwendest ?

BurningWave
08.12.2009, 18:55
Ich würde es gleich so machen:


if(PINB & (1 << PB0))
{...}
if(PINB & (1 << PB1))
{...}
if(PINB & (1 << PB2))
{...}
...

So brauchst du die Variable nicht.

Bulldozer
08.12.2009, 19:18
Danke für den Tipp, aber so hab ich es auch schon gemacht. Mit der zusätzlichen Variablen möchte ich erreichen das ich den Port nur alle 10ms aktualisiere um z.B. Tastenprellen auszuschließen. Weiterhin ist mein Plan mit der Variablen verschiedene Tasterzustände in Zukunft auszuwerten (kurz gedrückt, lang gedrückt, steigende-, fallende Flanke etc.)

Mit dem Interrupt habe ich das hin bekommen. Leider bekomme ich es nicht hin das er mir den PINB in die Variable EingangB schreibt bzw. weiß ich nicht wie ich entsprechende Bits auslesen könnte.

BurningWave
08.12.2009, 19:35
ganz einfach:
statt:
if(PINB & (1 << PB0))
{...}
schreibst du:
if(Variable & (1 << 0))
{...}
if(Variable & (1 << 1))
{...}
if(Variable & (1 << 2))
{...}
...

shedepe
08.12.2009, 19:41
dass er PINB in deine Variable schreibt machst du eigentlich nicht mehr als:

uint8_t EingangB; so dass sie von überall im Programm eingesehn werden kann

und:
EingangB = PINB in deinem Interrupt

Bulldozer
08.12.2009, 19:44
Hallo,

schaue derzeit durch verschiedene tutorials u.a. bzw. hauptsächlich Roboternetz.de & Microcontroller.net.

Leider bringt mich das sture Durchlesen nicht viel weiter. Darum bin ich dabei Schritt für Schritt kleine Codes zu programmieren und diese zu erweitern. Dies fing an mit ansteuern von Ausgängen, einlesen von Pins erzeugen von Interruppts,....

Je nachdem was ich gerade mache versuche ich natürlich die Info aus dem Tutorial zu ziehen. Am besten wären hier immer einge Beispielprogramme.

BurningWave
08.12.2009, 19:56
Was funktioniert denn jetzt immernoch nicht? Was möchtest du noch wissen?

donald_dack
09.12.2009, 23:05
Hi

Schau dir mal hier http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Vorwort das mit dem Thema Bitfelder an vielleicht hilft es dir.

by Donald