Ne, funktioniert noch nicht...
ADCrout hab ich mir schon direkt ausgeben lassen, der Wert stimmt...
ADCrout hab ich mir schon direkt ausgeben lassen, der Wert stimmt...
Hab mir gerade mal den Rohwert parralel ausgeben lassen,
Dieser geht innerhalb des Regelberreichs(Poti) drei mal von
0-4095..
Die Umrechnung scheint richtig zu sein...
ADCrout = (ADCrout * 11) / 455;
uint16_t extadc(uint8_t chnl){
bool ADCdata[11] = {0,0,0,0,0,1,1,0,0,0};
uint16_t ADCrout = 0;
int i;
PORTA &= ~(1 << ADcs);
_delay_us(100);
for (i = 0; i < 24; i ++){
if ((ADCdata[i] == 1) && (i <= 10)){
PORTA |= (1 << ADdout);
}else if (i <= 10){
PORTA &= ~(1 << ADdout);
}
PORTA &= ~(1 << ADclk);
_delay_us(250);
PORTA |= (1 << ADclk);
_delay_us(250);
if ((PINA & (1<<ADdin)) && (i >= 12)){
ADCrout <<= 1;
ADCrout |= 1;
}else if (i >= 12){
ADCrout <<= 1;
ADCrout &= ~1;
}
}
PORTA |= (1 << ADcs);
return ADCrout;
}
uint8_t ADCdata_f = 0b0000011;
uint16_t ADCdata = (ADCdata_f << 3) | (chnl & 0x07);
//anstatt
bool ADCdata[11] = {0,0,0,0,0,1,1,0,0,0};
if ((ADCdata & 0x80) && (i <= 10)){
//anstatt
if ((ADCdata[i] == 1) && (i <= 10)){
Danke
In der ersten Version, ohne Bitgeschiebe beim Dataout hats noch funktioniert:
Mmh...bist du dir sicher? Die Kanalauswahl funktioniert ja, das würde sie doch sicher nicht,
wenn die Bits falschherum in den ADC gehen, oder?
hab den Fehler gerade selbst gefunden, trotzdem danke für dein Angebot, Dirk
Das Problem lag hier:
if ((ADCdata & 0x80) && (i <= 10)){
0x80 = 0b10000000, ich habe hier aber 10 bit, also brauche ich 0x200...
uint8_t extadc(uint8_t chnl){
uint8_t ADCdata_f = 0b0000011;
uint16_t ADCdata = (ADCdata_f << 3) | (chnl & 0x07);
uint16_t ADCrout = 0;
int i;
PORTA &= ~(1 << ADcs);
_delay_us(100);
for (i = 0; i < 24; i ++){
if ((ADCdata & 0x200) && (i <= 10)){
PORTA |= (1 << ADdout);
}else if (i <= 10){
PORTA &= ~(1 << ADdout);
}
PORTA &= ~(1 << ADclk);
_delay_us(250);
PORTA |= (1 << ADclk);
_delay_us(250);
if ((PINA & (1<<ADdin)) && (i >= 12)){
ADCrout <<= 1;
ADCrout |= 1;
}else if (i >= 12){
ADCrout <<= 1;
}
ADCdata <<= 1;
}
PORTA |= (1 << ADcs);
test = ADCrout;
ADCrout = (ADCrout * 11) / 455;
return (uint8_t)ADCrout;
}
Ich habe es jetzt so und alles funzt, wie es soll:
Ja gut.
Dann kann es ja bei deinem Projekt jetzt weiter gehen
Dirk
uint16_t extadc(uint8_t chnl){
uint8_t ADCdata_f = 0b0000011;
uint16_t ADCdata = (ADCdata_f << 3) | (chnl & 0x07);
uint16_t ADCrout = 0;
int i;
PORTA &= ~(1 << ADcs);
_delay_us(10);
for (i = 0; i < 24; i ++){
if ((ADCdata & 0x200) && (i <= 10)){
PORTA |= (1 << ADdout);
}else if (i <= 10){
PORTA &= ~(1 << ADdout);
}
PORTA &= ~(1 << ADclk);
_delay_us(50);
PORTA |= (1 << ADclk);
_delay_us(50);
if ((PINA & (1<<ADdin)) && (i >= 12)){
ADCrout <<= 1;
ADCrout |= 1;
}else if (i >= 12){
ADCrout <<= 1;
}
ADCdata <<= 1;
}
PORTA |= (1 << ADcs);
return ADCrout;
}
@AVRuser: In welchem Zahlensystem ist Deine Signatur denn richtig?1 + 1 = 10 / 1 + 1 = 2 >> Alles nur eine Frage des Zahlensystems...
Das soll eigentlich ein trennstrich sein...:-D