Ich habe nun wie vorgeschlagen die I2C Buffer Size definiert. Der Fehler ist nun weg, jedoch habe ich nun 5 neue!
c:50: undefined reference to `i2c_init'
c:51: undefined reference to `lcd_init'
c:52: undefined reference to `lcd_setBacklight'
c:131: undefined reference to `lcd_setCursor'
c:136: undefined reference to `lcd_setCursor'
Code:
#define I2C_BUF_SIZE 32
#include <nibobee/iodefs.h>
#include <nibobee/usart.h>
#include <nibobee/motpwm.h>
#include <nibobee/analog.h>
#include <nibobee/odometry.h>
#include <nibobee/led.h>
#include <nibobee/i2cmaster.h>
#include <nibobee/lcdi2c.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <stdio.h>
int8_t decode_l (uint8_t val) {
if (val==0x01) return -1;
if (val==0x02) return 1;
return 0;
}
int8_t decode_r (uint8_t val) {
if (val==0x01) return -1;
if (val==0x02) return 1;
return 0;
}
void print_hex (uint8_t val) {
char c1=val/16;
char c2=val%16;
if (c1<10) c1+='0'; else c1+='a'-10;
if (c2<10) c2+='0'; else c2+='a'-10;
usart_putchar(c1);
usart_putchar(c2);
}
int main() {
int odoL,odoR;
activate_output_group(IO_LEDS); // LED bits als Output
usart_setbaudrate(9600);
usart_enable();
motpwm_init();
odometry_init();
motpwm_setLeft(0);
motpwm_setRight(0);
analog_init();
i2c_init();
lcd_init(0x27);
lcd_setBacklight(0);
printf("NIBObee LCD V%d.%d",0,2);
set_output_group(IO_SENS); // Pull-ups aktivieren
activate_output_bit(IO_LINE_EN);
odoL = 0;
odoR = 0;
while(1) {
sei();
int8_t left = decode_l((PINC & 0x30)>>4);
int8_t right = decode_r((PINC & 0xc0)>>6);
int16_t speed_l = 0;
int16_t speed_r = 0;
switch (left) {
case -1: speed_l=-500; break;
case +1: speed_l=+500; break;
case 0: speed_l= 0; break;
}
switch (right) {
case -1: speed_r=-500; break;
case +1: speed_r=+500; break;
case 0: speed_r= 0; break;
}
motpwm_setLeft(speed_l);
motpwm_setRight(speed_r);
int16_t lval = analog_getValue(ANALOG_L1)-(int16_t)analog_getValue(ANALOG_L0) - 40;
int16_t cval = (3*(analog_getValue(ANALOG_C1)-(int16_t)analog_getValue(ANALOG_C0)))/4 - 60;
int16_t rval = analog_getValue(ANALOG_R1)-(int16_t)analog_getValue(ANALOG_R0) - 40;
if ((speed_l==0) && (speed_r==0)) {
if (lval<0) lval=0;
if (cval<0) cval=0;
if (rval<0) rval=0;
if (usart_txempty()) {
print_hex(LOBYTE(lval>>4));
usart_putchar(':');
print_hex(LOBYTE(cval>>4));
usart_putchar(':');
print_hex(LOBYTE(rval>>4));
usart_putchar(10);
usart_putchar(13);
}
uint8_t rule_l = 0;
uint8_t rule_c = 0;
uint8_t rule_r = 0;
if (lval+lval > rval+cval) rule_l=1;
if (cval+cval > lval+rval) rule_c=1;
if (rval+rval > lval+cval) rule_r=1;
if (lval > 300) rule_l=1;
if (cval > 300) rule_c=1;
if (rval > 300) rule_r=1;
if (lval < 100) rule_l=0;
if (cval < 100) rule_c=0;
if (rval < 100) rule_r=0;
led_set(LED_L_RD, rule_l);
led_set(LED_R_RD, rule_r);
led_set(LED_L_YE, (PIND & 0x04));
led_set(LED_R_YE, (PIND & 0x08));
}
else {
led_set(LED_L_RD, (speed_l>0));
led_set(LED_R_RD, (speed_r>0));
led_set(LED_L_YE, (speed_l<0));
led_set(LED_R_YE, (speed_r<0));
}
lcd_setCursor(0,1);
printf("L: %3x %3x %3x ", rval, cval,lval);
odoL += odometry_getLeft(1);
odoR += odometry_getRight(1);
lcd_setCursor(0,2);
printf("O: %4d %4d", odoR,odoL);
_delay_ms(100);
}
return 0; /* Diese Zeile ist eigentlich nicht
Hat jeman ein Idee? Bei einem anderen user läuft dieser Code ohne Probleme
Lesezeichen