PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : A/D Wandler mit Byte Variable Auslesen? Attiny26



Brantiko
12.01.2008, 02:57
Hallo,
Kann es sein dass es bei Bascom zu Problemen führt sofern man einen A/D versucht mit einer Byte Variable aus zu lesen?
Falls der Wert 255 überschreitet fängt er ja wieder bei 0 an zu zählen. Mit der Erkenntnis habe ich mein Programm auf die Byte Variable umgeschrieben (Vorher Word, braucht aber zuviel Platz) und die Syntax entsprechend angepasst. Klappt aber nicht so richtig, es kommt zu Fehlfunktionen.
An dem Wandler wird ein Hall Sensor angeschlossen der ca 2,5V rausgibt. Wenn dieser nicht angeschlossen wird, der A/D Wandler also "in der Luft hängt" was ja nicht ganz stimmt durch den Pull-Up Widerstand sollte die Variable doch eigentlich auf 255 gesetzt werden,oder?

Gruss

Alex

Ratber
12.01.2008, 10:43
Kann es sein dass es bei Bascom zu Problemen führt sofern man einen A/D versucht mit einer Byte Variable aus zu lesen?

Im Grunde nicht wenn man weiß was man macht.
du mußt nur berücksichtigen das der AD-Wandler im AVR 10-Bittig ist.

Es wäre hilfreich wenn du mal einen codeschnipsel von dir angibst um zu sehen wie du es machst.

So kann ich mir nur was denken und herumraten was bei dir falsch läuft.
Ich vermute mal das du den AD nicht richtig konfiguriert hast bzw. den falschen Teil des Ergebnisses ausliest.


Welche Register (ADCHI/ADCL) liest du aus und wie gehst du mit ADLAR um ?


Wie gesagt,der betreffende Codeschnipsel wäre hilfreich.

AlKI
12.01.2008, 15:36
Wie wärs mit sowas:



' Var ist hier ne Byte-Variable

var = getadc(0) / 4 ' damit wird der 10-bittige Rückgabewert zu nem 8-bittigen.
' durch 2 ist ja wie eine gesamte verschiebung in richtung der niederwertigsten bitstelle

stefan_Z
12.01.2008, 15:37
Wenn du den GetADC ohne Konvertierung in ein Byte legst, dann nimmt er wahrscheinlich nur das niedrigste Byte - die zwei oberen Bytes werden verworfen. Das niedrige Byte ist aber nicht immer 255, denn es zählt ja weiter nach oben, macht also nur zusammen mit dem hohen Byte Sinn.

Ratber
12.01.2008, 16:13
Dafür hab ich ja "ADLAR" angesprochen.

AlKI
12.01.2008, 16:19
die Variante mit dem durch 4 Teilen würde das beheben:

da wird alles um 2 bits verschoben, die niedrigsten 2 bits fallen durch die rundung weg, damit hast du die oberen noch drin.

Ratber
12.01.2008, 18:28
Is schon richtig aber warum unnötig Rechenzeit verschwenden wenn es auch einfacher geht ?

ADLAR im ADMUX Setzen und schon wird das Ergebnis Linksbündig dargestellt.
Man muß nur noch ADCH auslesen um sofort ohne rechnerei an das korrekte Ergebnis zu kommen.


Bei deiner Methode mußt du erstens entweder einmal 16 bittig oder 2x 8 bittig auslesen und dann noch Rechnen.
Bei der Rechnerei ist ein Teilen durch 4 ebenfalls zu aufwändig.
Bei Faktoren 2^n kann man selbst da besser mit shiftoperationen arbeiten da die schneller abgearbeitet werden als Divisionen.
Auch mit Hardwaremultiplikator und ganz besonders bei controllern ohne diesem wie zb. erwähntem Tiny26 der ja keinen hat.

Probiers mal ruhig aus.

Brantiko
13.01.2008, 14:03
Vielen Dank für eure Hilfe.
Habe jetzt einfach doch mit WORD Var. gearbeitet.. soviel mehr Speicherplatz frisst das nämlich gar nicht, wie mit hinterher aufgefallen ist.

Gruss

Alex

Ratber
13.01.2008, 15:12
Ja,jeweils ein Byte Ram und Flash mehr plus den Platz für die erste 16-bit opperation (Wiederholungen fallen ja raus)

stefan_Z
13.01.2008, 16:35
Platz ist ja erstmal egal... wenns eng wird muss man halt nochmal schwer nachdenken, aber sollte doch normalerweise passen...

AlKI
13.01.2008, 16:39
ich hab auch mal was mit nem ATtiny26 gemacht. Bascom maulte, sobald ich mehr als 4 Variablen deklariern wollte.

stefan_Z
13.01.2008, 17:35
Vielleicht hast du einfach zu viel Stack definiert.
Wenn jeder stack auf 64 Steht, dann ist schnell Ende, klar. Ist mir auch schon passiert...