Mega32 -> SPI -> ADE7758 mit bascom

Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte

Elektronik Forum Nicht eingeloggt       Einloggen       Registrieren




[Registrieren]      --     [FAQ]      --     [ Einen Link auf Ihrer Homepage zum Forum]      --     [ Themen kostenlos per RSS in ihre Homepage einbauen]      --     [Einloggen]

Suchen


Serverzeit: 31 10 2024  10:22:25      TV   VCR Aufnahme   TFT   CRT-Monitor   Netzteile   LED-FAQ   Osziloskop-Schirmbilder            


Elektronik- und Elektroforum Forum Index   >>   Microcontroller        Microcontroller : Hardware - Software - Ideen - Projekte


Autor
Mega32 -> SPI -> ADE7758 mit bascom

    







BID = 455136

psiefke

Schreibmaschine

Beiträge: 2636
ICQ Status  
 

  


Hallo Forum,

ich stehe vor folgendem Problem... Ich möchte den oben genannten Leistungsmessbaustein von analog devices mittels SPI mit einem MEGA32 verbinden. Das Programm soll in Bascom geschrieben werden.

Leider stehe ich mit dem Datenblatt vom Wandler auf dem Kriegspfad. Ich komme einfach nicht dahinter, welchen Wert ich an den Wandler schicken soll, damit ich beispielsweise das Register AVRMS ausgegeben bekomme.

Vielleicht kann sich einer der hier anwesenden Cracks mal das Datenblatt ansehen und mir grob erzählen, was ich alles beachten muss um den chip richtig zu nutzen.

Und noch eine Frage quält mich... muss ich irgendwelche fusebits setzen um den hardware spi vom controler zu nutzen?

Hier das Datenblatt:
http://www.analog.com/UploadedFiles/Data_Sheets/ADE7758.pdf

_________________
phil

PS:

Ein Millimeter ist so klein, daß tausend übereinandergestapelt nur einen Meter hoch wären.

BID = 455204

DonComi

Inventar



Beiträge: 8605
Wohnort: Amerika

 

  

Hallo.

Wollen wir mal sehen:

Zitat :

The communications register is an 8-bit, write-only register that
controls the serial data transfer between the ADE7758 and the
host processor. All data transfer operations must begin with a
write to the communications register.

Also: Erst in das Com-Register schreiben, ob lesend oder schreibend auf welches Register zugegriffen werden soll.

Dabei sieht man eine Tabelle:
Bit7 legt fest, ob lesend oder schreibend zugegriffen werden soll und Bit0 bis Bit6 geben die Adresse des Registers an. Für das Register AVRMS ist das 0x0D.
Siehe Tabelle auf Seite 60.

Fusebits müssen eigentlich nicht geändert werden, wenn der Prozessor nicht mit der vollen Frequenz laufen soll (16MHz ist möglich und imho empfehlenswert, da die Software doch seeehr umfangreich werden kann.)

SPI-Funktion wird softwaremäßig aktiviert, ohne Fusebits.

P.S.: Sehr nützlich istauch das Timing Diagramm auf Seite 7.
Ich weiß, das ist nichts neues, aber wenn du C kannst, dann kann ich nur wärmstens empfehlen, mit C zu arbeiten. BASCOM erstellt vermutlich einen riesen Kode, und wie effizient der ist, weiß ich nicht.

Du kannst übrigens später im Kode dann folgendes machen:

const reg_AVRMS = 0xD
...

const LESEN = 0x0 'Bit 7 ist 0
const SCHREIBEN = 0x80 'Bit 7 ist 1


...

SPI_schreiben LESEN Or reg_AVRMS 'Adresse vom gewünschten Register laden
Wert = SPI_lesen()
..




_________________


[ Diese Nachricht wurde geändert von: DonComi am  4 Sep 2007 13:39 ]

[ Diese Nachricht wurde geändert von: DonComi am  4 Sep 2007 13:47 ]

BID = 455221

DonComi

Inventar



Beiträge: 8605
Wohnort: Amerika

Hallo nochmal:


const LESEN = 0x7F 'Bit 7 ist 0
const SCHREIBEN = 0x80 'Bit 7 ist 1

im Programm dann später

* lesen:
SPI_schreibe(LESEN And register) '01111111b UND Register: Bit7 ist immer 0

* schreiben:
SPI_schreibe(SCHREIBEN Or register) '1000000b ODER Register: Bit7 ist immer 1


---
Das als Nachtrag, denn 1 ODER 0 ergibt immer 1! Das war oben ein kleiner Fehler

Wenn du noch Fragen hast: kein Problem. Das Datenblatt ist sehr ordentlich und gut verständlich. Ich hatte letztens eines auf japanisch, für nen SRAM-Baustein, da haste nichts verstanden , außer den Pin assignments.

_________________

BID = 455251

psiefke

Schreibmaschine

Beiträge: 2636
ICQ Status  

Könnte ich c würd ich den klimmzug über bascom garnicht versuchen. leider bin ich in sachen C völlig blöd und in basic komme ich halbwegs gut klar.


ich habe versucht deinen ansatz in bascom nachzuvollziehen. leider bekomme ich weiterhin keine daten aus dem ding rausgeprügelt.
der dout pin vom ade7758 bleibt leblos.

vielleicht hab ich ja auch nen fehler gemacht....





Code :


'###################################################
' ADE7758 Erster Gehversuch
'#######################################################

$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000
$baud = 9600

'SPI Konfigurieren/Initialisieren
'Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes, Polarity = Low , Phase = 0 , Clockrate = 128 , Noss = 0
Config Spi = Soft , Din = Porta.6 , Dout = Porta.5 , Ss = Porta.4 , Clock = Porta.7,
Spiinit

' Variablen
Dim Avrms As Long
Dim Zwischen As Byte

'Konstanten
Const Regavrms = &H0X0D
Const Lesen = &H0X7F
Const Schreiben = &H0X80

Zwischen = Lesen And Regavrms

Do
Spiout Zwischen , 3
Spiin Avrms , 1
Print Avrms
Loop



_________________
phil

PS:

Ein Millimeter ist so klein, daß tausend übereinandergestapelt nur einen Meter hoch wären.

BID = 455256

DonComi

Inventar



Beiträge: 8605
Wohnort: Amerika

Hallo, er wird vermutlich über die &H0x80-Zahl meckern. Nimm' da mal das 0x raus, das ist eine blöde Angewohnheit, Hex-Zahlen zu schreiben. Bei Bascom ist die Notation anders: &H80.

Weiterhin hast du dem Compiler mit $chrystal=16000000 gesagt, dass die CPU mit 16MHz getaktet ist, so wie ich das aber verstanden habe, wolltest du nichts an den Fusebits ändern. Demnach wäre dort $crystal=1000000 richtig.

Weiterhin würde ich gerne wissen, was der letze Parameter bei spiout und spiin bedeuten soll.

Zudem bin ich mir grad nicht sicher, ob man bei Bascom nicht noch vor der Benutzung von Print die Uart extra anstellen muss. Ich habe Bascom leider nichtmehr, da hier nur Linux läuft.

Schau doch dazu nochmal bitte in der Hilfedatei nach, was nötig ist, um Print korrekt zum Laufen zu bekommen.

Du kannst ja auch, um das zu testen, vor der Do ... Loop-Schleife kurz Print "Starte..." oder so ähnlich ausgeben.

_________________


[ Diese Nachricht wurde geändert von: DonComi am  4 Sep 2007 16:46 ]

[ Diese Nachricht wurde geändert von: DonComi am  4 Sep 2007 16:46 ]

BID = 455259

psiefke

Schreibmaschine

Beiträge: 2636
ICQ Status  


Zitat :
Action

Sends a value of a variable to the SPI-bus.

Syntax

SPIOUT var , bytes

Remarks

var
The variable whose content must be send to the SPI-bus.

bytes
The number of bytes to send. Maximum value is 255.




Die 16 Mhz sind schon richtig, das entsprechende fusebit habe ich gesetzt. Ich fragte wegend er fusebits nur deswegen, weil der MISO Pin (Hardware SPI PB6) dauer high ist. somit gibt mir print (funktioniert übrigens ohne initialisierung des uart) ständig 255 aus. verwende ich den soft UART an portA ist der Pin nicht high. und ich erkenne mit dem oszi ob der DOut vom ADE irgendwas anstellt.

Wenn ich PB4 manuell an und aus schalte (aka Blinklichtbasteln) spielt er mit. somit schließe ich einen defekt des controlers aus.

so... mittlerweile bekomme ich auf das senden von 3x zwischen eine antwort vom ade... leider ist auf dem takt und dem DOUT ziemlich viel dreck... ich werd also erstmal versuchen müssen das ganze etwas abzuschirmen.

_________________
phil

PS:

Ein Millimeter ist so klein, daß tausend übereinandergestapelt nur einen Meter hoch wären.

BID = 455260

DonComi

Inventar



Beiträge: 8605
Wohnort: Amerika

Hm..

Ja, am besten erstmal dafür sorgen, dass saubere Pegel herrschen.

Beim spiout var, bytes. So ganz verstehe ich den Sinn nicht; gibt bytes an, wie oft var gesndet wird? Ziemlich sinnlos..

Dem Kommandobyte (also auf welches Register wie zugegriffen werden soll) muss dann auch entsprechender Zugriff folgen. Die Hardware im Slave erkennt dass und taktet dann beim nächsten Puls von SCK die Daten auf Dout raus.
Klappt das gut, schaltet der Slave wieder auf den Modus um, indem wieder zuerst das Kommandobyte erwartet wird.

BTW: /CS musst du während des Zugriffes auf Masse ziehen. Das fehlte oben auch glaub ich und ist vermutlich die Lösung des Problems .
Edit: SS (slave select) sollte mit /CS verbunden werden. Ist das der Fall und CS geht während Zugriff auf 0, habe ich mich zu früh gefreut...

Außerdem gibt es auch Register, welche länger als 8 Bit sind; ergo müssen mehrere Bytes gelesen werden (im Datenblatt Multibyte genannt.)

_________________


[ Diese Nachricht wurde geändert von: DonComi am  4 Sep 2007 18:05 ]

BID = 455275

psiefke

Schreibmaschine

Beiträge: 2636
ICQ Status  

so... nu kann es weitergehen.

ich verwende nun folgenden code:



Code :

'###################################################

' ADE7758 Erster Gehversuch
'#######################################################

$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000
$baud = 9600

'SPI Konfigurieren/Initialisieren
Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = High , Phase = 0 , Clockrate = 128 , Noss = 0
'Config Spi = Soft , Din = Porta.6 , Dout = Porta.5 , Ss = Porta.4 , Clock = Porta.7,
Spiinit

' Variablen
Dim Avrms As Byte
Dim Avrms1 As Byte
Dim Avrms2 As Byte

Dim Zwischen As Byte
Dim Garbage As Byte
'Konstanten
Const Regavrms = &H0D
'Const Regavrms = &B00010001
Const Lesen = &H7F
Const Schreiben = &H80

Zwischen = Lesen And Regavrms
'Zwischen = Regavrms
Garbage = 0
Do
Spiout Zwischen , 3
Spiin Avrms , 1
Spiin Avrms1 , 1
Spiin Avrms2 , 1
Print "jetzt gehts looos"
Print Avrms
Print Avrms1
Print Avrms2
Print "das wars"
'Wait 1
Loop



Als reaktion vom ADE bekomme ich folgendes (siehe anhang)

so richtig glücklich mahct mich das nicht... denn wie drei bytes (=24Bit) sieht das nicht aus...





edit:

A ist der SPI Takt, B ist Dout vom ADE7758

_________________
phil

PS:

Ein Millimeter ist so klein, daß tausend übereinandergestapelt nur einen Meter hoch wären.

[ Diese Nachricht wurde geändert von: psiefke am  4 Sep 2007 19:33 ]

BID = 455307

DonComi

Inventar



Beiträge: 8605
Wohnort: Amerika

Zufriedenstellend ist das nicht grade.

Wollen wir mal gucken: Auf dem Oszischirm sieht man, dass der ADE nach dem Kommandobyte Dout ändert. Das lässt darauf schließen, dass er den Befehl korrekt interpretiert hat.
Daran liegt es also nicht.

Die Maskierung stimmt auch:

In der Variablen Lesen sind alle Bits bis auf #7: 01111111. Verknüpft mit einem bitweisen AND ergiebt das auf jeden Fall auf pos. 7 eine 0:

01111111b &
xxxxxxxxb =
0xxxxxxxb

Daran liegt es auch nicht.


Ich vermute daher zweierlei Dinge:
1.

Zitat :

Spiout Zwischen , 3

Wenn ich die Beschreibung richtig verstehe, muss dort anstelle von 3 nur 1 stehen. ("The Number of Bytes to send.")

2. zwischen dem Senden des Befehls und dem Empfangen der Antwort muss die Hardware der SPI auf Slavemodus umgestellt werden.
Dagegen spricht, dass der ADE die Bits nicht ausgetaktet hat.
(SPI hin oder her)...
War den -CS während des Vorganges auf Low? Legt den mal dauerhaft auf Masse.

_________________

BID = 455344

psiefke

Schreibmaschine

Beiträge: 2636
ICQ Status  

das mit 3x senden habe ich aus einem forenbeitrag in irgendeinem anderen forum übernommen... sorry dass ich das nicht erwähnte
es hies dort man solle 1x die daten an das communications register senden und dann zweimal dummydaten


wenn ich die variable zwischen nur einmal sende, passiert garnichts.

bzw. dout wird für ca. 1 uS low. und zwar 1,2 uS bevor SS kurz high wird.

es kommt mir also so vor, als würde der mega32 den ss in genau dem moment high bringen und der ade seine übertragung abbrechen, bevor er seine daten überhaupt ausspucken kann.




_________________
phil

PS:

Ein Millimeter ist so klein, daß tausend übereinandergestapelt nur einen Meter hoch wären.

[ Diese Nachricht wurde geändert von: psiefke am  5 Sep 2007  1:06 ]

BID = 455348

psiefke

Schreibmaschine

Beiträge: 2636
ICQ Status  

ich hab nun das handlking des SS Pins slebst in die hand genommen und überlasse es nichtmehr der spi routine. ich setze den pinb.4 nun am anfang meiner schleife auf low und am ende wieder high.

zumindest bekomme ich jetzt eine andere ausgabe als vorher. anstelle von 0 oder 255 ist es nun 128


ob dies ein fortschritt ist, kann ich nicht beurteilen.


_________________
phil

PS:

Ein Millimeter ist so klein, daß tausend übereinandergestapelt nur einen Meter hoch wären.

BID = 455352

psiefke

Schreibmaschine

Beiträge: 2636
ICQ Status  

so... nachdem ich die polarität des taktes umgestellt habe erhalte ich mit folgendem code je nach eingangsspannung unterschiedliche werte in den drei bytes.

ob diese plausibel sind kann ich erst nachprüfen, wenn ich die drei bytes zu einem 24 bit wort zusammegesetzt habe. nur bin ich dafür grad mal wieder zu blöd...

heiße tipps werden angenommen!



Code :

'###################################################


' ADE7758 Erster Gehversuch

'#######################################################



$regfile = "m32def.dat"

$framesize = 32

$swstack = 32

$hwstack = 32

$crystal = 16000000

$baud = 9600



'SPI Konfigurieren/Initialisieren

Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = High , Phase = 0 , Clockrate = 128 , Noss = 1

'Config Spi = Soft , Din = Porta.6 , Dout = Porta.5 , Ss = Porta.4 , Clock = Porta.7,

Config Portb.4 = Output

Spiinit




' Variablen

Dim Avrms As Byte

Dim Avrms1 As Byte

Dim Avrms2 As Byte



Dim Zwischen As Byte

Dim Garbage As Byte

'Konstanten

Const Regavrms = &H0D

'Const Regavrms = &B00010001

Const Lesen = &H7F

Const Schreiben = &H80



Zwischen = Lesen And Regavrms

'Zwischen = Regavrms

Garbage = 0

Do
Portb.4 = 0
Spiout Zwischen , 4
Spiin Avrms , 1
Spiin Avrms1 , 1
Spiin Avrms2 , 1
Portb.4 = 1
Print "jetzt gehts looos"
Print "avrms " ; Avrms
Print "avrms1 " ; Avrms1
Print "avrms2 " ; Avrms2
Print "das wars"

Wait 1

Loop



_________________
phil

PS:

Ein Millimeter ist so klein, daß tausend übereinandergestapelt nur einen Meter hoch wären.

BID = 455493

DonComi

Inventar



Beiträge: 8605
Wohnort: Amerika

Hallo Psiefke,

Wenn der ADE jetzt korrekt antwortet dann kannst du die Bits wie folgt zusammensetzen:

Byte3-Byte2-Byte1.

Da der ADE zuerst das MSB (Most significant Byte in diesem Falle) austaktet ist die korrekte Reihenfolge der Bytes:

Avrms - Avrms1 - Avrms2.

In Avrms2 steht also an Bit0 das LSB des gesammten 24Bit-Wortes.

Wie man das mit Bascom Basic nun in z.b. eine Longvariable zusammenpakt (32Bit-Zahl) müsste mal einer der Basicprogrammierer sagen. Vorerst kannst du sie aber mal in der Reihenfolge (s.o.) hexadezimal ausgeben (Print Hex(Avrms) bzw. vielleicht auch Print Hex$(Avrms)) und dann die 6 -stellige Hexzahl mit einem normalen Taschenrechner mit Hex->Dezimalrechner umrechnen.
Vielleicht gibt es sogar eine Funktion in Bascom, die dir z.b. eine Longvariable aus 4 Bytes zusammensetzt. (oder eben hier 3 und das vierte wird mit 0 gefüllt.)
Weiterhin kommt es jetzt auf das Format der Zahlen an - AVRMS gibt die Daten laut Datenblatt Unsigned aus, was soviel bedeutet wie Positive Ganzzahl (ohne Vorzeichen). Daher muss damit auch nichts weiter gemacht werden; einige Register speichern jedoch auch Signed-Zahlen, also im Zweierkomplement. Aber Bascom wird da die Möglichkeit haben, auch diese Zahlen zu verarbeiten.

_________________

BID = 458270

psiefke

Schreibmaschine

Beiträge: 2636
ICQ Status  

So, das Projekt mit dem ADE habe ich erstmal weiter weg gelegt.
Erstmal schaffe ich mir die Grundlagen von C drauf. Das scheint mir in Hinblick auf zukünftige Projekte duetlich sinnvoller.

Allerdings neige ich momentan noch dazu diese Sprache zu hassen.
Alles was in Bascom basic super simpel war, scheint in C erstmal unerreichbar. Soviel Handarbeit....

Naja.. ich werd es schaffen. Habe mir erstmal ein paar Bücher besorgt.
Vielleicht kann mir ja jemand einen Tipp geben, ob ich für den Anfang noch etwas brauche. Hier die Liste mit dem Gerümpel das sich auf meinem Schreibtisch angesammelt hat:


Atmel STK500+STK501
2x USB2RS232 Wandler (einmal zum programmieren, einmal fürs Terminal)
1x 4x16 LCD Display nebst Beschaltung für Betriebsspannung und Kontrast

diverse mega 16, mega32 und mega128
diverser Kleinkram... das übliche Bastlergerümpel

Bücher:
Jürgen Wolf - C Programmierung mit einfachen Beispielen
Jürgen Wolf - C von A bis Z Das umfassende Handbuch
Jörg Wiegelmann - Softwarentwicklung in C für Mikroprozessoren und Mikrocontroller

Eine lauffähige Installation vom AVR Studio 4 mit gcc

naja... ich denke ich habe alles wasman so braucht. Aber vielleicht hat ja noch jemand ne idee, was fehlen könnte oder ne super Buchempfehlung oder so...





_________________
phil

PS:

Ein Millimeter ist so klein, daß tausend übereinandergestapelt nur einen Meter hoch wären.

[ Diese Nachricht wurde geändert von: psiefke am 19 Sep 2007  8:24 ]

BID = 458434

DonComi

Inventar



Beiträge: 8605
Wohnort: Amerika

Moin,

Ja, C macht Sinn .

Also, soweit ich das richtig überblicke hast du alles, was benötoigt wird, sogar nochmehr.

Damit sollte sich gut lernen lassen, vorallem natürlich mit deiner Literatur.

_________________


Zurück zur Seite 1 im Unterforum          Vorheriges Thema Nächstes Thema 


Zum Ersatzteileshop


Bezeichnungen von Produkten, Abbildungen und Logos , die in diesem Forum oder im Shop verwendet werden, sind Eigentum des entsprechenden Herstellers oder Besitzers. Diese dienen lediglich zur Identifikation!
Impressum       Datenschutz       Copyright © Baldur Brock Fernsehtechnik und Versand Ersatzteile in Heilbronn Deutschland       

gerechnet auf die letzten 30 Tage haben wir 24 Beiträge im Durchschnitt pro Tag       heute wurden bisher 3 Beiträge verfasst
© x sparkkelsputz        Besucher : 182261197   Heute : 1090    Gestern : 4669    Online : 540        31.10.2024    10:22
3 Besucher in den letzten 60 Sekunden        alle 20.00 Sekunden ein neuer Besucher ---- logout ----viewtopic ---- logout ----
xcvb ycvb
0.0465440750122