mikrocontroller.net

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


Autor: Daniel S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Daniel S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: (*--_--*) Lin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: crazy horse (Gast)
Datum:

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

Autor: Daniel S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.