Zitat Zitat von Lisbeth2010
Hallo, ich habe eine Lösung für den Nibo (1), aber sie sollte relativ einfach auf den Nibo 2 adaptiert werden können. Sie benutzt den Timer2, der HOFFENTLICH (s. mangelhafte Dokumentation!!)verwendet werden kann. Wie kann man hier Code posten?
Lisbeth
Code:
/* Linie einfachst. Erstmal Bodensensoren */

#include <avr/interrupt.h>

#include <nibo/niboconfig.h>
#include <nibo/iodefs.h>

#include <nibo/bot.h>
#include <nibo/i2cmaster.h>
#include <nibo/leds.h>
#include <nibo/delay.h>
#include <nibo/motco.h>
#include <nibo/irco.h>
#include <nibo/floor.h>
#include <nibo/adc.h>

#include "utiliw.h"

#define WHILE_1_TIME_GRID 20
uint8_t counter_1ms;
uint8_t speed_left = 40; // Ticks/Sekunde
uint8_t speed_right = 40;	// Ticks/Sekunde


// ------------------------------------------------------------
// ---------- init timer2 -------------------------------------
// ------------------------------------------------------------

void init_timer2(void) {
	TCCR2 = 0x00;	// normal port operation
	TCNT2  = 0x83;	// set count value (131)
}

// ------------------------------------------------------------
// ---------- start timer2 ------------------------------------
// ------------------------------------------------------------

void start_timer2(void) {
	cli();						// disable global interrupts
	counter_1ms = 0;
	TCCR2 |= 0x05;		// CS02 = 1; CS01 = 0; CS00 = 1  -> clk/128
	TIMSK |= (1<<TOIE2); //0x01;		// enable timer overflow interrupt
	sei();						// enable global interrupts
}

// ------------------------------------------------------------
// ---------- stop timer2 -------------------------------------
// ------------------------------------------------------------

void stop_timer2(void) {
	cli();						// disable global interrupts
	TCCR2 &= ~0x05;	// stop timer
	TIMSK &= ~(1<<TOIE2);//0x01;	// disable timer overflow interrupt
	sei();						// enable global interrupts
}

// ------------------------------------------------------------
// ---------- timer2 ISR --------------------------------------
// ------------------------------------------------------------

ISR(TIMER2_OVF_vect) {	// timer2 overflow

	// reload counter value high byte; 0x83 corresponds to 1ms
	// clk/128 entspricht 125 kHz entspricht 8 us
	TCNT2 = 0x83; //  131 bis 256 also 125 mal 8 us 
	counter_1ms++;

	if (counter_1ms >= WHILE_1_TIME_GRID) { 
		stop_timer2(); // Zeitdauer unbekannt, deshalb stoppen
		// Bodensensoren messen
		floor_measure_iw();
		//zahlausgabe(floor_mw[2]); // da kein Display!	

		if (floor_mw[2] < 32) { // schwarz = 0, weiß = 1023
			motco_stop();
			motco_update();
			leds_set_status(LEDS_RED,0);
		} else {
			leds_set_status(LEDS_GREEN,0);
			// delta_motco ms nach vorn fahren		
			motco_setSpeed(speed_left,speed_right);
			motco_update(); // jetzt fährt er erst los!
		} // end if floor
		counter_1ms = 0;
		start_timer2(); // alles abgearbeitet
	} // end if counter
} // end ISR


/* die main */
int main() {

	sei();
	bot_init();
	i2c_init();
	leds_init();
	floor_init();
	init_timer2();
	
	delay(2000); // damit er nicht gleich losrast!

	motco_setSpeedParameters(5,4,6); // Empfehlung vom "Chef"

	start_timer2();

	while (1) {
		// tu was
		delay(10000);
	}
	return 0;
}