Projekte
BirgerT
nibo2_hardwarecheck
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_hardwarecheck
main.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
7426 private projects
385 public projects
16180353 lines compiled
58212 builds
NIBO
@
nibo2_hardwarecheck/main.c [read only]
/* NIBO2 C project */ /* NIBO 2 Tutorial Sensoren und Akkusppanung */ #include <stdlib.h> // Umwandlung einer Fließkommazahl in eine Zeichenkette #include <stdio.h> // sprintf #include <avr/io.h> //ATmega128 #include <avr/interrupt.h> // Interrupts #include <avr/pgmspace.h> // FLASH #include <avr/eeprom.h> // EEPROM #include "nibo/niboconfig.h" #include "nibo/iodefs.h" // mit den Makros aus iodefs.h lassen sich eigene Makros kreieren #define toggle_output_bit(NAME) _PPCAT(NAME,_PORT) ^= (unsigned char)_BV(_PPCAT(NAME,_BIT)) // HEADLIGHT EIN, AUS und TRUE wenn eingeschaltet #define head_on set_output_bit(IO_LED_WHITE) #define head_off clear_output_bit(IO_LED_WHITE) #define head_is_on (1<<IO_LED_WHITE_BIT == get_output_bit(IO_LED_WHITE)) // DIPLAYLIGHT EIN, AUS und TRUE wenn eingeschaltet #define disp_on set_output_bit(IO_DISP_LIGHT) #define disp_off clear_output_bit(IO_DISP_LIGHT) #define disp_is_on (1<<IO_DISP_LIGHT_BIT == get_output_bit(IO_DISP_LIGHT)) #include "nibo/delay.h" #include "nibo/display.h" #include "nibo/gfx.h" // fehlende defines in gfx.h #define GFX_DISP_WIDTH 128 #define GFX_DISP_HEIGHT 64 #include "nibo/spi.h" #include "nibo/copro.h" #include "nibo/adc.h" #include "nibo/floor.h" #include "nibo/leds.h" #include "nibo/pwm.h" #include "nibo/bot.h" // Hilfsmakro setzt die übergebenen Parameter zu einem Ausdruck zusammen #define _XCAT(x,a,b,c,d,e,f,g,h) x##a##b##c##d##e##f##g##h // erzeugt zwei XBM Grafikbytes und tauscht HighNibble und LowNibble // XBM16(0,1,0,1,1,0,1,0,0,0,1,1,1,1,0,0) -> 0b10100101,0b11000011 //#define XBM16(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p) (uint8_t) _XCAT(0b,e,f,g,h,a,b,c,d),(uint8_t) _XCAT(0b,m,n,o,p,i,j,k,l) /* Vorlage für ein 16x16 Icon #define xbm_icon16_width 16 #define xbm_icon16_height 16 static unsigned char xbm_icon16_data[] PROGMEM = { XBM16(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), XBM16(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), XBM16(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), XBM16(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), XBM16(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), XBM16(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), XBM16(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), XBM16(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), XBM16(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), XBM16(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), XBM16(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), XBM16(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), XBM16(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), XBM16(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), XBM16(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), XBM16(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0) }; */ // das funktioniert entgegen der Definitin aber so: #define XBM16(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p) (uint8_t) _XCAT(0b,h,g,f,e,d,c,b,a),(uint8_t) _XCAT(0b,p,o,n,m,l,k,j,i) // Akku als XBM Grafik #define xbm_akku_width 16 #define xbm_akku_height 14 //static unsigned char xbm_akku_data[] PROGMEM = { const unsigned char xbm_akku_data[] PROGMEM = { XBM16(0,1,1,1,1,1,0,0,0,0,1,1,1,1,1,0), XBM16(0,1,0,1,0,1,0,0,0,0,1,0,1,0,1,0), XBM16(0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0), XBM16(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1), XBM16(1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1), XBM16(1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1), XBM16(1,0,1,1,1,0,0,0,0,0,0,1,1,1,0,1), XBM16(1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1), XBM16(1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1), XBM16(1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1), XBM16(1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1), XBM16(1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1), XBM16(1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1), XBM16(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1) }; // Ausgabeposition //#define xbm_akku_left (GFX_DISP_WIDTH - xbm_akku_width) / 2 //#define xbm_akku_top 6 #define xbm_akku_left 105 #define xbm_akku_top 8 // Spannungswerte // Wert bei leeren Akkus (Akkuspannung 8V) #define BOT_SUPPLY_LOW_LIMIT 505 // Wert bei frisch geladenen Akkus (10,4V) #define BOT_SUPPLY_TOP_LIMIT 665 // Differenz zwischen TOP und LOW -> 0..9 #define BOT_SUPPLY_CHARGE (BOT_SUPPLY_TOP_LIMIT - BOT_SUPPLY_LOW_LIMIT) void draw_akku() { // Akkugrafik gfx_move(xbm_akku_left, xbm_akku_top); gfx_draw_mode(GFX_DM_JAM2); // ueberschreiben gfx_draw_xbm_P(xbm_akku_width, xbm_akku_height, (PGM_P) xbm_akku_data); // Spannung Ladezustand uint8_t charge = (BOT_SUPPLY_CHARGE + (10 * (bot_supply - BOT_SUPPLY_LOW_LIMIT))) / BOT_SUPPLY_CHARGE; gfx_draw_mode(GFX_DM_COMP); // XOR schreiben gfx_move(xbm_akku_left+1, xbm_akku_top + 13 - charge); gfx_box(xbm_akku_width - 2, charge); } // SetBit(Port/Variable,BitNr) Bit #b in Variable p setzen #define SetBit(p,b) (p) |= (1<<b) // ClrBit(Port/Variable,BitNr) Bit #b in Variable p loeschen #define ClrBit(p,b) (p) &= ~(1<<b) // InvBit(Port/Variable,BitNr) Bit #b in Variable p toggeln #define InvBit(p,b) (p) ^= (1<<b) // GetBit(Port/Char,BitNr) Bit #b in Variable p abfragen // Return 0 == Bit geloescht, Return 1 == Bit gesetzt #define GetBit(p,b) (((p) >> (b)) & 1) // Grenzwert für Distanzsensoren #define DIST_LIMIT 0x80 // Merker Tastenstatus volatile uint8_t binaer_in = 0; // aktueller Zustand volatile uint8_t binaer_inS; // Bit gesetzt bei Flanke 0->1 volatile uint8_t binaer_inF; // Bit gesetzt bei Flanke 1->0 // Tasten Bitpositionen #define BIN_DRS 0 // Distanz Rechts Seite #define BIN_DRF 1 // Distanz Rechts Front #define BIN_DF 2 // Distanz Front #define BIN_DLF 3 // Distanz Links Front #define BIN_DLS 4 // Distanz Links Seite #define BIN_SW3 5 // Taster SW3 void update_data (void) { // Boden- u. Liniensensorwerte aktualisieren.. floor_update(); for(uint8_t i = 0; i<4; i++) { // ..und auf 0..255 normalisieren floor_absolute[i] = floor_absolute[i] /8; if(floor_absolute[i] >255) floor_absolute[i] = 255; floor_relative[i] = floor_relative[i] /8; if(floor_relative[i] >255) floor_relative[i] = 255; } /* Flankenerkennung Binärsignale Vorheriger Zustand 0 0 1 1 aktueller Zustand 0 1 0 1 steigende Flanke 0 1 0 0 fallende Flanke 0 0 1 0 */ // Merker für Eingabe Status vorbereiten binaer_inF = binaer_in; binaer_inS = ~binaer_in; // Distanzsensoren aktualisieren.. copro_update(); for(uint8_t i = 0; i<5; i++) { // ..und auf 0..255 normalisieren copro_distance[i] = copro_distance[i] /256; if(copro_distance[i] > 255) copro_distance[i] = 255; // Distanzsensoren als Eingabe Taster bentuzen if(copro_distance[i] > DIST_LIMIT) SetBit(binaer_in,i); else ClrBit(binaer_in,i); } // Akku Spannung messen bot_update(); // Switch S3 in Eingabestatus merken if((1<<IO_INPUT_1_BIT) == get_input_bit(IO_INPUT_1)) ClrBit(binaer_in,BIN_SW3); else SetBit(binaer_in,BIN_SW3); binaer_inS &= binaer_in; // Bits für Flanke 0->1 maskieren binaer_inF &= ~binaer_in; // Bits für Flanke 1->0 maskieren // Statusanzeige Distanzsensor betätigt uint8_t j = 0; // Index Sensorwert // 6 LEDs ansteuern for(uint8_t i = 0; i<6; i++) { if(GetBit(binaer_in,j)) leds_set_status(1,7-i); else leds_set_status(0,7-i); // Frontsensor = beide vorderen StatusLEDs if(i!=2) j++; } } char text[]="-- -- -- -- -- -- -- -- -- "; void print_volts() { // Spannungsanzeige mit Semi Fliesskomma /* Bei Spannung < 8 V wird aufgrund Überlauf zuviel angezeigt uint8_t volt = (bot_supply - BOT_SUPPLY_LOW_LIMIT); // Low Limit bei 8,0V volt = volt /6 +80; // 60 Schritte / V + 8 Volt */ // 05.05.12 Begrenzung der Anzeige int16_t volt = (bot_supply - BOT_SUPPLY_LOW_LIMIT); // Low Limit bei 8,0V if(volt >= 0) { volt = volt /6 +80; // 60 Schritte / V + 8 Volt sprintf(text, "BATT: %2d.%1dV %3dS ", volt/10, volt%10, bot_supply); gfx_move(1, 12); gfx_print_text(text); } else { gfx_move(1, 12); gfx_print_text("AKKU LEER oder DEFEKT"); } } void test1_print() { // Ueberschreibmodus gfx_draw_mode(GFX_DM_JAM2); // Titelzeile gfx_move(0, 0); gfx_set_proportional(1); gfx_print_text("SENSORIK TEST 1 "); // Ueberschreibmodus invers gfx_draw_mode(GFX_DM_JAM2_INV); gfx_print_text(" SW3=WEITER "); // Weiter mit S3 gfx_set_proportional(0); // Ueberschreibmodus gfx_draw_mode(GFX_DM_JAM2); // Bodensensoren (Werte normalisiert 0,,255) sprintf(text, "FL abs: %02x %02x %02x %02x ", (uint16_t)floor_absolute[FLOOR_RIGHT], (uint16_t)floor_absolute[LINE_RIGHT], (uint16_t)floor_absolute[LINE_LEFT], (uint16_t)floor_absolute[FLOOR_LEFT]); gfx_move(1, 30); gfx_print_text(text); sprintf(text, "FL rel: %02x %02x %02x %02x ", (uint16_t)floor_relative[FLOOR_RIGHT], (uint16_t)floor_relative[LINE_RIGHT], (uint16_t)floor_relative[LINE_LEFT], (uint16_t)floor_relative[FLOOR_LEFT]); gfx_move(1, 40); gfx_print_text(text); // Co-Prozessor Distanzsensoren (Werte 0..255) sprintf(text, "DIST: %02x %02x %02x %02x %02x ", (uint16_t)copro_distance[0], (uint16_t)copro_distance[1], (uint16_t)copro_distance[2], (uint16_t)copro_distance[3], (uint16_t)copro_distance[4]); gfx_move(1, 55); gfx_print_text(text); print_volts(); } void test1_input() { // Mit Frontsensor werden die Scheinwerfer ein- und ausgeschaltet if(GetBit(binaer_inS,BIN_DF)) InvBit(binaer_in,7); // Zustand merken if(GetBit(binaer_in,7)) leds_set_headlights(1024); // Licht Ein Aus else leds_set_headlights(0); } #define SPEEDLIMIT 80 int16_t spl = 0; int16_t spr = 0; void test2_print() { // Ueberschreibmodus gfx_draw_mode(GFX_DM_JAM2); // Titelzeile gfx_move(0, 0); gfx_set_proportional(1); gfx_print_text("SENSORIK TEST 2 "); // Ueberschreibmodus invers gfx_draw_mode(GFX_DM_JAM2_INV); gfx_print_text(" SW3=WEITER "); // Weiter mit S3 gfx_set_proportional(0); // Ueberschreibmodus gfx_draw_mode(GFX_DM_JAM2); // Speed Sollwert (0..80) sprintf(text, "%05d SPEED W %05d ", (int16_t)spr, (int16_t)spl); gfx_move(1, 23); gfx_print_text(text); // Speed Istwert (0..80) sprintf(text, "%05d SPEED X %05d ", (int16_t)copro_speed_r, (int16_t)copro_speed_l); gfx_move(1, 33); gfx_print_text(text); // Ticks counter (-32..+32 Tausend) sprintf(text, "%05d TICKS %05d ", (int16_t)copro_ticks_r, (int16_t)copro_ticks_l); gfx_move(1, 43); gfx_print_text(text); // Motorstrom ca.1..3 im Leerlauf bis 25 "bergauf" sprintf(text, "%05d CURRENT %05d ", (int16_t)copro_current_r, (int16_t)copro_current_l); gfx_move(1, 55); gfx_print_text(text); print_volts(); } void test2_input() { // mit seitlichen Distanzsensoren die Speed Sollwerte aendern if(GetBit(binaer_in,BIN_DLF) && (spl < SPEEDLIMIT)) spl++; if(GetBit(binaer_in,BIN_DLS) && (spl >-SPEEDLIMIT)) spl--; if(GetBit(binaer_in,BIN_DRF) && (spr < SPEEDLIMIT)) spr++; if(GetBit(binaer_in,BIN_DRS) && (spr >-SPEEDLIMIT)) spr--; // Mit Frontsensor werden die Motoren gestoppt if(GetBit(binaer_in,BIN_DF)) {spl = 0; spr = 0;} copro_setSpeed(spl,spr); } void test_dummy() { } uint8_t page = 0; void print_page(void){ switch(page) { case 0 : test1_print(); break; case 1 : test2_print(); break; } } void get_input(void){ switch(page) { case 0 : test1_input(); break; case 1 : test2_input(); break; default : page = 0; } //Mit Taster SW3 gehts weiter if(GetBit(binaer_inF,BIN_SW3)) { page++ ; gfx_fill(0x00); } } void drive_output(void){ switch(page) { case 0 : test_dummy(); break; } } int main() { leds_init(); pwm_init(); bot_init(); spi_init(); floor_init(); // floor_readPersistent(); schon in floor_init() display_init(); gfx_init(); leds_set_displaylight(1024); delay(10); copro_ir_startMeasure(); // Zeitbasis Umlaufverzoegerung uint8_t scheduler = 0; while (1==1) { delay(1); // das muss hier rein ?! // sonst funzt das IF.. nicht // Zeitbasis 125Hz = 8ms if(1 == (uint8_t) ((pwm_timer_ms / 8) & 1)) { switch(scheduler++) { case 0: update_data(); break; case 1: print_page(); break; case 2: get_input(); break; case 3: drive_output(); break; default: scheduler = 0; } // switch } // if(pwmtimer_ms) } // while return 0 ; }; // main
Compiler results:
Werbung
Online
agrohimnbr
sharyl94996859703161