- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 5 von 5

Thema: Pin Abrfrage tut nicht so wie sie soll (happert bei der Maskierung)

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    22.01.2012
    Beiträge
    132

    Pin Abrfrage tut nicht so wie sie soll (happert bei der Maskierung)

    Anzeige

    Praxistest und DIY Projekte
    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:

    Code:
    #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:
    Code:
    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_

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Karlsruhe
    Alter
    36
    Beiträge
    1.225
    Zitat Zitat von Thor_ Beitrag anzeigen
    Ich lasse am besten den kommentierten Code für sich sprechen:
    Code:
    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
    Tiny ASURO Library: Thread und sf.net Seite

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.08.2008
    Ort
    DE
    Beiträge
    523
    Mal abgesehen vom vorhergegangenen Post, normalerweise würde man das wohl eher so machen:
    Code:
    if(taster_pressed) 
        LED = ON;
    else 
        LED = OFF;
    mfg

  4. #4
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Oder ohne #define
    if ( !(PIND & (1<<PIND7)) )
    {PORTC=(1<<PC7);}
    else
    {PORTC &=~(1<<PC7);}
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    22.01.2012
    Beiträge
    132
    Hallo zusammen

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

Ähnliche Themen

  1. Antworten: 6
    Letzter Beitrag: 16.11.2013, 17:55
  2. Gyro tut nicht so wie er soll
    Von Keksstar im Forum Elektronik
    Antworten: 1
    Letzter Beitrag: 15.08.2009, 15:22
  3. Timer soll zählen, tut er aber nicht. Hilfe!! :)
    Von robo-man im Forum C - Programmierung (GCC u.a.)
    Antworten: 4
    Letzter Beitrag: 19.07.2009, 20:08
  4. Antworten: 9
    Letzter Beitrag: 23.09.2008, 17:25
  5. servo tut nicht, was er soll
    Von Goblin im Forum Motoren
    Antworten: 12
    Letzter Beitrag: 08.05.2005, 21:35

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test