Forum: Mikrocontroller und Digitale Elektronik mit HW-SPI Drucksensor auslesen, Timer-Problem


von Daniel S. (Gast)


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

von Daniel S. (Gast)


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

von (*--_--*) Lin (Gast)


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

von crazy horse (Gast)


Lesenswert?

wie (fast) immer - stell die Software rein, sonst ist es nur
Rätselraten. Prinzipiell ist das gar kein Problem, was du da vorhast.

von Daniel S. (Gast)


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

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.