C binaeren string in dezimal umwandeln

AVRuser

Neues Mitglied
20 Apr 2011
217
0
0
Niedersachsen
Sprachen
BascomAVR, ANSI C
Ne, funktioniert noch nicht...

ADCrout hab ich mir schon direkt ausgeben lassen, der Wert stimmt...
 

AVRuser

Neues Mitglied
20 Apr 2011
217
0
0
Niedersachsen
Sprachen
BascomAVR, ANSI C
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...
 

Dirk

Administrator
Teammitglied
28 Jan 2007
4.291
141
63
Mittelhessen, Giessen
Sprachen
ANSI C, C++, C#, Java, Kotlin, Pascal, Assembler, PHP
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:
 

AVRuser

Neues Mitglied
20 Apr 2011
217
0
0
Niedersachsen
Sprachen
BascomAVR, ANSI C
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...
 

Dirk

Administrator
Teammitglied
28 Jan 2007
4.291
141
63
Mittelhessen, Giessen
Sprachen
ANSI C, C++, C#, Java, Kotlin, Pascal, Assembler, PHP
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:
 

AVRuser

Neues Mitglied
20 Apr 2011
217
0
0
Niedersachsen
Sprachen
BascomAVR, ANSI C
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?
 

AVRuser

Neues Mitglied
20 Apr 2011
217
0
0
Niedersachsen
Sprachen
BascomAVR, ANSI C
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;)
 

Dirk

Administrator
Teammitglied
28 Jan 2007
4.291
141
63
Mittelhessen, Giessen
Sprachen
ANSI C, C++, C#, Java, Kotlin, Pascal, Assembler, PHP
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.
 

Dirk

Administrator
Teammitglied
28 Jan 2007
4.291
141
63
Mittelhessen, Giessen
Sprachen
ANSI C, C++, C#, Java, Kotlin, Pascal, Assembler, PHP
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 ;-)
 

AVRuser

Neues Mitglied
20 Apr 2011
217
0
0
Niedersachsen
Sprachen
BascomAVR, ANSI C
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;
}
 

Dirk

Administrator
Teammitglied
28 Jan 2007
4.291
141
63
Mittelhessen, Giessen
Sprachen
ANSI C, C++, C#, Java, Kotlin, Pascal, Assembler, PHP

AVRuser

Neues Mitglied
20 Apr 2011
217
0
0
Niedersachsen
Sprachen
BascomAVR, ANSI C
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!
 

TommyB

Team Bitschubse
Premium Benutzer
17 Mai 2010
2.151
80
48
36
127.0.0.1 ;)
Sprachen
C#, VB.Net, LunaAVR, Assembler, Python

LotadaC

Sehr aktives Mitglied
22 Jan 2009
3.364
61
48
Marwitz
Sprachen
BascomAVR, Assembler
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)?
 

AVRuser

Neues Mitglied
20 Apr 2011
217
0
0
Niedersachsen
Sprachen
BascomAVR, ANSI C
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)