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
... 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
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
wie (fast) immer - stell die Software rein, sonst ist es nur Rätselraten. Prinzipiell ist das gar kein Problem, was du da vorhast.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.