- fchao-Sinus-Wechselrichter AliExpress         
Ergebnis 1 bis 8 von 8

Thema: 12-Bit aus SPI in Word speichern

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    02.11.2008
    Alter
    37
    Beiträge
    26

    12-Bit aus SPI in Word speichern

    Anzeige

    E-Bike
    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.

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

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.703
    Blog-Einträge
    133
    Hallo,

    Zitat Zitat von Lord_Vader Beitrag anzeigen
    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/e...Doc/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
    Geändert von Searcher (27.12.2014 um 19:03 Uhr)
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    02.11.2008
    Alter
    37
    Beiträge
    26
    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 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/fjk8k29iwo..._0086.JPG?dl=0

    Edit2: Mode brauchte ich garnicht
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken DSC_0086.jpg  
    Geändert von Lord_Vader (27.12.2014 um 23:10 Uhr)

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.703
    Blog-Einträge
    133
    Zitat Zitat von Lord_Vader Beitrag anzeigen
    Jaaa es funktioniert Danke danke danke
    Hier das ergebniss (pwm aus sinuskurve)
    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
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    50
    Beiträge
    2.253
    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
    Geändert von Vitis (29.12.2014 um 16:50 Uhr)
    Vor den Erfolg haben die Götter den Schweiß gesetzt

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    02.11.2008
    Alter
    37
    Beiträge
    26
    Ahh danke das ist auch nice!

  7. #7
    Unregistriert
    Gast

    Codebeschreibung

    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.

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    11.05.2014
    Ort
    Weinböhla
    Beiträge
    9
    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

Ähnliche Themen

  1. ADCH und ADCL in WORD-Variable speichern?
    Von RalfP. im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 5
    Letzter Beitrag: 28.09.2009, 20:00
  2. 8 BIT Struktur, aber SPI Befehle 16 BIT lang
    Von The Man im Forum PIC Controller
    Antworten: 5
    Letzter Beitrag: 23.04.2008, 23:38
  3. suche: wurzel aus 8 bytes (aus 64-bit zahl)
    Von nestandart im Forum Assembler-Programmierung
    Antworten: 4
    Letzter Beitrag: 25.04.2007, 22:01
  4. Bytes aus einem Array in eine Word-Variable
    Von Larek im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 14
    Letzter Beitrag: 26.08.2006, 18:44
  5. [ERLEDIGT] Wie aus Lowbyte und Hibyte ein WORD machen (in Bascom)?
    Von Thomas U. im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 7
    Letzter Beitrag: 01.10.2004, 10:01

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests