- LiFePO4 Speicher Test         
Ergebnis 1 bis 7 von 7

Thema: Inkrementierung will nicht so recht

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    if(~PINB & 1 << PB0)
    Ich schreibe Pin-Abfragen immer so:
    if(!(PINB&(1<<PB0)))

    Das Variable die in einer ISR verwendet und verändert werden können, als volatile deklariert werden müssen ist schon klar.
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

  2. #2
    Hallo Hubert, ja die Variablen sind global als volatile unsigned char deklariert.

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    02.08.2006
    Ort
    Würzburg, Germany
    Beiträge
    716
    Hallo tirell,

    ist deine Abfrage in der main in einer Schleife? Dann kann es sein, dass die Minuten_Einer solange gezählt werden wie die Bedingung erfüllt ist. Da du sie in deiner Bitoperation nicht filterst zählen dadurch auch die Zehner, wenn der Wert in Minute_Einer über 15 ist.

    Weiterhin ist mir noch aufgefallen, dass du PORTD "veroderst". Ich würde es wie folgt lösen:
    Code:
    PORTD = (Minuten_Zehner << 4) | Minuten_Einer & 0xF;
    Damit hast du dann aber noch nicht die Ursache behoben. Wie gesagt aber nur, wenn die PINB Abfrage in einer Schleife liegt. In diesem Fall musst du nach der Inkrementierung warten, bis die Bedingung wieder "erloschen" ist.

    Viele Grüße
    Andreas

  4. #4
    Alles klar, Problem gelöst. Du hast mich auf den richtigen Ansatz gebracht mit dem warten,
    habe probehalber mal ein delay nach der Inkrementierung eingefügt und nun funktioniert es.

    Hier ist nochmal der korrigierte Code
    Code:
    PORTD &= 0x00;				// output minutes ones and tens
    PORTD = (s2 << 4) | (s1 & 0xF);		// output minutes ones and tens
    PORTA &= 0x00; 				// output hours ones and tens
    PORTA = (m2 << 4) | (m1 & 0xF);		// output hours ones and tens
    Code:
    while(1)
    {
    	if(!(PINB & (1 << PB0)))	// read input
    	{
    		m1 ++;
    		_delay_ms(1000);
    	}
    	else{}
    }
    Wird Zeit die Tasten zu entprellen, dadurch sollte sich das Problem endgültig lösen.
    Vielen Dank für die guten Ansätze!

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    02.08.2006
    Ort
    Würzburg, Germany
    Beiträge
    716
    Hallo tirell,

    mit Tasten-Entprellen hat das Problem, dass du hast aber nichts zu tun. Ich denke kein Mensch kann die Taste nur einen Takt-Zyklus halten. Und auch das Delay ist nur eine Pfusch-Lösung. Du musst eine Sperre einbauen die das zählen so lange verhindert, bis PB0 wieder losgelassen wurde.
    Und erst dann brauchst du natürlich noch eine Entprellung.

    Viele Grüße
    Andreas

  6. #6
    Hallo, das stimmt natürlich. Habe mich an dem Tutorial hier bezüglich des Auslesens von Tasterbetätigungen orientiert und meinte das fälschlicherweise als Entprellung
    Funktioniert jetzt alles bestens und wie erwünscht.

Ähnliche Themen

  1. ATxmega Einstieg will nicht so recht
    Von Ceos im Forum C - Programmierung (GCC u.a.)
    Antworten: 26
    Letzter Beitrag: 02.12.2009, 10:41
  2. Basisschaltung funktioniert nicht recht.
    Von Leverator im Forum Elektronik
    Antworten: 6
    Letzter Beitrag: 26.08.2009, 19:14
  3. IR-Diode recht schwach
    Von Felix H. im Forum Elektronik
    Antworten: 6
    Letzter Beitrag: 25.05.2009, 21:23
  4. MicroController oder recht PC?
    Von Gnev im Forum Elektronik
    Antworten: 2
    Letzter Beitrag: 21.05.2006, 22:29
  5. RP5 vorerst recht nutzlos :-(
    Von phex im Forum Robby CCRP5
    Antworten: 7
    Letzter Beitrag: 27.11.2005, 20:25

Berechtigungen

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

Labornetzteil AliExpress