RoboterCC - Robotic Code Compiler
Forum Robot Kits NIBO burger SurfaceSensor.getCL(0)

Welcome

Nachrichten

Sie sind nicht eingeloggt.

Werbung

Banner

Letzte Themen

Site-Statistic

  • 7416 private projects
  • 378 public projects
  • 16172649 lines compiled
  • 58122 builds
NIBO @ facebook YouTube Twitter
Willkommen, Gast
Benutzername: Passwort: Angemeldet bleiben:
  • Seite:
  • 1

THEMA: SurfaceSensor.getCL(0)

SurfaceSensor.getCL(0) 8 Jahre 3 Monate her #3426

  • Georg
  • Georgs Avatar
  • OFFLINE
  • Gold Boarder
  • Beiträge: 290
Hallo,

getCL liefert "Messwert linker Bodensensor mit Licht vom mittleren Sensor".
getCR liefert "Messwert rechter Bodensensor mit Licht vom mittleren Sensor".
Beim Aufruf von getCR/getCL bleiben die beiden äußeren Boden-LEDs jedoch immer eingeschaltet.
Die beiden äußeren Boden-LEDs bleiben jedoch immer eingeschaltet!

lg Georg
Der Administrator hat öffentliche Schreibrechte deaktiviert.

SurfaceSensor.getCL(0) 8 Jahre 3 Monate her #3429

  • workwind
  • workwinds Avatar
  • OFFLINE
  • Administrator
  • Beiträge: 573
Hallo Georg,

um die Messung der Werte zu aktivieren solltest Du in Deinem setup() folgende Zeilen einfügen:
  analog_setExtToggleMode(ANALOG_BCL, 1);
  analog_setExtToggleMode(ANALOG_BCR, 1);

Die LEDs der Sensoren werden automatisch mehrmals pro Sekunde immer wieder ein und ausgeschaltet - wenn du den Roboter schnell :silly: hin und her :lol: bewegst kannst Du das flackern der Sensoren erkennen....

-workwind-
Der Administrator hat öffentliche Schreibrechte deaktiviert.

SurfaceSensor.getCL(0) 8 Jahre 2 Monate her #3554

  • BirgerT
  • BirgerTs Avatar
  • OFFLINE
  • Gold Boarder
  • Beiträge: 325
.das mit dem Togglemode ist schon eine eigenartige Sache..

Also hier mal ein Codeausschnitt aus meinem Programm mit dem der Togglemodus für die Bodensensoren separat geschaltet werden kann..
static uint8_t toggle = 0;			// Togglemode Bits setExtToggleMode()
 
	//
	//				UART Tasten Eingabe lesen
	//
	char ch = test_check_char();
 
	// Funktion bei ESC sofort abbrechen
	if (ch == 27) { return ch; } // if ESC
 
	//
	//				Togglemodes umschalten
	//
	if (ch == '0') toggle = 0;			// Ch == '0' -> alles OFF
	else if (ch == '1') toggle = 0xff;	// Ch == '9' -> alles ON
 
	else if (ch == '2') toggle ^= 1;	// ToggleMode Distanzsensoren
	else if (ch == '3') toggle ^= 2;	// ToggleMode BL
	else if (ch == '4') toggle ^= 4;	// ToggleMode BC
	else if (ch == '5') toggle ^= 8;	// ToggleMode BR
	else if (ch == '6') toggle ^= 16;	// ToggleMode BCL
	else if (ch == '7') toggle ^= 32;	// ToggleMode BCR
 
	if (toggle & 1) {
		analog_setExtToggleMode(ANALOG_FL, 1);
		analog_setExtToggleMode(ANALOG_FR, 1);
		analog_setExtToggleMode(ANALOG_FLL, 1);
		analog_setExtToggleMode(ANALOG_FRR, 1);
	} 
	else {
		analog_setExtToggleMode(ANALOG_FL, 0);
		analog_setExtToggleMode(ANALOG_FR, 0);
		analog_setExtToggleMode(ANALOG_FLL, 0);
		analog_setExtToggleMode(ANALOG_FRR, 0);
	}
 
	if (toggle & 2) {
		analog_setExtToggleMode(ANALOG_BL, 1);
	} 
	else {
		analog_setExtToggleMode(ANALOG_BL, 0);
	}
 
	if (toggle & 4) {
		analog_setExtToggleMode(ANALOG_BC, 1);
	} 
	else {
		analog_setExtToggleMode(ANALOG_BC, 0);
	}
 
	if (toggle & 8) {
		analog_setExtToggleMode(ANALOG_BR, 1);
	} 
	else {
		analog_setExtToggleMode(ANALOG_BR, 0);
	}
 
	if (toggle & 16) {
		analog_setExtToggleMode(ANALOG_BCL, 1);
	} 
	else {
		analog_setExtToggleMode(ANALOG_BCL, 0);
	}
 
	if (toggle & 32) {
		analog_setExtToggleMode(ANALOG_BCR, 1);
	} 
	else {
		analog_setExtToggleMode(ANALOG_BCR, 0);
	}

Welcher Tastencode was macht steht ja in den Kommentaren..

Bei welchem ToggleMode soll eigentlich welche Sensor LED aktiviert werden?? :kopfkratz:

und warum (oder wie) sollen folgende Zeilen in den Testprogrammen der niborobolib 3.3´funktionieren
  surface_init();
 
  for (uint8_t i = 0; i<8; i++) {
    analog_setExtToggleMode(i, 0);
  }
 
// bzw.
 
  for (uint8_t i = 0; i<8; i++) {
    analog_setExtToggleMode(i, 1);
  }
 

Setze ToggleMode für AnalogIndex 0..7 - .._BCR hat Index 8 und .._BCL mit Index 7 tut bei mir nix :pinch:

Und für welche Funktion wird diese enumeration gebraucht/verwendet?
enum { ANALOG_UPDATE_ASAP, ANALOG_UPDATE_10MS, ANALOG_UPDATE_MANUAL }
Letzte Änderung: 8 Jahre 2 Monate her von BirgerT. Begründung: Programm Korrektur
Der Administrator hat öffentliche Schreibrechte deaktiviert.

SurfaceSensor.getCL(0) 8 Jahre 2 Monate her #3555

  • Georg
  • Georgs Avatar
  • OFFLINE
  • Gold Boarder
  • Beiträge: 290
Hi Birgert,

die Sensor-LEDs werden in der analog.c in der Funktion ISR(ADC_VECT) in den Programmzeilen

CASE_ADC(0, ANALOG_BL, IO_EN_BL, IO_ANALOG_BIT_SENS_BL)
CASE_ADC(6, ANALOG_FLL, IO_EN_FLL, IO_ANALOG_BIT_SENS_FLL)
CASE_ADC(12, ANALOG_FL, IO_EN_FL, IO_ANALOG_BIT_SENS_FL)
CASE_ADC(18, ANALOG_BC, IO_EN_BC, IO_ANALOG_BIT_SENS_BC)
CASE_ADC(24, ANALOG_FR, IO_EN_FR, IO_ANALOG_BIT_SENS_FR)
CASE_ADC(30, ANALOG_FRR, IO_EN_FRR, IO_ANALOG_BIT_SENS_FRR)
CASE_ADC(36, ANALOG_BR, IO_EN_BR, IO_ANALOG_BIT_SENS_BR)
// special surface
CASE_ADC2(42, ANALOG_BCL, IO_EN_BC, IO_ANALOG_BIT_SENS_BL)
CASE_ADC2(48, ANALOG_BCR, IO_EN_BC, IO_ANALOG_BIT_SENS_BR)

geschaltet.

lg Georg
Der Administrator hat öffentliche Schreibrechte deaktiviert.

SurfaceSensor.getCL(0) 8 Jahre 2 Monate her #3556

  • workwind
  • workwinds Avatar
  • OFFLINE
  • Administrator
  • Beiträge: 573
Habe gerade eine aktualisierte analog.h mit neuen Infos zum Toggle Modus ins SVN eingecheckt...
Der Administrator hat öffentliche Schreibrechte deaktiviert.

SurfaceSensor.getCL(0) 8 Jahre 2 Monate her #3557

  • BirgerT
  • BirgerTs Avatar
  • OFFLINE
  • Gold Boarder
  • Beiträge: 325
:S ..und ich hing gerade an der Erforschung von analog_irq_hook() - wo muss die eigene Funktion denn eingefügt werden? vor oder hinter #include "analog.h"
/*  BSD-License:
 
Copyright (c) 2007 by Nils Springob, nicai-systems, Germany
 
All rights reserved.
 
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
 
  * Redistributions of source code must retain the above copyright notice,
    this list of conditions and the following disclaimer.
  * Redistributions in binary form must reproduce the above copyright notice,
    this list of conditions and the following disclaimer in the documentation
    and/or other materials provided with the distribution.
  * Neither the name nicai-systems nor the names of its contributors may be
    used to endorse or promote products derived from this software without
    specific prior written permission.
 
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
*/
 
/*! @file    analog.h
 *  @brief   Zugriff auf die analogen Eingänge.
 *           Die analogen Eingänge werden automatisch gemessen, dazu müssen die globalen Interrupts aktiviert sein!
             Die IR-Sensoren liefern für nahe Objekte Werte >50 und für Freiräume Werte <10.
 *  @author  Nils Springob (nils.springob@nicai-systems.com)
 *  @date    2015-02-25
 */
 
#ifndef _NIBOBURGER_ANALOG_H_
#define _NIBOBURGER_ANALOG_H_

 
#ifdef __cplusplus
extern "C" {
#endif
/*!
 *	Symbolische Namen für den Parameter @param idx der
 *	analog_ - Funktionen
*/
enum {
  ANALOG_BL,   //!< Bodensensor Links / Sensor Hinten Links (bt)
  ANALOG_BC,   //!< Bodensensor Mitte / Sensor Hinten Mitte
  ANALOG_BR,   //!< Bodensensor Rechts / Sensor Hinten Rechts (bt)
  ANALOG_FL,   //!< Sensor Vorne Links
  ANALOG_FR,   //!< Sensor Vorne Rechts
  ANALOG_FLL,  //!< Sensor Vorne Links aussen
  ANALOG_FRR,  //!< Sensor Vorne Rechts aussen
  /* speziell */
  ANALOG_BCL,  //!< Bodensensor Links, Licht von Mitte Sensor
  ANALOG_BCR,  //!< Bodensensor Rechts, Licht von Mitte Sensor
  ANALOG_KEY,  //!< Funktionstasten
  ANALOG_VOLT, //!< Versorgungsspannung
  ANALOG_CNT   //!< Anzahl der enums, if(idx < ANALOG_CNT) idx_iO;
};
 
/*!
 *	Symbolische Namen für den Parameter @param mode der
 *	analog__getValueExt() - Funktionen
*/
enum {
  ANALOG_PASSIVE       = 0, //!< passive Messung (LED aus)
  ANALOG_ACTIVE        = 1, //!< aktive Messung (LED an)
  ANALOG_DIFFERENTIAL  = 2  //!< passive+aktive Messung (Differenz)
};
 
/*!
 *	Symbolische Namen für ??? 
 *	
*/
 
enum {
  ANALOG_UPDATE_ASAP,    //!< immer Messen
  ANALOG_UPDATE_10MS,    //!< Messdurchlauf alle 10 ms starten
  ANALOG_UPDATE_MANUAL,  //!< Messdurchlauf manuell starten
};
 
 
/*!
 * Initialisierung des Liniensensors.
 * Der AD-Wandler misst im Interruptmodus automatisch alle Werte, und schaltet
 * auch die IR-LEDs der Bodensensoren bei Bedarf ein und aus.
 * Die Interrupts müssen aktiviert sein, damit die Sensorwerte gemessen werden!
 */
void analog_init();
 
 
/*!
 * Liefert den Wert eines analogen Eingangs mit dem index @param idx zurück.
 * Die Interrupts müssen aktiviert sein, damit die Werte gemessen werden!
 */
uint16_t analog_getValue(uint8_t idx);
 
 
/*!
 * Liefert den Wert eines analogen Eingangs mit dem index @param idx zurück.
 * Der Parameter @param mode bestimmt die Sensor Messwerte Quelle:
 * ANALOG_PASSIVE = bei abgeschalteter Sensor LED 
 * ANALOG_ACTIVE  = bei eingeschalteter Sensor LED (nur bei Togglemode ON)
 * ANALOG_DIFFERENTIAL = Differenzwert _ACTIVE - _PASSIVE (min. = 0) 
 * Die Interrupts müssen aktiviert sein, damit die Werte gemessen werden!
 * Bei passivem Togglemode (== 0) und bei @param idx _KEY u. _VOLT ist _ACTIVE == _PASSIVE!
 * @return Value ADC Wert 0..1024 
 */
 
/*
	#define	BC_MINVAL 40	// Minimaler Reflektionswert bei Bodenkontakt 
	// Toggle-Mode für mittleren Bodensensor aktivieren
	analog_setExtToggleMode(ANALOG_BC, ON);
	// wenn neue Messwerte vorhanden sind
	if (analog_has_update) {
		// Differenz Mittlerer Bodensensor bei LED aus / LED an
		uint16_t bc = analog_getValueExt(ANALOG_BC, ANALOG_DIFFERENTIAL);
		if (bc < BC_MINVAL) {
			// Aktion bei Absturzgefahr
			engine_stop();
		}
	} // if has update
*/
uint16_t analog_getValueExt(uint8_t idx, uint8_t mode);
 
 
/*!
 * Liefert einen Zufallswert zurück. Der Wert errechnet sich aus der Summe
 * aller gemessenen Analog-Spannungen. Der Wert selbst sollte nur als Seed
 * (Entropiequelle) verwendet werden, da er monoton wachsend ist. Der Wert
 * wird um so zufälliger, je mehr analoge Messungen vorher durchgeführt
 * wurden.
 * @return Random Seed
 */
/*
	 // Generieren einer (Pseudo) Zufallszahl mit der avr-libc
	#include <stdlib.h>
 
	// im Setup() den Seed Wert aktualisieren
	setup() {
		led_init();
		analog_init();
		sei();
		// etwas Zeit für einige ADC Messungen
		delay(100);
		// seed Wert setzen für stdlib Funktion rand()
		srand(analog_getRandomSeed());	
	} // setup()
 
	loop() {
		// Updateintervall der LEDs ohne delay()
		static uint8_t	led_timer = 100;
		static uint16_t clock_lastms;
		cli();	// Interrupts aus für clock_ms Lesen 		
		uint8_t sub_time = clock_ms - clock_lastms;
		clock_lastms = clock_ms;
		sei();
 
		// LED Intervall Zeit abgelaufen?!
		if (led_timer > sub_time) {
			// Wartezeit läuft noch
			led_timer -= sub_time;
		}
		else {	// Wartezeit ist um -> Action
			// stdlib Funktion liefert Pseudo Zufahlszahl 0..0x7FFF
			led_timer = rand();
			uint8_t l1v = led_timer & 1 ? 1:0;	
			uint8_t l2v = led_timer & 2 ? 1:0;
			uint8_t l3v = led_timer & 4 ? 1:0;
			uint8_t l4v = led_timer & 8 ? 1:0;
			led_setall(l1v, l2v, l3v, l4v);
		} // else (led_timer > sub_time)
	} // loop()
*/
 
uint16_t analog_getRandomSeed();
 
 
/*!
 * Aktiviert den automatischen Toggle-Mode (active/passive)
 */
/*
	// Alle Sensor LEDs aus
	for (uint8_t idx; idx < ANALOG_CNT-2; idx++) {
		analog_setExtToggleMode(idx, 0);
	}
*/
void analog_setExtToggleMode(uint8_t idx, uint8_t activate);
 
 
/*!
 * Diese Funktion wird nach einem kompletten Durchgang aller Sampling-Kanäle aufgerufen
 */
void analog_irq_hook();
 
 
/*!
 * Diese Funktion wartet bis neue analoge Werte gemessen wurden
 * Bei einem ATmega16 mit 15MHz Quarz dauert das ca. 9ms
 */
void analog_wait_update();
 
 
 
/*!
 * Diese Funktion liefert TRUE wenn es seit dem letzten Aufruf neue analoge Messwerte gibt
 */
uint8_t analog_has_update();
 
 
// for internal use
extern uint16_t analog_samples[];
#define analog_getValue_ISR(idx) (analog_samples[((idx))])
#define analog_getValueAct_ISR(idx) (analog_samples[((idx))+ANALOG_CNT])

#ifdef __cplusplus
} // extern "C"
#endif

 
#endif // _NIBOBURGER_ANALOG_H_
.. ich geh' dann mal mit'm Hund Gassi :blush:
Der Administrator hat öffentliche Schreibrechte deaktiviert.
  • Seite:
  • 1
Ladezeit der Seite: 0.186 Sekunden

Werbung