Ich habe mir einen kleinen Entfernungssensor gebaut, der soweit auch schon gut funktioniert. Jetzt habe ich den Ausgang des Sensor an die RP6 Base angeschlossen. Wenn ich die Werte über den UART an den PC sende sind diese vollkommen korrekt. Wenn ich jedoch versuche via I2C den vom ADC0 gemessenen Wert am Display von dem M32 Erweiterungsboard anzuzeigen, bekomme ich nur Schrott angezeigt.
Anbei mein Code der Basis und der Erweiterung. Ich kann zwar keinen Fehler darin entdecken aber vllt findet jemand von euch einen.
Code:
#include "RP6RobotBaseLib.h"
#include "RP6I2CmasterTWI.h"
void I2C_transmissionError(uint8_t errorState)
{
writeString_P("\nI2C ERROR - TWI STATE: 0x");
writeInteger(errorState, HEX);
writeChar('\n');
}
int main(void)
{
initRobotBase();
powerON();
writeString_P("Hallo"); //UART Test
writeChar('\n');
I2CTWI_initMaster(200); //I2C Master initialisieren
I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);
while(1)
{
uint16_t adc0 = readADC(ADC_ADC0); //ADC auslesen
writeInteger(adc0, DEC); // Wert via UART senden
writeChar('\n');
while(I2CTWI_isBusy()) // warten bis I2C frei ist
{
}
if(!I2CTWI_isBusy())
{
I2CTWI_transmit2Bytes(10 ,adc0, (adc0 >> 8 )); //ADC Wert in Lowbyte und Highbyte teilen und via I2C senden
writeString_P("I2C hat was gesendet"); // Kontrolle dass etwas gesendet wurde
writeChar('\n');
}
}
return 0;
}
Code:
#include "RP6ControlLib.h"
#include "RP6I2CslaveTWI.h"
int main(void)
{
initRP6Control();
initLCD(); //Display initialisieren
setLEDs(0b1010);
I2CTWI_initSlave(10); // Slave mit der Adresse 10 initialisieren
writeString_P("I2C Init"); //UART testen
writeChar('\n');
showScreenLCD("Hallo","ADC:"); // Display testen
uint16_t adcwert;
uint8_t highbyte = 0;
uint8_t lowbyte = 0;
while(true)
{
if(I2CTWI_writeRegisters[0] && !I2CTWI_writeBusy)
{
lowbyte = I2CTWI_writeRegisters[0]; //lowbyte auslesen
highbyte= I2CTWI_writeRegisters[1]; //highbyte auslesen
}
adcwert = ((highbyte << 8 ) | lowbyte); // wieder zusammensetzen
setCursorPosLCD(1,4);
writeIntegerLCD(adcwert, DEC); // auf dem display ausgeben
setCursorPosLCD(1,4);
writeInteger(adcwert , DEC);
writeChar('\n');
}
return 0;
}
Lesezeichen