Projekte
BirgerT
nibo2_fork#01
main.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_fork#01
BSD_license.h
bt_lib_debugutil.c
bt_lib_debugutil.h
bt_lib_glcd.c
bt_lib_glcd.h
bt_lib_grafix.c
bt_lib_grafix.h
bt_lib_terminal.c
bt_lib_terminal.h
bt_lib_uart.c
bt_lib_uart.h
bt_lib_utils.h
lumpylumpy.h
main.c
nibo2_audio.c
nibo2_audio.h
nibo2_copro.c
nibo2_copro.h
nibo2_copro_cmd.h
nibo2_font.h
nibo2_global.h
nibo2_main_menu.h
nibo2_pwm_leds.c
nibo2_pwm_leds.h
nibo2_register.c
nibo2_register.h
nibo2_sensors.c
nibo2_sensors.h
test_debugutil.h
test_gfx_draw.h
xmas1.h
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
7426 private projects
385 public projects
16180353 lines compiled
58212 builds
NIBO
@
nibo2_fork_01/main.c [read only]
/* NIBO2 C project */ ////////////////////////////////////////////////////////////////////////// // // NIBO2 FORK // // (c) Birger Töpelmann toepelmann(A)web.de Version 141005a // // Das Hauptprogramm mit der MAIN Function aus der die diversen // Funktionen aufgerufen werden. // // In nibo2_global.h werden bereits sämtliche Bibliotheks- // header eingebunden sowie einige Makros und Typen definiert. // // MAIN // - Initialisierung der Komponenten in deren INIT Funktionen // - Menue Programm, Statusanzeigen, Startsignal // - Die Mainloop soll alle 100ms einmal durchlaufen werden und // wesentlich weniger als 100ms MCU Rechenzeit benötigen. // // Es dürfen keine blockierenden Delays() oder Warte(Bedingung)-Schleifen // programmiert werden, die länger als wenige milliSekunden dauern - // Stichwort Kooperatives Multitasking. // // FUNKTION MAIN_ZYKLUS // Anfang und Ende jedes Schleifendurchlaufs. In dieser Funktion // werden nach jedem Durchlauf einer Programmschleife Funktionen mit // niedrigerer Priorität so oft / solange ausgeführt, bis die 100ms // Zykluszeit erreicht sind: // - Fortsetzen der (String-)Ausgabe an die Buffer für die UARTs, // die Soundausgabe, // - Erzeugung der Sekundenimpulse // - Kopieren der Statusflags // // Zeitkritische Funktionen werden über Timerinterrupts bzw. über den // SPI Transceive Interrupt abgearbeitet. // // ////////////////////////////////////////////////////////////////////////// // // BSD License see "license.h" #include "BSD_license.h" // // // NIBO2_GLOBAL: // - Einbinden aller erforderlichen Bibliotheksheader // - Globale Definitionen und Makros // // Diese Datei muss in jedes Programmmodul eingebunden werden. // #include "nibo2_global.h" // // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! // !! Resourcen Fresser: // Für "normales" Nibo2 Programm folgende Zeile auskommentieren #include "test_debugutil.h" // // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! // Statusmerker des Hauptprogramms enum main_states { STARTUP = 0, RUNNING = 40, RUN_REMOTE, RUN_EVADE, RUN_TOUR, RUN_WALL, RUN_SLALOM, AKTIONS = 100, BACK_LEFT, BACKWARD, BACK_RIGHT, TURN_LEFT, STEP_BACK, TURN_RIGHT, FORW_LEFT, FORWARD, FORW_RIGHT, STOPPED, ERRORS = 200, ERR_BATT, ERR_STROM }; uint8_t main_state = 0; uint8_t last_state = 0; uint8_t temp_state = 0; // ////////////////////////////////////////////////////////////////////////// // // MAIN ZYKLUS // // "Delay"-Funktion zum Erreichen einer fixen Zykluszeit. // -> zeit = abzuwartender Zeitpunkt in ms, nach dem letzten Aufruf // ////////////////////////////////////////////////////////////////////////// // void main_zyklus(uint8_t zeit){ sei(); // Zeitdauer der Mainloop für spätere Ausgabe merken pwm.cmain = pwm.cycle; // ´Mainzyklus Maxwert für Diagnose/Debugging if (pwm.cycle > pwm.cmax) { pwm.cmax = pwm.cycle; } glcd_enable(0xff); // das muss noch in glcd-lib programm eingebaut werden do { /////////////////////////////////////////////////////////////////////////// BAUSTELLE: // // // GLCD Buffer an das GLCD ausgeben (dauert komplett ca. 12ms) if (glcd_enabled()!=0) { glcd_ISR(); // static inline in bt_lib_glcd.h // delay_us(5); } else { glcd_enable(0xff); // das muss noch in glcd-lib programm eingebaut werden } // Stringausgaben an UARTs fortsetzen uart0_txd_strP(0); uart0_txd_str(0); // Stringausgaben an GLCD fortsetzen gfx_ansi_strP(0); // Sound weiter spielen audio_play_song_P(0); // Zeitdauer der gesamten Mainloop merken pwm.clast = pwm.cycle; // Warten bis feste Zykluszeit erreicht } while(pwm.cycle < zeit); // // /////////////////////////////////////////////////////////////////////////// BAUSTELLE: pwm.cycle -= zeit; // Sekundentakt: // bei einem Sekundenwechsel enthält pwm.sec_tick die Sekunden 1..60 // immer nur in dem main_zyklus, der dem Sekundenwechsel folgt. if (pwm.slast != pwm.sec) { pwm.slast = pwm.sec; pwm.sec_tick = 1 + pwm.sec; } else { pwm.sec_tick = 0; } } ////////////////////////////////////////////////////////////////////////// // // MAIN MENU // // Startbildschirm ausgeben an GLCD // Wenn Zeichen über UART empfangen werden{ // Wenn Zeichen fehlerhaft{ // UART Settings aussenden // } // Startbildschirm über UART ausgeben // // Menuwahl Eingabesensorik // Menu Navigation = Odometrie (am Rad drehen) + SW3 // oder = Cursortastencodes // oder = Infrarot Fernbedienung // // // ////////////////////////////////////////////////////////////////////////// // #include "nibo2_main_menu.h" // ////////////////////////////////////////////////////////////////////////// // // MAIN INIT // // Funktionen zur ersten Initialisierung der NIBO2 Resourcen // ////////////////////////////////////////////////////////////////////////// // int main() { // Timer1 = Systemuhr und PWM Generator für die LED Helligkeit // Server für 10ms Serviceroutinen starten pwmleds_init(); // in nibo2_pwm_leds sei(); // #ifdef _TEST_DEBUG_H_ ///////////////////// DEBUG UTIL FUNKTIONSAUFRUF ? // // ein paar Experimente vor der eigentlichen Initialisierung, // nur mit UART0 - siehe in "test_debugutil.h" // uart0_init(0x8801); // Terminal UART0 = 38400,8,n,1 #include "test_debugutil.h" // #endif /////////////////////////////////////////////////////////////////// // // pwm_leds(80); // Vorlage für EEPROM Debugging // Settings aus dem EEPROM laden if (register_init()==0) { LED_SET(LED_RD,7); // EEPROM CRC-Error } else { LED_SET(LED_GN,7); // EEPROM Daten i.O. } // DUO-LED Helligkeit setzen pwm_leds(eep_param.pwm_leds); // Das Grafik LCD initialisieren, und Hintergrundbeleuchtung glcd_init(); // in nibo2_glcd pwm_lcd(eep_param.pwm_glcd); // Bodensensoren (ADC), EXT3 Pins, SW3 sensors_init(); // in nibo2_sensors // UARTs mit gespeicherten Parametern initialisieren // uart0_init(0x6801); // Terminal UART0 = 19200,8,n,1 uart0_init(eep_param.uart0_set); uart1_init(eep_param.uart1_set); // Kommunikation mit dem CoProzessor (MotorController) copro_init(); // in nibo2_copro.h // Timer0 = Pieper PWM und ersten RTTTL Song abspielen audio_init(); // in nibo2_audio.h audio_play_song_P(audio_start_titel_P(3)); ////////////////////////////////////////////////////////////////////////// // // Programmverzweigung nach Reset und vor der Hauptschleife: // // 1.- SW3 drücken und halten // 2.- Reset drücken oder Einschalten // 3.- SW3 loslasssen // -> zum Setup- / Testprogramm // ////////////////////////////////////////////////////////////////////////// // Ist Taster SW3 beim Start gedrueckt.. if(SW3_DOWN){ // ...warte bis SW3 losgelassen.. while(SW3_DOWN){ delay_ms(10); // Entprellen } // TODO: CoPro Hexfile in CoPro flashen // ..zur Initializer Routine // nibo2_init(); // EEPROM Daten mit Standardwerten initialisieren register_update(); } // ////////////////////////////////////////////////////////////////////////// // // Startbildschirm anzeigen und warten auf das "GO" aus dem Menue // // 1.- SW3 drücken, halten // 2.- Reset oder Einschalten // 3.- SW3 loslasssen // -> zum Setup- / Testprogramm // ////////////////////////////////////////////////////////////////////////// term_dev = GLCD; pwm.cycle = 0; pwm_lcd(60); uart0_init(0x8801); // 38400 Baud //-------------------------------------------------------------------------- für das GFX Experiment uart0_txd_strP(PSTR("\x1b""2c")); // Terminal Reset do { main_zyklus(100); // L2RI; //-------------------------------------------------------------------------- das GFX Experiment // terminal_grafix(); #if 1 // UART0 Settings im Sekundentakt auf UART0 senden if ((pwm.sec_tick != 0) && (mnu_uart_state == MNU_START)) { char tempstr[]= "was is denn hier los"; tempstr[0] = '\n'; uart0_info(tempstr+1); uart0_txd_str(tempstr); L3GI; } #endif main_state = main_menue(main_state); } while (main_state < RUNNING); pwm_head(80); /* gfx_drawmode(GFX_DM_TERM); gfx_gotoXY(0,0); gfx_print_str_P(PSTR("123456789012345678901")); gfx_gotoXY(0,8); gfx_print_str_P(PSTR("ABCDEFGHIJKLMNOPQRSTU")); */ // Warten auf SW3 gedrueckt.. int8_t count = 0; pwm.cycle = 0; gfx_drawmode(GFX_DM_TERM); gfx_fill(0); // gfx_ansi_strP(PSTR(ESC"2c"CUP(4,8) DHO "SW 3" CUP(5,8) DHU "SW 3")); gfx_ansi_strP(PSTR(ESC"2c"CUP(4,8) DHO "SW 3")); while(!SW3_DOWN){ // Aktion bei Warten auf SW3 gedrückt main_zyklus(100); if (pwm.sec_tick) { LED_SET(LED_GN,2); pwm_lcd(100); } else { LED_CLR(LED_GN,2); pwm_lcd(10); } } // Warten auf SW3 wieder frei.. while(SW3_DOWN){ delay_ms(10); } pwm_lcd(50); gfx_fill(0); // uint8_t tastmerker = 0; // uint8_t pwmsec = 0; // uint8_t pwmcyc = 0; // uint8_t prnscr = 0; // ////////////////////////////////////////////////////////////////////////// // // MAIN LOOP // ////////////////////////////////////////////////////////////////////////// // pwm.cycle = 0; // Reset Zeitbasis Umlaufverzoegerung in ms uint8_t titel = 1; uint8_t zeile = 1; while(1==1) { main_zyklus(100); if ((pwm.sec_tick %20) == 1) { L3RI; if (titel > 9) { titel = 1; } gfx_drawmode(GFX_DM_TERM); gfx_gotoXY(1,zeile*8); gfx_print_char(' '); if (zeile++ >5 ) { zeile = 1; } if (Audio_Status == READY) { gfx_gotoXY(1,zeile*8); gfx_print_str_P(PSTR("* ")); audio_show_titel_P(10, zeile * 8, audio_start_titel_P(titel)); audio_play_song_P(audio_start_titel_P(titel++)); } } ////////////////////////////////////////////////////////////////////////// // // HAUPTSCHLEIFE ENDE // ////////////////////////////////////////////////////////////////////////// // } // while return 0 ; }; // main // EOF
Compiler results:
Werbung
Online
candidaharrell99753
chasitycraddock1
leonelb389687792836
nelsonleeson85120051
Rob98
warrenhinder6456