Projekte
Egon
NIBO2_test_01.c
NIBO2_test_01.c
Projekte
Forum
Doku
Öffentliche Projekte
Startseite
Beispielprogramme
Projekte von anderen
Welcome
Username
Passwort
Eingeloggt bleiben
Zugangsdaten vergessen?
Registrieren
Projektverwaltung
⇨ Please choose! ⇦
——————————————————
✎ Create new project...
★ Browse existing projects...
——————————————————
⚬ MotorTest#1
⚬ C Tutorial 8#1
⚬ NIBO2 C Project#1
⚙ C Tutorial 15#1
⚬ 2010_11_18_el_test001#1
NIBO2_test_01.c
NIBO2_test_01.c
Project details
Compiler settings
Nachrichten
Sie sind nicht eingeloggt.
Neuigkeiten
★
NiboRoboLib 3.6
2017-01-17: Neue Version 3.6
★
NiboRoboLib 3.4.1
2016-04-16: Neue Version 3.4.1
★
Coding Tutorial
2015-11-22: Jetzt auch für den NIBO burger!
Site-Statistic
7433 private projects
378 public projects
16180353 lines compiled
58212 builds
NIBO
@
nibo2_test_01_c/NIBO2_test_01.c [read only]
/* Egon - 26.04.2012 Programmname: NIBO2_test_01.c Version: 01 Datum: 26.04.2012 NiboLib: 2.11 Plattform: C mit AVRStudio 4.18 Build 700 Programm aus mehreren Teilen zusammengebaut Nach Betaetigung von S3 = Start-Taster faehrt der NIBO nach 5 sek los Generell soll der NIBO2 2sek lang stehenbleiben, dann losfahren solange vorwaerts fahren, bis er 120 Ticks gemacht hat 2sek lang stehenbleiben solange rueckwaerts fahren, bis er die Ausgangsposition 0 Ticks erreicht hat beim Rueckwaertsfahren solange fuer je 0,5 sek blinken und hupen und danach 0,5 sek ruhig sein, bis er die Ausgangsposition wieder erreicht hat Sound-Ausgabe - alle 1ms wird ein Impuls OCR0 (TIMER0) erzeugt und auf den Lautsprecher gegeben: wird aktiv geschaltet => activate_output_bit(IO_AUDIO); == DDRB = _BV(4) erhält mit OCR0-Toggeln "1" Signal => set_output_bit(IO_AUDIO); == TCCR0 |= (1<<COM00); erhält mit OCR0-Toggeln "0" Signal => clear_output_bit(IO_AUDIO); == TCCR0 &=~ (1<<COM00); wenn er beim Vorwaertsfahren ein Hindernis erkennt, faehrt er wieder zurueck */ #include <nibo/niboconfig.h> #include <nibo/display.h> #include <nibo/gfx.h> #include <nibo/copro.h> #include <nibo/delay.h> #include <nibo/iodefs.h> #include <nibo/bot.h> #include <nibo/spi.h> #include <nibo/floor.h> #include <nibo/pwm.h> #include <nibo/leds.h> #include <avr/interrupt.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <inttypes.h> volatile uint16_t zaehler0_t1; /* 16-bit zaehler0_t1 von TIMER0 => zaehlt 1ms */ volatile uint16_t zaehler0_t2; /* 16-bit zaehler0_t2 von TIMER0 NOT USED */ volatile uint8_t zaehler0_t3; /* 8-bit zaehler0_t3 von TIMER0 zaehlt 1ms*/ char text[20]; /* Speicherplatz fuer text */ void start(); /* Start-Routine */ void init_timer0(); /* Funktion fuer die Initialisiserung von TIMER0 */ void init_sound(); /* Funktion fuer die Initialisierung der Sound-Ausgabe */ uint8_t check_stop(); /* Initialisierung der sound-ausgabe */ void init_sound() { activate_output_bit(IO_AUDIO); /* DDRB = _BV(4) */ } /* Timer 0; CTC-mode, C=f*t*P <256 da 8-bit-timer; f=16Mhz, t=1ms => 1 kHz -> prescaling 1/64 ->OCR0 = 250 */ /* Funktion init _timer0()*/ void init_timer0(){ TCNT0=0; OCR0 = 249; /* soll alle 1ms resetten ..*/ TCCR0 |= (1<<CS02); TCCR0 &=~ (1<<CS01); TCCR0 &=~ (1<<CS00); TCCR0 |= (1<<WGM01); TCCR0 &=~ (1<<WGM00); TIMSK |= (1<<OCIE0); } /* ISR fuer den Timer0 */ ISR(TIMER0_COMP_vect){ /* Aufruf alle 1ms - siehe init_timer0() */ zaehler0_t1++; /* 16-bit - allgemeiner Zeit-Zaehler*/ zaehler0_t2++; /* 16-bit - Zaehler Blinken/Hupen rueckwaerts*/ zaehler0_t3++; /* 8-bit - Zaehler fuer Senden alle 40 ms */ if(zaehler0_t1 > 65330) zaehler0_t1 = 0; if(zaehler0_t2 > 65330) zaehler0_t2 = 0; if(zaehler0_t3 > 250) zaehler0_t3 = 0; } /* das Hauptprogramm.... */ int main() { sei(); /* Interrupts global aktiviert */ bot_init(); /* zuerst bot_init(), dann erst spi_init()!!! */ spi_init(); /* spi_init() erst NACH bot_init()!! */ if (display_init()!=0) { leds_set_displaylight(500); if (display_type==2) { gfx_init(); } } pwm_init(); /* Initialisierung des pwm-timer1 */ leds_init(); /* Initialisierung der LEDs */ init_timer0(); /* timer wegen sound-ausgabe */ init_sound(); /* Initialisierung fuer sound-ausgabe */ int16_t speed[4]; /* speed[0]..speed[3] Motorsolldrehzahlen vor- und reckwaerts */ int16_t ticks_ahead; /* Referenzwert fuer die Ticks vorwaerts - max Tick ahead */ int16_t ticks_astern; /* Referenzwert fuer die Ticks zurueck - max Tick astern*/ uint8_t merker; /* Merker fuer die Weiterschaltbedingungen */ int8_t diff_ticks; merker = 1; speed[0] = 20; /* speed[0] = Motor links vorwaerts */ speed[1] = 20; /* speed[1] = Motor rechts vorwaerts */ speed[2] = -20; /* speed[2] = Motor links rueckwaerts */ speed[3] = -20; /* speed[3] = Motor rechts rueckwaerts */ ticks_ahead = 120; /* max ticks vorwaerts */ ticks_astern = 0; /* max ticks zurueck */ copro_ir_startMeasure(); copro_setSpeedParameters(5, 6, 7); leds_set_status_intensity(512); start(); /* Aufruf der Start-Routine */ while(1){ bot_update(); copro_update(); /* merker = 1 => Sollwert VORWAERTS, setze merker = 2 merker = 2 UND IST_TICKS >= SOLL_TICKS => STOP, setze merker = 3 merker = 3 UND 2sek WARTE => Sollert ZURUECK, setze merker = 4 merker = 4 und merker = 5 nur fuers blinken und hupen beim Rueckwaertsfahren merker = 4 ODER merker = 5 UND IST_TICKS <= SOLL_TICKS => STOP, setze merker = 7 merker = 7 und 2sek WARTE => setze merker = 1 */ /* NIBO soll mit speed losfahren */ if (merker == 1){ copro_setSpeed(speed[0],speed[1]); /* Geschwindigkeit für die beiden Motoren setzen. */ merker = 2; /* setze merker =2 fuer die naechste if-Abfrage */ } /* wenn NIBO die Vorwaerts-Endposition ereicht hat, soll er stehen bleiben */ if ((copro_ticks_l >= ticks_ahead)&&(copro_ticks_r >= ticks_ahead)){ if(merker == 2){ /* nur wenn VORHER gefahren wurde, ist Merker 2 gesetzt! */ copro_stop(); merker = 3; cli(); zaehler0_t2 = 0; /* setze den zaehler0_t2 zurueck */ sei(); } } /* NIBO soll nach den 2 sek rueckwaerts fahren, hupen und blinken */ if ((zaehler0_t2 >= 2000)&&(merker == 3)){ copro_setSpeed(speed[2], speed[3]); /*fahre mit 7cm/sek rueckwaerts */ TCCR0 |= (1<<COM00); /* Signal an Lautsprecher => EIN */ merker = 4; /* setze merker =4 fuer die naechste if-Abfrage */ leds_set_status(LEDS_RED, 0); /* linke rueckwaertige LED an */ leds_set_status(LEDS_RED, 1); /* rechte rueckwaertige LED an */ cli(); zaehler0_t2 = 0; /* setze den zaehler0_t2 zurueck */ sei(); } /* nach 0,5sek soll NIBO schweigen */ if ((zaehler0_t2 >= 500)&&(merker == 4)){ TCCR0 &=~ (1<<COM00); /*Signal an Lautsprecher => AUS */ merker = 5; leds_set_status(LEDS_OFF, 0); /* linke hintere LED AUS */ leds_set_status(LEDS_OFF, 1); /* rechte hintere LED AUS */ } /* nach 1,0sek soll NIBO wieder hupen und blinken */ if ((zaehler0_t2 >= 1000)&&(merker == 5)){ TCCR0 |= (1<<COM00); /* Signal an Lautsprecher => EIN */ merker = 4; leds_set_status(LEDS_RED, 0); /* linke rueckwaertige LED an */ leds_set_status(LEDS_RED, 1); /* rechte rueckwaertige LED an */ cli(); zaehler0_t2 = 0; /* setze den zaehler0_t2 zurueck */ sei(); } /* wenn NIBO die Rueckwaerts-Endposition ereicht hat, soll er stehen bleiben */ if ((copro_ticks_l <= ticks_astern)&&(copro_ticks_r <= ticks_astern)){ if((merker == 4)||(merker == 5)){ TCCR0 &=~ (1<<COM00); /*Signal an Lautsprecher => AUS */ copro_stop(); /* anhalten */ merker = 7; leds_set_status(LEDS_OFF, 0); /* linke hintere LED AUS */ leds_set_status(LEDS_OFF, 1); /* rechte hintere LED AUS */ cli(); zaehler0_t2 = 0; sei(); } } /* nach 2sek soll NIBO wieder fahren */ if ((zaehler0_t2 >= 2000)&&(merker == 7)){ merker = 1; } /* Oha, da ist was im Weg...wir muessen zurueck...*/ if((merker==1)||(merker == 2)){ /* NIBO faehrt vorwaerts */ if(check_stop() == 1)merker = 3; /* Check Abstand => Stopp und fahr zurueck */ } /* check,ob Gleichlauf...*/ diff_ticks = copro_ticks_l - copro_ticks_r; /* diff_ticks > 0 => links schneller*/ if(merker == 2){ /* NIBO faehrt vorwaerts...=> Versuch des Gleichlaufs */ copro_setSpeed(speed[0],speed[1]); if((diff_ticks >= 1)||(diff_ticks <=-1))copro_setSpeed(speed[0] - diff_ticks,speed[1]); } if(merker == 4){ /* NIBO faehrt rueckwaerts ...=> Versuch des Gleichlaufs */ copro_setSpeed(speed[2],speed[3]); if((diff_ticks >= 1)||(diff_ticks <=-1)) copro_setSpeed(speed[2] - diff_ticks,speed[3]); } } return 0; } /* --- Fkt zum Stoppen wg zu kleinem Abstand ----------*/ uint8_t check_stop(){ uint8_t stop; stop = 0; if((copro_distance[4]/128 > 150) ||(copro_distance[3]/128 > 150)||(copro_distance[2]/128 > 150) || (copro_distance[1]/128 > 150) ||(copro_distance[0]/128 > 150)){ copro_stop(); stop = 1; cli(); zaehler0_t2 = 0; /* setze den zaehler0_t2 zurueck */ sei(); } return stop; } /*--- Start-Routine ___*/ void start(){ int i; gfx_fill(0x00); gfx_move(30, 10); gfx_set_proportional(1); gfx_print_text("Nibo2 - Hallo"); gfx_set_proportional(0); gfx_move(5, 25); gfx_print_text("Start des Programmes"); gfx_move(5, 40); gfx_print_text("mit Taster S3 -->"); deactivate_output_bit(IO_INPUT_1); while(get_input_bit(IO_INPUT_1)){ /*S3 Starttaster nicht betaetigt = "1"*/ } /* warte */ gfx_move(5, 40); /*S3 Starttater wurde betaetigt...*/ gfx_print_text(" "); gfx_move(5, 40); for (i = 5; i > 0;){ /* Countdown (5sek) bis gestartet wird...*/ sprintf(text, "in %i Sekunden", i); gfx_move(5, 40); gfx_print_text(text); if(i == 5) IO_LEDS_RED_PORT = 0xFC; /* LEDs 2,3,4,5,6,7 rot AN */ if(i == 4) IO_LEDS_RED_PORT = 0x78; /* LEDs 3,4,5,6 rot AN */ if(i == 3) IO_LEDS_RED_PORT = 0x30; /* LEDs 4,5 rot AN */ if(i == 2) { IO_LEDS_RED_PORT = 0x30; /* LEDs 4,5 rot AN */ IO_LEDS_GREEN_PORT = 0x30; /* LEDs 4,5 gruen AN */ } if(i == 1){ IO_LEDS_GREEN_PORT = 0x30; /* LEDs 4,5 gruen AN */ IO_LEDS_RED_PORT = 0x00; /* LEDs 4,5 rot AUS */ } i--; delay(1000); /* warte 1 sek */ } IO_LEDS_GREEN_PORT = 0x00; /* LEDs 4,5 gruen AUS */ gfx_fill(0x00); }
Compiler results:
Werbung
Online
Marinauvj
Marinavuc
warrenhinder6456