- LiTime Speicher und Akkus         
Ergebnis 1 bis 5 von 5

Thema: Seltsames Verhalten: bumper_right

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    10.08.2011
    Beiträge
    10

    Seltsames Verhalten: bumper_right

    Anzeige

    Praxistest und DIY Projekte
    Hallo!

    Ich hab mich als Neueinsteiger mal sehr grundlegend mit den ersten Beispielprogrammen beschäftigt und ein paar Sachen ausprobiert.
    Dabei habe ich folgendes einfaches Testprogramm geschrieben:

    Code:
    void bumpersStateChanged(void)
    {
    	statusLEDs.LED5 = bumper_left;
    	statusLEDs.LED4 = (!bumper_left);
    	statusLEDs.LED2 = bumper_right;
    	statusLEDs.LED1 = (!bumper_right);
    	
    	updateStatusLEDs();
    }
    
    int16_t main(void)
    {
    	initRobotBase(); 	
    	BUMPERS_setStateChangedHandler(bumpersStateChanged);
    
    	while(true)
    	{
    		task_RP6System();
    	}
    	return 0; 
    }
    Das sollte passieren:
    Wenn der rechte Bumper gedrückt wird sollte LED1 ausgehen, dafür LED2 an. Analog beim linken Bumper und LEDs 4 und 5.

    Das passiert wirklich:
    Beim linken Bumper klappt alles super, rechts geht zwar LED1 beim Betätigen des Bumpers aus, LED2 geht aber NICHT an!
    Noch seltsamer ist aber: Wenn ich
    Code:
    statusLEDs.LED2 = bumper_right;
    ersetze durch
    Code:
    statusLEDs.LED2 = (!(!bumper_right));
    funktioniert es wie erwartet...was ist da denn los?!?

    Gruß, Benny

  2. #2
    Erfahrener Benutzer Roboter Genie Avatar von SlyD
    Registriert seit
    27.11.2003
    Ort
    Paderborn
    Alter
    39
    Beiträge
    1.516
    Hallo,

    die Bumper Variablen sind soweit ich mich erinnere NICHT unbedingt einfach nur 0 oder 1 (für den linken schon, für den rechten nicht s.u. ). Da wird nur das jeweilige Portbit gesetzt damits eine möglichst kurze routine bleibt.
    Für logische Abfragen und Operatoren wie ! kein problem da alles was >0 ist in C als logisch wahr betrachtet wird. Für Zuweisungen allerdings kanns komische Resultate geben da muss man dann entsprechend konvertieren.
    Entweder so wie Du das schon gemacht hast oder als inline if abfrage

    statusLEDs.LED2 = bumper_right ? 1 : 0;

    Schau Dir den Bumper Code in der RP6 Library an da sieht man das.
    ( uint8_t tmp = PINC & SL3;
    für Bumper right --> SL3 ist (1 << PINC6) )

    MfG,
    SlyD

  3. #3
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo,

    genau über das bin ich bei meinen allerersten Spielereien mit meinem RP6 auch gestolpert:

    PHP-Code:
    #include "RP6RobotBaseLib.h"

    #define blinkLED6 statusLEDs.LED6=(getStopwatch1() & (1<<6)) && 1

    uint8_t blink3;

    int main(void)
    {
        
    initRobotBase();
        
    setLEDs(0);

        
    //Zeitgeber für das Blinken starten
        
    startStopwatch1();

        while(
    true)
        {
            
    //LED1 blinkt langsam
            
    statusLEDs.LED1 ^=(getStopwatch1() & (1<<9));

            
    //LED2 blinkt schnell
            
    statusLEDs.LED2=(getStopwatch1() & (1<<7)) && 1;

            
    //LED3 blinkt variabel (0 bedeutet aus)
            
    blink3=8;
            
    statusLEDs.LED3=(getStopwatch1() & (1<<blink3)) && 1;

            
    //LED4 flasht
            
    statusLEDs.LED4=!(getStopwatch1() & (0b101<<6)) && 1;

            
    //LED5 flackert
            
    statusLEDs.LED5=(getStopwatch1() & (0b1001<<5)) && 1;

            
    //LED6 blinkt mit #define
            
    blinkLED6;

            
    //LED-Status aktuallisieren
            
    updateStatusLEDs();

            
    //das funktioniert natürlich auch mit der pwrLED
            
    if (!(getStopwatch1() & (9<<8)) && 1powerON(); else powerOFF();
        }
        return 
    0;

    (Aus: https://www.roboternetz.de/community...l=1#post315277)

    ... und habe dann festgestellt, dass ein schlichtes " && 1" ausreicht um das Problem zu beheben.

    Gruß

    mic
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    10.08.2011
    Beiträge
    10
    Danke für die Aufklärung, SlyD!
    Aber wie ist es denn mit den Variablen obstacle_left und obstacle_right?
    Im Beispiel "Example_04_ACS" wir das Gleiche damit gemacht:

    Code:
    statusLEDs.LED5 = obstacle_left;
    statusLEDs.LED4 = (!obstacle_left);
    statusLEDs.LED2 = obstacle_right;
    statusLEDs.LED1 = (!obstacle_right);
    Und das funktioniert ja einwandfrei. Haben diese Variablen denn definierte boolsche Werte?

  5. #5
    Erfahrener Benutzer Roboter Genie Avatar von SlyD
    Registriert seit
    27.11.2003
    Ort
    Paderborn
    Alter
    39
    Beiträge
    1.516
    Die ACS routinen sind ja anders als die der Bumper.
    Schau einfach in die task_ACS() Funktion rein - da sieht man das obstacle_left und right nur true und false zugewiesen werden.

    MfG,
    SlyD

Ähnliche Themen

  1. seltsames Verhalten am I2C
    Von liquidus im Forum Elektronik
    Antworten: 12
    Letzter Beitrag: 06.12.2009, 18:42
  2. Seltsames verhalten
    Von Atmelbeginne im Forum Microcontroller allgemeine Fragen/Andere Microcontroller
    Antworten: 6
    Letzter Beitrag: 10.12.2008, 19:37
  3. Seltsames Verhalten vom ADC an RN-Control
    Von MasterFX im Forum Schaltungen und Boards der Projektseite Mikrocontroller-Elektronik.de
    Antworten: 0
    Letzter Beitrag: 19.04.2008, 18:09
  4. RN Motor seltsames Verhalten
    Von User969 im Forum Elektronik
    Antworten: 0
    Letzter Beitrag: 30.10.2005, 11:38
  5. Seltsames Verhalten Schrittmotorsteuerung
    Von Baumschubser im Forum Elektronik
    Antworten: 2
    Letzter Beitrag: 03.07.2005, 22:12

Berechtigungen

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

LiTime Speicher und Akkus