Tachchen alle zusammen... Ich bin noch nicht so richtig fit was Mikrocontroller Programmierung angeht, deshalb möchte ich mich an die Erfahrenen hier wenden. Ich habe mir bei Maxim zwei Samples von dem MAX6675 bestellt. Möchte mir eine kleine Temperaturregelung bauen. Mit SPI habe ich aber noch nie was gemacht. Sprich ich weiss gaaaanz groben wie die Schnittstelle funktioniert aber mehr auch nicht. Hat denn jemand eventuell einen funktionierenden Code um die Temperatur eines solchen ICs auszulesen? Am besten auch noch dokumentiert? Und welche Pins von dem IC muss ich an welche des Controllers anschließen? Also wie gesagt, ich habe programmiertechnisch Null Ahnung von dem SPI. Habe jetzt schon etliche Seiten durchgeschaut, aber nichts gefunden was mir weiterhelfen könnte. Danke schonmal im Voraus.
>>Habe jetzt schon etliche Seiten durchgeschaut, aber nichts gefunden was >>mir weiterhelfen könnte. dann schau mal in die etlichen Seiten vom Datenblatt, da wirst du sicher was finden. Mit CodevisionAVR ist SPI sehr leicht anwendbar, allerdings musst du schon wissen was du übertragen musst, sonst bringt dir die beste Doko nichts...
Hi,
ich habe hier ein Assemblercodeschnipsel für das Auslesen des Max6675.
Die SPI-Schnittstelle ist hier ne Softwarelösung. Funktioniert super!
Prozessor ist ein Mega128 mit 8 MHz internem Takt. Der Max ist an den
Hardware-SPI-Pins angeschlossen. Also MISO,SCK und SS
[avrasm ]
init_SPI:
ldi temp,0b01011100 ;01010111
out spcr,temp
ldi temp,0b00000001 ;Portb 0 (/CS) auf Ausgang
out ddrB,temp
out portb,temp
ret
read_SPI:
nop
nop
nop
cbi portb,0 ;CS auf low
ldi temp,0b10101010
out spdr,temp
warteSpi1: sbis spsr,spif ;warten bis Übertragung beendet ist
rjmp warteSPI1
in temp,spdr
rcall sendbyte2
ldi temp,0b10101010
out spdr,temp
warteSpi2: sbis spsr,spif ;warten bis Übertragung beendet ist
rjmp warteSPI2
in temp,spdr
rcall sendbyte2
sbi portb,0 ;CS auf high
ret
read_spi2:
ldi temp,0b00000011
out ddrb,temp
cbi portb,1
sbi portb,0
rcall delay5ms
clr temp2
cbi portb,0
nop
rcall bit_einlesen
rcall bit_einlesen
rcall bit_einlesen
rcall bit_einlesen
rcall bit_einlesen
rcall bit_einlesen
rcall bit_einlesen
rcall bit_einlesen
sts Thermo_High,temp2
clr temp2
rcall bit_einlesen
rcall bit_einlesen
rcall bit_einlesen
rcall bit_einlesen
rcall bit_einlesen
rcall bit_einlesen
rcall bit_einlesen
rcall bit_einlesen
sts Thermo_Low,temp2
sbi portb,0
lds temp,Thermo_Low
andi temp,0b11111000
lds temp2,Thermo_High
andi temp2,0b01111111
clc
ror temp2
ror temp
ror temp2
ror temp
ror temp2
ror temp
ldi dv16ul,4 ;duch 4 Teilen wegen Auflösung 0,25°C
ldi dv16uh,0
rcall div16u
mov temp,dres16ul
mov temp2,dres16uh
sts thermo_low,temp
sts thermo_high,temp2
ret
bit_einlesen:
sbi portb,1 ; sck high
nop
in temp, pinb
cbi portb,1
ror temp
ror temp
ror temp
ror temp
rol temp2
ret
[/avrasm]
Danke erstmal für den Code, hat denn noch jemand was in C ?? Assembler ist ja noch schlimmer ;-) Und was die Doku angeht, da hab ich schon reingeschaut, aber ich verstehe diese Timinggeschichten bzw. die Diagramme nicht so recht. Müsste halt schon wissen wie ich die zu lesen habe ;-)
also das ist doch wirklich nicht schwierig, ich hab mir gerade mal das Datenblatt angeschaut, das besteht ja nur aus 9 Seiten... Da steht sogar wie du den IC an einen Mikrocontroller anschließt. Wenn du Daten übertragen haben willst, zieh CS auf low, wackel am SCK Pin 16 mal und lies die Daten ein wenn SCK von high nach low geht Aber genau so steht es ja auch im Datenblatt bzw Timingdiagramm, das solltest du also schon verstehen Wofür brauchst du denn eigentlich den mega128?
Den mega128 hab ich nur auf dem Testboard drauf. Soll später mal auf nem mega8 laufen. Was größeres brauche ich ja nicht. Ok, das Datasheet scheint wohl echt nicht soooo kompliziert zu sein. Nochmal zu dem Punkt "Wenn SCK von high nach log weg -> Daten auslesen? Brauch ich dann noch eine Interruptroutine um die fallende Flanke zu erwischen? Und wie regel ich das mit den Timings? Muss ich das immer mitm Timer machen ?
es gibt prinzipiell zwei Möglichkeiten mit SPI: Software SPI oder Hardware SPI Wenn du dich für Software SPI entscheidest musst du das "Timing" alles selbst machen, also SCK auf HIGH und das Bit einlesen. Alternativ und einfacher ist die Hard SPI. Weiterer Vorteil ist, dass der Controller die Daten parallel zu anderen Berechnungen durchführen kann. Lies dir dazu am Besten mal den entsprechenen Abschnitt im Datenblatt vom mega8 bzw 128 durch Um das Lesen wirst du nicht drum herum kommen, da hilft nichts
Schau mal bei http://www.elektor.de/jahrgang/2006/januar/smd-lotofen.63901.lynkx vorbei. Dort kannst Du Dir eine C-Treiber fuer den Max6675 für'n Mega Controller downloaden.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.