Forum: Mikrocontroller und Digitale Elektronik Atmega128 und MAX6675 - Brauche Starthilfe


von Rush (Gast)


Lesenswert?

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.

von Kai F. (kai-) Benutzerseite


Lesenswert?

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

von Andre (Gast)


Lesenswert?

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]

von Rush (Gast)


Lesenswert?

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 ;-)

von Kai F. (kai-) Benutzerseite


Lesenswert?

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?

von Rush (Gast)


Lesenswert?

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 ?

von Kai F. (kai-) Benutzerseite


Lesenswert?

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

von FrankW (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.