C binaeren string in dezimal umwandeln

Ne, funktioniert noch nicht...

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..:confused:
Die Umrechnung scheint richtig zu sein...
 
Hab mir gerade mal den Rohwert parralel ausgeben lassen,
Dieser geht innerhalb des Regelberreichs(Poti) drei mal von
0-4095..:confused:
Die Umrechnung scheint richtig zu sein...



Also die Umrechnung
Code:
ADCrout = (ADCrout * 11) / 455;
ist sehr simpel, die ist richtig, da gibts keinen Überlauf.

Anscheinend kommen die Daten vom ADC nicht richtig in ADCrout rein. Ich schaue da heute Abend nochmal nach, wenn du nichts gefunden hast, da ich jetzt keine Zeit habe.

Dirk :ciao:
 
Danke:)

In der ersten Version, ohne Bitgeschiebe beim Dataout hats noch funktioniert:

Code:
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;
}

EDIT: Habe gerade wieder die alte Version genommen, damit funktioniert es..
Es muss also am:
Code:
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};

und am

Code:
if ((ADCdata & 0x80) && (i <= 10)){

//anstatt

if ((ADCdata[i] == 1) && (i <= 10)){
liegen...
 
Danke:)

In der ersten Version, ohne Bitgeschiebe beim Dataout hats noch funktioniert:

Ach ja, ich sehe es.

Bei deiner ersten Version mit dem Array, fängst du an mit Index 0, also mit LSB und schiebst 10 Bit, von LSB nach MSB.

Bei der zweiten Version fängst du mit höherwertigen Bits an (genau Bit 7, wegen & 0x80) und schiebst den Registerinhalt nach links, du sendest also von MSB nach LSB.


Also wenn du es zwischenzeitlich nicht hinbekommst, dann probiere ich mich heute Abend dran :)

Dirk :ciao:
 
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...

Tja, das passiert wenn man einzelnde Teile aus Beispielen kopiert;)
 
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?

Ja, da bin ich mir sehr sicher! Ich sehe es doch am Programmcode.

Im ersten Programm verarbeitest du auch chnl noch nicht.

Dass der richtige Kanal verwendet wird, ist hier Zufall, hier passen halt die übertragenen Adressbits zufällig zum Kanal mit dem Poti.
 
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...

Genau, du sendest dann aber MSB zuerst, im alten code mit dem Array war es LSB denke ich ... so jetzt bin ich mal offline ;-)
 
Ich habe es jetzt so und alles funzt, wie es soll:

Code:
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;
}
 
Ja gut.

Dann kann es ja bei deinem Projekt jetzt weiter gehen :D

Dirk :ciao:

Ja, nochmal danke, an alle die mir geholfen haben!

Hier nochmal die fertige Funktion, falls sie mal noch jemand braucht:

Code:
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;
}
Die delays können bei Bedarf noch verkleinert werden, sind hier für 8MHz...
Funktioniert direkt für MCP3204 und MCP3208.
Bei Nutzung des Differential Modus, muss das letzte Bit in ADCdata_f auf Null gesetzt werden!
 
Schon richtig, aber im Zähler des Bruches steht eine (scheinbar) binäre Gleichung, im Nenner eine (scheinbar) dezimale...
Was ist der Quotient zweier Gleichungen überhaupt (also welche Metrik liegt hier zugrunde)?
 
Das soll eigentlich ein trennstrich sein...:-D
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)