Robotik
19.05.2008, 23:48
Hi,
ich möchte den Drucksensor MS5534 an einen Atmega8 betreiben doch irgendwie weigert der sich ^^. Da der Sensor nur mit max 3,6V betrieben werden darf und der Atmega8 5V benötigt habe ich die 4 Leitungen durche einen Optokoppler (PC817) getrennt und jeder hat seine Spannung, beide sind mit Masse verbunden. "Sclk" und "Dout" (am Atmega8) habe ich mit einem Oszi überbrüft oder um genauer zu sein ein Programm auf dem PC was die Sounkarte als eingang benutzt. Die Signale stimmen mit denen im Datenblatt überein. Die Beiden Signale habe ich auch auf der anderen Seite des Optokoppler (zum Sensor) überprüft um einen Defekt auszuschließen. Was ich nicht überprüfen kann ist "MCLK" da das Programm nur bis 20kHz darstellen kann. "Mclk" erstelle ich mit dem Timer1 und lasse ihn einfach laufen da er das selbständig kann ohne das Main Programm zu unterbrechen. Um auszuschließen das "Mclk" eine falsche Frequenz ist habe ich mir von ELV den Geschwindigkeitssensor VAT 300 GS gekauft. Das ist der selbe Sensor in verbindung mit einem Atmega8L der für 3,6V ist. (Leider kann ich mit dem Signal, was der Atmega8L sendet, nix anfangen) Der Atmega8L generiert "Mclk" für den Sensor und ich greife den einfach ab um den selben bei meinem Sensor zu benutzen.
http://www.elv-downloads.de/service/manuals/VAT300GS/VAT300GS_KM_G_040413.pdf
http://www.amsys.de/sheets/amsys.de.ms5534c(e).pdf
'----------------------------------------------------------
$regfile = "m8def.dat" 'ATmega8-Deklarationen
$crystal = 8000000 $baud = 9600 'Baudrate zum PC
Ddrb.2 = 1 'ausgang
Ddrb.3 = 0 'eingang
Portb.3 = 0 'pullup widerstand aus
Ddrb.4 = 1 'ausgang
'
Dout Alias Portb.2 ' DOUT = DIN MS5534
Din Alias Portb.3 ' DIN = DOUT MS5534
Sclk Alias Portb.4 ' SCLK = Sclk MS5534
'
Reset Dout
Reset Sclk
Dim Dat_00 As Byte ' Zwischenspeicher Daten
Dim Dat_01 As Byte
'Taktsignal
'===========================
Ddrb.1 = 1 'Pin PB1/OC1A ist Ausgang
'
Tccr1a = &B01000000 'Pin OC1A/PB1 togglen, kein PWM
Tccr1b = &B00001001 'Timer-Reset bei Compare, Clock/1
'
Compare1a = 250 'Vergleichswert setzen (OCR1AH+OCR1AL)
Do
Wait 1
Print "Start ";
'=== D1
Set Dout
Delay
'Bit 0
Set Sclk
Delay
Reset Sclk
Delay
'Bit 1
Set Sclk
Delay
Reset Sclk
Delay
'Bit 2
Set Sclk
Delay
Reset Sclk
Delay
'Bit 3
Set Sclk
Delay
Reset Sclk
'Delay
Reset Dout
Delay
'Bit 4
Set Sclk
Delay
Reset Sclk
'Delay
Set Dout
Delay
'Bit 5
Set Sclk
Delay
Reset Sclk
'Delay
Reset Dout
Delay
'Bit 6
Set Sclk
Delay
Reset Sclk
Delay
'Bit 7
Set Sclk
Delay
Reset Sclk
Delay
'Bit 8
Set Sclk
Delay
Reset Sclk
Delay
'Bit 9
Set Sclk
Delay
Reset Sclk
Delay
'2 Takte bis conversion
Set Sclk
Delay
Reset Sclk
Delay
Set Sclk
Delay
Reset Sclk
Delay
Waitms 40
If Portb.3 = 0 Then Print "ok ";
'Daten empfangen ersten 8 Bit
Dat_00 = 0
'Bit 7
Set Sclk
Delay
Reset Sclk
Dat_00.0 = Din
Rotate Dat_00 , Left , 1
Delay
'Bit 6
Set Sclk
Delay
Reset Sclk
Dat_00.0 = Din
Rotate Dat_00 , Left , 1
Delay
'Bit 5
Set Sclk
Delay
Reset Sclk
Dat_00.0 = Din
Rotate Dat_00 , Left , 1
Delay
'Bit 4
Set Sclk
Delay
Reset Sclk
Dat_00.0 = Din
Rotate Dat_00 , Left , 1
Delay
'Bit 3
Set Sclk
Delay
Reset Sclk
Dat_00.0 = Din
Rotate Dat_00 , Left , 1
Delay
'Bit 2
Set Sclk
Delay
Reset Sclk
Dat_00.0 = Din
Rotate Dat_00 , Left , 1
Delay
'Bit 1
Set Sclk
Delay
Reset Sclk
Dat_00.0 = Din
Rotate Dat_00 , Left , 1
Delay
'Bit 0
Set Sclk
Delay
Reset Sclk
Dat_00.0 = Din
Rotate Dat_00 , Left , 1
Delay
'Daten empfangen zweiten 8 Bit
Dat_01 = 0
'Bit 7
Set Sclk
Delay
Reset Sclk
Dat_01.0 = Din
Rotate Dat_01 , Left , 1
Delay
'Bit 6
Set Sclk
Delay
Reset Sclk
Dat_01.0 = Din
Rotate Dat_01 , Left , 1
Delay
'Bit 5
Set Sclk
Delay
Reset Sclk
Dat_01.0 = Din
Rotate Dat_01 , Left , 1
Delay
'Bit 4
Set Sclk
Delay
Reset Sclk
Dat_01.0 = Din
Rotate Dat_01 , Left , 1
Delay
'Bit 3
Set Sclk
Delay
Reset Sclk
Dat_01.0 = Din
Rotate Dat_01 , Left , 1
Delay
'Bit 2
Set Sclk
Delay
Reset Sclk
Dat_01.0 = Din
Rotate Dat_01 , Left , 1
Delay
'Bit 1
Set Sclk
Delay
Reset Sclk
Dat_01.0 = Din
Rotate Dat_01 , Left , 1
Delay
'Bit 0
Set Sclk
Delay
Reset Sclk
Dat_01.0 = Din
Rotate Dat_01 , Left , 1
Delay
'letzter Tankt
Set Sclk
Delay
Reset Sclk
Delay
Print Dat_00;
Print Dat_01;
Wait 1
Loop
End
Um das ganze erst einmal einfach an zu gehen, wollte ich nur D1 auslesen was im Datenblatt Fig.6a zeigt. Wie man sieht soll "Dout" von 1 auf 0 wechseln und wieder zurück wenn es die Setup Bits bekommt. Aber der Ausgang am Sensor "Dout" (verbunden am Atmega8 mit "Din") ist und bleibt auf 0 und ist auch nicht wie zu sehen wenn es nix zu tun gibt auf 1.
Den Sensor habe ich schon mit dem auf der Platine von ELV gewechselt und da funktioniert er, also ist er nicht defekt.
Ich bin nu leider am Ende meines Latein, kann mir wer helfen Bitte ;)
ich möchte den Drucksensor MS5534 an einen Atmega8 betreiben doch irgendwie weigert der sich ^^. Da der Sensor nur mit max 3,6V betrieben werden darf und der Atmega8 5V benötigt habe ich die 4 Leitungen durche einen Optokoppler (PC817) getrennt und jeder hat seine Spannung, beide sind mit Masse verbunden. "Sclk" und "Dout" (am Atmega8) habe ich mit einem Oszi überbrüft oder um genauer zu sein ein Programm auf dem PC was die Sounkarte als eingang benutzt. Die Signale stimmen mit denen im Datenblatt überein. Die Beiden Signale habe ich auch auf der anderen Seite des Optokoppler (zum Sensor) überprüft um einen Defekt auszuschließen. Was ich nicht überprüfen kann ist "MCLK" da das Programm nur bis 20kHz darstellen kann. "Mclk" erstelle ich mit dem Timer1 und lasse ihn einfach laufen da er das selbständig kann ohne das Main Programm zu unterbrechen. Um auszuschließen das "Mclk" eine falsche Frequenz ist habe ich mir von ELV den Geschwindigkeitssensor VAT 300 GS gekauft. Das ist der selbe Sensor in verbindung mit einem Atmega8L der für 3,6V ist. (Leider kann ich mit dem Signal, was der Atmega8L sendet, nix anfangen) Der Atmega8L generiert "Mclk" für den Sensor und ich greife den einfach ab um den selben bei meinem Sensor zu benutzen.
http://www.elv-downloads.de/service/manuals/VAT300GS/VAT300GS_KM_G_040413.pdf
http://www.amsys.de/sheets/amsys.de.ms5534c(e).pdf
'----------------------------------------------------------
$regfile = "m8def.dat" 'ATmega8-Deklarationen
$crystal = 8000000 $baud = 9600 'Baudrate zum PC
Ddrb.2 = 1 'ausgang
Ddrb.3 = 0 'eingang
Portb.3 = 0 'pullup widerstand aus
Ddrb.4 = 1 'ausgang
'
Dout Alias Portb.2 ' DOUT = DIN MS5534
Din Alias Portb.3 ' DIN = DOUT MS5534
Sclk Alias Portb.4 ' SCLK = Sclk MS5534
'
Reset Dout
Reset Sclk
Dim Dat_00 As Byte ' Zwischenspeicher Daten
Dim Dat_01 As Byte
'Taktsignal
'===========================
Ddrb.1 = 1 'Pin PB1/OC1A ist Ausgang
'
Tccr1a = &B01000000 'Pin OC1A/PB1 togglen, kein PWM
Tccr1b = &B00001001 'Timer-Reset bei Compare, Clock/1
'
Compare1a = 250 'Vergleichswert setzen (OCR1AH+OCR1AL)
Do
Wait 1
Print "Start ";
'=== D1
Set Dout
Delay
'Bit 0
Set Sclk
Delay
Reset Sclk
Delay
'Bit 1
Set Sclk
Delay
Reset Sclk
Delay
'Bit 2
Set Sclk
Delay
Reset Sclk
Delay
'Bit 3
Set Sclk
Delay
Reset Sclk
'Delay
Reset Dout
Delay
'Bit 4
Set Sclk
Delay
Reset Sclk
'Delay
Set Dout
Delay
'Bit 5
Set Sclk
Delay
Reset Sclk
'Delay
Reset Dout
Delay
'Bit 6
Set Sclk
Delay
Reset Sclk
Delay
'Bit 7
Set Sclk
Delay
Reset Sclk
Delay
'Bit 8
Set Sclk
Delay
Reset Sclk
Delay
'Bit 9
Set Sclk
Delay
Reset Sclk
Delay
'2 Takte bis conversion
Set Sclk
Delay
Reset Sclk
Delay
Set Sclk
Delay
Reset Sclk
Delay
Waitms 40
If Portb.3 = 0 Then Print "ok ";
'Daten empfangen ersten 8 Bit
Dat_00 = 0
'Bit 7
Set Sclk
Delay
Reset Sclk
Dat_00.0 = Din
Rotate Dat_00 , Left , 1
Delay
'Bit 6
Set Sclk
Delay
Reset Sclk
Dat_00.0 = Din
Rotate Dat_00 , Left , 1
Delay
'Bit 5
Set Sclk
Delay
Reset Sclk
Dat_00.0 = Din
Rotate Dat_00 , Left , 1
Delay
'Bit 4
Set Sclk
Delay
Reset Sclk
Dat_00.0 = Din
Rotate Dat_00 , Left , 1
Delay
'Bit 3
Set Sclk
Delay
Reset Sclk
Dat_00.0 = Din
Rotate Dat_00 , Left , 1
Delay
'Bit 2
Set Sclk
Delay
Reset Sclk
Dat_00.0 = Din
Rotate Dat_00 , Left , 1
Delay
'Bit 1
Set Sclk
Delay
Reset Sclk
Dat_00.0 = Din
Rotate Dat_00 , Left , 1
Delay
'Bit 0
Set Sclk
Delay
Reset Sclk
Dat_00.0 = Din
Rotate Dat_00 , Left , 1
Delay
'Daten empfangen zweiten 8 Bit
Dat_01 = 0
'Bit 7
Set Sclk
Delay
Reset Sclk
Dat_01.0 = Din
Rotate Dat_01 , Left , 1
Delay
'Bit 6
Set Sclk
Delay
Reset Sclk
Dat_01.0 = Din
Rotate Dat_01 , Left , 1
Delay
'Bit 5
Set Sclk
Delay
Reset Sclk
Dat_01.0 = Din
Rotate Dat_01 , Left , 1
Delay
'Bit 4
Set Sclk
Delay
Reset Sclk
Dat_01.0 = Din
Rotate Dat_01 , Left , 1
Delay
'Bit 3
Set Sclk
Delay
Reset Sclk
Dat_01.0 = Din
Rotate Dat_01 , Left , 1
Delay
'Bit 2
Set Sclk
Delay
Reset Sclk
Dat_01.0 = Din
Rotate Dat_01 , Left , 1
Delay
'Bit 1
Set Sclk
Delay
Reset Sclk
Dat_01.0 = Din
Rotate Dat_01 , Left , 1
Delay
'Bit 0
Set Sclk
Delay
Reset Sclk
Dat_01.0 = Din
Rotate Dat_01 , Left , 1
Delay
'letzter Tankt
Set Sclk
Delay
Reset Sclk
Delay
Print Dat_00;
Print Dat_01;
Wait 1
Loop
End
Um das ganze erst einmal einfach an zu gehen, wollte ich nur D1 auslesen was im Datenblatt Fig.6a zeigt. Wie man sieht soll "Dout" von 1 auf 0 wechseln und wieder zurück wenn es die Setup Bits bekommt. Aber der Ausgang am Sensor "Dout" (verbunden am Atmega8 mit "Din") ist und bleibt auf 0 und ist auch nicht wie zu sehen wenn es nix zu tun gibt auf 1.
Den Sensor habe ich schon mit dem auf der Platine von ELV gewechselt und da funktioniert er, also ist er nicht defekt.
Ich bin nu leider am Ende meines Latein, kann mir wer helfen Bitte ;)