mit HW-SPI Drucksensor auslesen, Timer-Problem

Gast #334507
Lesenswert?
• ▲
▼
Hallo,

bin langsam am verzweifeln !!
Ich habs endlich geschafft, den Drucksensor MS5534 von Intersema mit
der Hardware SPI eines ATMega8 auszulesen. Funktioniert einwandfrei :-)
!! Gleichzeitig muss ich jedoch noch eine Stopuhr implementieren.
Ich starte per externen Interrupt den Timer0. Dieser ist entsprechend
geteilt, vorgeladen und löst jede 0,01 sec einen Interrupt aus in
diesem dann eine Variable hochgezählt wird. Der 2. ext.Int liest diese
Variable aus.

Stopuhr alleine läuft perfekt.....Auslesen des MS5534 alleine klappt
auch. (übrigens im Hauptprogramm in einer Loop-Schleife)
Beides allerdings geht in die Hose. Der Timer-Interrupt scheint mit der
SPI Kommunikation zu kollidieren.

Welche Maßnahmen könnte ich ergreifen, damit das nicht passiert ?
Wichtig: Stopuhrgenauigkeit hat Prio. Das Lesen des MS5534 kann auch in
unterschiedlich großen Abständen erfolgen.

Über eure Antworten freue ich mich sehr !!

Daniel
Gast #334508
Lesenswert?
• ▲
▼
... ich bins nochmal...

Hat jemand von euch denn evtl. einen Tip ??
Zusammenfassung:

- Timer0 ist so eingestellt, dass er alle 0,01s einen Interrupt
auslöst. In der ISR wird dann eine Variable hochgezählt.

- der Drucksensor bekommt 2Bytes über SPI gesendet(Druck wird
angefordert).
Dann muss 35ms gewartet werden, bevor 2Bytes (gewandelter Druck)
ausgelesen werden können.

Wie geht man vor, damit die ISR von Timer0 die SPI kommunikation nicht
beeinflusst ???

Vielen Dank für eure Hilfe !!!
Daniel
Gast #334509
Lesenswert?
• ▲
▼
Wie lange benötigt die SPI zwei Bytes zu senden ???

Hängt wohl von der SCKL Taktrate ab.
Sind dies weniger als 0,01 Sekunden ??
Falls ja, dann könntest Du doch so vorgehn:
Timer und somit ISR laufen lassen.
In der ISR:
Zählerwert wieder vorladen (damit laufen die 0,01s schon mal wieder.
Dann die Bytes zum "Anfordern" senden
Variable erhöhen
Vier mal die ISR so (damit erreichst du etwa die 35ms):
Zählerwert wieder vorladen
Variable erhöhen
dann die ISR so:
Zählerwert wieder vorladen
Dann die Bytes "auslesen"
Variable erhöhen

Es stellt sich nur die Frage, klappt das innerhalb von 0,01 Sekunden
??

(--_--) Lin
Gast #334511
Lesenswert?
• ▲
▼
Hallo Crazy Horse,

solange die Interrupt von Timer0 nicht ausgelöst wird (Timer0 aus oder
Interrupts aus) läuft die Kommunikation via SPI....mit Interrupts nicht
meh :-(


der Quelltext in Bascom (Auszüge, ums klein zu halten):

--------------------------------------------------
Config Timer0 = Timer , Prescale = 256
On Ovf0 Isr_timer0
Enable Timer0
Enable Interrupts

MS5534_befehle(9)= &H0F
MS5534_befehle(10)= &H40
MS5534_befehle(11)= &H0F
MS5534_befehle(12)= &H20

do
call read_d1d2
loop

sub read_d1d2
Spiinit
   Config Spi = Hard , Interrupt = On , Data Order = Msb , Master = Yes
, Polarity = Low , Phase = 0 , Clockrate = 16 , Noss = 1
   Spiout MS5534_befehle(11) , 2
   waitms 35
   Config Spi = Hard , Interrupt = On , Data Order = Msb , Master = Yes
, Polarity = Low , Phase = 1 , Clockrate = 16 , Noss = 1
   Spiin MS5534_answer(3) , 2

   Config Spi = Hard , Interrupt = On , Data Order = Msb , Master = Yes
, Polarity = Low , Phase = 0 , Clockrate = 16 , Noss = 1
   Spiout MS5534_befehle(9) , 2
   waitms 35
   Config Spi = Hard , Interrupt = On , Data Order = Msb , Master = Yes
, Polarity = Low , Phase = 1 , Clockrate = 16 , Noss = 1
   Spiin MS5534_answer(1) , 2

   d1= MS5534_answer(1)*256
   d1=d1+MS5534_answer(2)
   d2= MS5534_answer(3)*256
   d2=d2+MS5534_answer(4)
end sub

Isr_timer0:
Tcnt0 = 112
Incr Hundertstel
Return
---------------------------------------------------


Vielen Dank !!
Daniel

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.