PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Pin Abrfrage tut nicht so wie sie soll (happert bei der Maskierung)



Thor_
21.09.2013, 20:29
Hallo zusammen

Nach laaanger Zeit habe ich mich mal wieder an die Programmierung eines Mc gewagt. Dieses Mal soll es sauberer und ernsthafter sein.
Ausserdem will ich mich an C wagen und nicht mehr mit Bascom programmieren.

Als erster Test habe ich einen Atmega8, eine LED und einen Taster. Das Ziel ist es, die LED per Taster einzuschalten (klar).
Ich lasse am besten den kommentierten Code für sich sprechen:


#include <avr/io.h>
#define F_CPU 1000000UL //1 Mhz
#include <util/delay.h>

int main(void){
DDRD = 0x00;
DDRC=0xFF;

PORTD=0xFF;

PORTC=0xFF; //funktionskontrolle
_delay_ms(1000);
PORTC=0x00;

while(1){
// if(PIND==0b01111111){PORTC=0xFF;} funktioniert
// if(PIND==0b11111111){PORTC=0x00;} funktioniert
if((PIND & (1<<PD7))==1){PORTC=0x00;} //funktioniert nicht
if((PIND & (1<<PD7))==0){PORTC=0xFF;} //funktioniert


}

}

Das Problem ist nun, dass sobald ich Strom gebe, leuchtet die ED noch nicht (ausgenommen vom ersten, kurzen ein/ausschalten).

Wenn ich den Taster aber drücke, so leuchtet sie und hört nicht mehr auf, was sie doch aber eigentlich sollte.
Hier noch meine Überlegungen zu der Bitmaskierung

Zustand Pins PortD wenn Taster NICHT gedrückt

1111'1111 (Zustand der Pins)
1000'0000 (OR-Verknüpfung mit 1 ergibt 1 wenn Taster nicht gedrückt)

Zustand Taster gedrückt
0111'1111
1000'0000 (OR-Verknüpfung mit 1 ergibt 0)

Der Taster usw. ist garantiert richtig angeschlossen, denn so:


if(PIND==0b01111111){PORTC=0xFF;}
if(PIND==0b11111111){PORTC=0x00;}

funktioniert es problemlos, es muss also die Programmierung sein.

Ich hoffe, dass ich mein Problem klar machen konnte, und das ihr mir helfen mögt.

Liebe Grüsse

Thor_

markusj
21.09.2013, 20:53
Ich lasse am besten den kommentierten Code für sich sprechen:


if((PIND & (1<<PD7))==1){PORTC=0x00;} //funktioniert nicht
if((PIND & (1<<PD7))==0){PORTC=0xFF;} //funktioniert



Falls der Code nicht zu dir spricht: 0b12345678 & 0b10000000 = 0b10000000 und das ist ungleich 1 (0b00000001). Der Fehler besteht darin, dass du auf Gleichheit mit 1 prüfst. Korrekt ist nur die Überprüfung auf Gleichheit mit 0 oder Ungleichheit mit 0.

mfG,
Markus

Wsk8
21.09.2013, 23:46
Mal abgesehen vom vorhergegangenen Post, normalerweise würde man das wohl eher so machen:


if(taster_pressed)
LED = ON;
else
LED = OFF;

mfg

Hubert.G
22.09.2013, 07:21
Oder ohne #define
if ( !(PIND & (1<<PIND7)) )
{PORTC=(1<<PC7);}
else
{PORTC &=~(1<<PC7);}

Thor_
22.09.2013, 09:09
Hallo zusammen

Ich danke euch allen für eure Antworten.
War natürlich ein dummer Fehler, jetzt klappt alles so wies soll.
Danke