PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 12-Bit aus SPI in Word speichern



Lord_Vader
27.12.2014, 15:03
Hi,

habe einen MCP3201 ADC an einem Atmega8.

Das problem ist, ich bekomme nie die richten werte, habe schon einiges probiert. Da er ja bytes einliest habe ich es erst mit einem array von bytes probiert und versucht diese zusammen zu fügen.
Dann habe ich probiert es direkt in ein Word zu schreiben. Irgendwie bekomme ich nie die richtigen ergebnisse.



Config Spi = Soft , Din = Pinc.4 , Ss = Portc.3 , Clock = Portc.5 , Speed = 1
Spiinit


Declare Function Readadc() As Integer


Do


Largein = Readadc()
Largein = Largein - 2048
Largein = Largein / 8

If Largein >= 0 Then Highval = Largein Else Highval = 0
If Largein < 0 Then Lowval = Abs(largein) Else Lowval = 0

If Highval > Timer0 And Out2 = 0 Then Out1 = 1 Else Out1 = 0
If Lowval > Timer0 And Out1 = 0 Then Out2 = 1 Else Out2 = 0

Loop


Function Readadc() As Integer

Spiin Bytes(1) , 2

Temp = Bytes(1)
Shift Temp , Left , 4 '10101010->101010100000 (left part of 12bit)

Outcome = Temp + Bytes(2) '101010100000 + 00001010 = 101010101010

Readadc = Outcome

End Function


Das ist der Code wos drauf ankommt. Wie liesst Spiin denn ein? Laut datenblatt des MCP bekomme ich erst MSB, wenn die 12-Bit ausgelesen sind geht es LSB weiter. Also steht ja in einem eingelesenen Word mehr als sollte und in zwei bytes auch, weshalb ich shift versucht habe aber nie das richtige ergebniss bekam...

Ich hoffe ihr könnt helfen.

MfG Vader

Searcher
27.12.2014, 18:32
Hallo,



Das ist der Code wos drauf ankommt. Wie liesst Spiin denn ein? Laut datenblatt des MCP bekomme ich erst MSB, wenn die 12-Bit ausgelesen sind geht es LSB weiter. Also steht ja in einem eingelesenen Word mehr als sollte und in zwei bytes auch, weshalb ich shift versucht habe aber nie das richtige ergebniss bekam...


Auf welches Datenblatt beziehst Du Dich? Ich nehme mal dieses: http://ww1.microchip.com/downloads/en/DeviceDoc/21290D.pdf

Wie Bascom mit
Config Spi = Soft , Din = Pinc.4 , Ss = Portc.3 , Clock = Portc.5 , Speed = 1
und SPIIN einliest ist mir auch nicht ganz klar. Wenn man noch MODE=1 an das Config Spi anhängt, denke ich, sollte es nach FIGURE 6-2: in obigem Datenblatt gehen.

Wenn man nun in das Array "Bytes" 2 Byte einliest (Also CS nach low, 2 Bytes einlesen und CS nach high), stehen in Bytes(1) die höherwertigen Bits (und 3 nicht zu beachtende Bits) und in Bytes(2) die niederwertigen Bits (und als Bit 0 ein nicht zu beachtendes).

Die beiden Bytes aus dem Array würd ich in eine Word Variable packen und dann um eins nach recht shiften. Dann noch die 4 höchstwerigen Bits ausmaskieren:
Word_Var = Bytes(1) * 256
Word_Var = Word_Var + Bytes(2)
Shift Word_Var , right
Word_Var = Word_Var AND &B0000111111111111

In Word_Var sollte dann der ADC Wert stehen.

Wenn nicht vielleicht mal den erwarteten Wert und den erhaltenen Wert posten.

Gruß
Searcher

Lord_Vader
27.12.2014, 22:39
Hi,

ja das speed=1 habe ich rausgenommen, war nur ein test obs am zu schnellen clocken lag :>
Mode hatte ich nicht probiert. Hatte einen MCP-DAC, welcher mit der einstellung einwandfrei funktionierte, deshalb habe ich dies einfach genommen und auf input umgeschrieben. Wusste nich das es ein anderer mode war :\

Ich probiere das mal aus, sieht auch logisch aus, auch wenn ich ähnliches schon getestet habe, aber nur ähnlich ;)

Mit Bit0 als nicht zubeachtend meinst du bit1? Das ist laut DB das letzte?

Danke schonmal für die Hilfe

Edit:

Jaaa es funktioniert :D Danke danke danke
Habe das *256 aber durch ein shift,left,8 ersetzt. Hoffe das ist schneller ;)

Hier das ergebniss (pwm aus sinuskurve)

https://www.dropbox.com/s/fjk8k29iwo85npi/DSC_0086.JPG?dl=0

Edit2: Mode brauchte ich garnicht ;)

Searcher
28.12.2014, 09:22
Jaaa es funktioniert :-) Danke danke danke
Hier das ergebniss (pwm aus sinuskurve)
:shock::p Genug, genug. Hab gar nicht damit gerechnet, daß es so auf Anhieb läuft. :)


Mit Bit0 als nicht zubeachtend meinst du bit1? Das ist laut DB das letzte?
Ja. Meinte das doppelte Bit 1 des ADC Ergebnisses, das an Bitposition 0 von Bytes(2) nach SPIIN steht. Ist aber jetzt ja klar. Wird durch das nach rechts Schieben dann ja entfernt.


Habe das *256 aber durch ein shift,left,8 ersetzt. Hoffe das ist schneller ;)
Das shift ist auf den meisten Tinys (wenn nicht sogar auf allen) schneller. Auf dem Atmega8 ist das *256 schneller, da der ATmega8 einen HW-Multiplizierer besitzt. Kannst Du leicht im Simulator überprüfen. *256 ist hier mindestens ca. 25 Prozessortakte schneller als 8 mal nach links shiften.

Gruß
Searcher

Vitis
29.12.2014, 16:45
anstatt der Multiplikation oder shiften kannst Du auch einfach 2 Bytevariablen als Overlay über Deine Wordvariable drüber legen, das spart Rechenzeit

dim Word_Var as word
dim byte_var (2) as byte at Word_Var overlay

Die einzelnen Bytes kannst Du dann einfach per byte_var(1)= xyz and 00011111 und byte_var(2)=abcd and 11111110 befüllen
dann nur einmal den shift Word_Var, right, 1

Lord_Vader
31.12.2014, 10:36
Ahh danke das ist auch nice!

Unregistriert
19.11.2016, 11:10
Hallo,
könnt ihr bitte genauer beschreiben wie ihr der ADC einlest?
Ich stehe nämlich vor dem Problem den ADC MCP3201 auf einem ATmega 8 einzulesen.
Könntet ihr bitte beschreiben wie ihr das hinbekommt die 12bit´s einzulesen??
Danke schon im vorraus.

monkye2000
28.12.2016, 10:15
Es geht auch so:

Dim Address As Word
Dim H_Address As Byte At Address Overlay
Dim L_Address As Byte At Address+1 Overlay