moelski
05.08.2008, 00:07
Moin !
Ich glaube ich habe bei meinem kleinen Projekt einen Fehler in der Matrix :-s
Folgender Code:
$regfile = "m32def.dat"
$crystal = 8000000 'Externes Quarz 14,7456 Mhz
'Achtung: damit der ext. Quarz aktiv wird => die Fusebits entsprechend einstellen.
'Extern Cristal , bei mir alle Bits = 111 111
$baud = 19200
Declare Sub Writevalues(byval Wert As String)
'Config Clock = Soft
Enable Interrupts
Config Date = Mdy , Separator = .
Dim Btemp1 As Byte
Const Trkfile = "track.log"
Print "Wait for Drive"
' Include here you driver for Compactflash/HardDisk or other
$include "Config_MMC.bas" ' Does drive init too
If Gbdriveerror = 0 Then
' Include AVR-DOS Configuration and library
$include "Config_AVR-DOS.BAS"
Print "Init File System ... ";
Btemp1 = Initfilesystem(1) ' Partition 1
' use 0 for drive without Master boot record
If Btemp1 <> 0 Then
Print "Error: " ; Btemp1 ; " at Init file system"
Else
Print " OK"
Print "Filesystem: " ; Gbfilesystem
Print "FAT Start Sector: " ; Glfatfirstsector
Print "Root Start Sector: " ; Glrootfirstsector
Print "Data First Sector: " ; Gldatafirstsector
Print "Max. Cluster Nummber: " ; Glmaxclusternumber
Print "Sectors per Cluster: " ; Gbsectorspercluster
Print "Root Entries: " ; Gwrootentries
Print "Sectors per FAT: " ; Glsectorsperfat
Print "Number of FATs: " ; Gbnumberoffats
End If
Else
Print "Error during Drive Init: " ; Gbdriveerror
End If
Match_rom Alias &H55
Skip_rom Alias &HCC
Read_scratchpad Alias &HBE
Write_scratchpad Alias &H4E
Copy_scratchpad Alias &H48
Start_conversion Alias &H44
' Pin für 1wire Schnittstelle festlegen. => DS1820 am Port C.5
Config 1wire = Portc.7
Dim Ds1820id(32) As Byte
Dim Sc(9) As Byte , Tmp As Byte '????
Dim T As Integer , T1 As Integer
Dim I As Byte
Dim Id As Byte
Dim Nr As Word
Dim Actline As String * 20
'Die Adresse aller meiner DS1820 die ich vorher ausgelesen habe:
' DATA Bereich auslesen (IDs fest eingestellt)
'Restore Sensor_ids
' For I = 1 To 32
' Read Ds1820id(i)
'Next I
'IDs dynamisch ermitteln ...
Nr = 0
Ds1820id(1) = 1wsearchfirst()
Print "ID : " ; Hex(ds1820id(1)) ; Hex(ds1820id(2)) ; Hex(ds1820id(3)) ; Hex(ds1820id(4)) ; _
Hex(ds1820id(5)) ; Hex(ds1820id(6)) ; Hex(ds1820id(7)) ; Hex(ds1820id(8))
Do
Nr = Nr + 8
' Nächsten DS1820 suchen
Ds1820id(1 + Nr) = 1wsearchnext()
' Wenn kein Fehler, dann ausgeben
If Err = 0 Then
Print "ID : " ; Hex(ds1820id(1 + Nr)) ; Hex(ds1820id(2 + Nr)) ; Hex(ds1820id(3 + Nr)) ; Hex(ds1820id(4 + Nr)) ; _
Hex(ds1820id(5 + Nr)) ; Hex(ds1820id(6 + Nr)) ; Hex(ds1820id(7 + Nr)) ; Hex(ds1820id(8 + Nr))
Wait 1
End If
Loop Until Err = 1
1wreset
1wwrite Skip_rom
1wwrite Start_conversion 'Alle angeschlossenen DS1820 zum Messen veranlassen
Waitms 500 'Ausgabe alle 0,5 Sekunden
Nr = Nr - 7 '+1 -8
Do
Actline = ""
'Print "$1;1;;" ;
Actline = Actline + "$1;1;;"
For Id = 1 To Nr Step 8 'ID für alle 4 DS1820 1,9,17,25
Incr I
1wreset '1Wire Reseten
1wwrite &H55 'MATCHROM=>Adress.den DS1820 anhand des ROM Inhaltes
1wwrite Ds1820id(id) , 8 '8 Byte ID wird uebertragen
1wwrite &HBE 'READ SCATCHPAD => Liest alle Bytes des SP Memorys
Sc(1) = 1wread(9)
'T = Makeint(sc(1) , Sc(2)) 'komprimiert zwei Bytes in die Integervariable T
'Shift T , Right 'Die Nachkommastelle entfernen
'Locate I , 11 'Temperatur in ganzen Grad ausgeben
' Anzeige erfolgt so: T1=23 C
Tmp = Sc(1) And 1 ' 0.1C precision
If Tmp = 1 Then Decr Sc(1)
T = Makeint(sc(1) , Sc(2))
T = T * 50 : T = T - 25 : T1 = Sc(8) - Sc(7) : T1 = T1 * 100
T1 = T1 / Sc(8) : T = T + T1 : T = T / 10
'Print T ; ";" ;
Actline = Actline + Str(t)
Actline = Actline + ";"
Next Id
'Print "0"
Actline = Actline + "0"
Print Actline ' für Zeilenvorschub
Writevalues Actline
I = 0
1wreset
1wwrite Skip_rom
1wwrite Start_conversion 'Alle angeschlossenen DS1820 zum Messen veranlassen
Waitms 500 'Ausgabe alle 0,5 Sekunden
Loop
Sub Writevalues(wert As String)
Open "Test.txt" For Append As #6
Print #6 , Wert
Flush #6
Close #6
End Sub
End
Sensor_ids:
Data &H10 , &H8E , &HB0 , &H65 , &H01 , &H08 , &H00 , &H81
Data &H10 , &H7A , &H66 , &H65 , &H01 , &H08 , &H00 , &HED
Data &H10 , &H7B , &HD6 , &H60 , &H01 , &H08 , &H00 , &H14
Data &H10 , &H13 , &HFD , &H5F , &H01 , &H08 , &H00 , &H2C
Der macht nix anderes, als max. 4 DS1820 1Wire Tempsensoren zu suchen und auszulesen. Und er soll das Ergebnis seriell ausgeben und auf die SD Karte beamen.
Wenn ich die Zeile "Writevalues Actline" auskommentiere, dann kriege ich im Terminal schön meine Werte.
Wenn ich die aber rein nehme, dann kriege ich gar keine Messwerte mehr von den Sensoren.
So schaut eine gute Zeile:
$1;1;;243;228;215;0
Aber mit dem Writevalues wird das daraus ...
$1;1;;0
Und ganz nebenbei erwähnt kommt auch garnüscht auf der SD Karte in der Datei an. Wenn ich eine Testanwendung mit nur SD Karten Schreiben erstelle, dann kann ich auch Text auf der Karte ablegen. Ich gehe also mal davon aus das die Hardware ok ist.
Hat jemand einen Tipp was das sein kann? Mir gehen da gerade die Ideen aus ...
Ich glaube ich habe bei meinem kleinen Projekt einen Fehler in der Matrix :-s
Folgender Code:
$regfile = "m32def.dat"
$crystal = 8000000 'Externes Quarz 14,7456 Mhz
'Achtung: damit der ext. Quarz aktiv wird => die Fusebits entsprechend einstellen.
'Extern Cristal , bei mir alle Bits = 111 111
$baud = 19200
Declare Sub Writevalues(byval Wert As String)
'Config Clock = Soft
Enable Interrupts
Config Date = Mdy , Separator = .
Dim Btemp1 As Byte
Const Trkfile = "track.log"
Print "Wait for Drive"
' Include here you driver for Compactflash/HardDisk or other
$include "Config_MMC.bas" ' Does drive init too
If Gbdriveerror = 0 Then
' Include AVR-DOS Configuration and library
$include "Config_AVR-DOS.BAS"
Print "Init File System ... ";
Btemp1 = Initfilesystem(1) ' Partition 1
' use 0 for drive without Master boot record
If Btemp1 <> 0 Then
Print "Error: " ; Btemp1 ; " at Init file system"
Else
Print " OK"
Print "Filesystem: " ; Gbfilesystem
Print "FAT Start Sector: " ; Glfatfirstsector
Print "Root Start Sector: " ; Glrootfirstsector
Print "Data First Sector: " ; Gldatafirstsector
Print "Max. Cluster Nummber: " ; Glmaxclusternumber
Print "Sectors per Cluster: " ; Gbsectorspercluster
Print "Root Entries: " ; Gwrootentries
Print "Sectors per FAT: " ; Glsectorsperfat
Print "Number of FATs: " ; Gbnumberoffats
End If
Else
Print "Error during Drive Init: " ; Gbdriveerror
End If
Match_rom Alias &H55
Skip_rom Alias &HCC
Read_scratchpad Alias &HBE
Write_scratchpad Alias &H4E
Copy_scratchpad Alias &H48
Start_conversion Alias &H44
' Pin für 1wire Schnittstelle festlegen. => DS1820 am Port C.5
Config 1wire = Portc.7
Dim Ds1820id(32) As Byte
Dim Sc(9) As Byte , Tmp As Byte '????
Dim T As Integer , T1 As Integer
Dim I As Byte
Dim Id As Byte
Dim Nr As Word
Dim Actline As String * 20
'Die Adresse aller meiner DS1820 die ich vorher ausgelesen habe:
' DATA Bereich auslesen (IDs fest eingestellt)
'Restore Sensor_ids
' For I = 1 To 32
' Read Ds1820id(i)
'Next I
'IDs dynamisch ermitteln ...
Nr = 0
Ds1820id(1) = 1wsearchfirst()
Print "ID : " ; Hex(ds1820id(1)) ; Hex(ds1820id(2)) ; Hex(ds1820id(3)) ; Hex(ds1820id(4)) ; _
Hex(ds1820id(5)) ; Hex(ds1820id(6)) ; Hex(ds1820id(7)) ; Hex(ds1820id(8))
Do
Nr = Nr + 8
' Nächsten DS1820 suchen
Ds1820id(1 + Nr) = 1wsearchnext()
' Wenn kein Fehler, dann ausgeben
If Err = 0 Then
Print "ID : " ; Hex(ds1820id(1 + Nr)) ; Hex(ds1820id(2 + Nr)) ; Hex(ds1820id(3 + Nr)) ; Hex(ds1820id(4 + Nr)) ; _
Hex(ds1820id(5 + Nr)) ; Hex(ds1820id(6 + Nr)) ; Hex(ds1820id(7 + Nr)) ; Hex(ds1820id(8 + Nr))
Wait 1
End If
Loop Until Err = 1
1wreset
1wwrite Skip_rom
1wwrite Start_conversion 'Alle angeschlossenen DS1820 zum Messen veranlassen
Waitms 500 'Ausgabe alle 0,5 Sekunden
Nr = Nr - 7 '+1 -8
Do
Actline = ""
'Print "$1;1;;" ;
Actline = Actline + "$1;1;;"
For Id = 1 To Nr Step 8 'ID für alle 4 DS1820 1,9,17,25
Incr I
1wreset '1Wire Reseten
1wwrite &H55 'MATCHROM=>Adress.den DS1820 anhand des ROM Inhaltes
1wwrite Ds1820id(id) , 8 '8 Byte ID wird uebertragen
1wwrite &HBE 'READ SCATCHPAD => Liest alle Bytes des SP Memorys
Sc(1) = 1wread(9)
'T = Makeint(sc(1) , Sc(2)) 'komprimiert zwei Bytes in die Integervariable T
'Shift T , Right 'Die Nachkommastelle entfernen
'Locate I , 11 'Temperatur in ganzen Grad ausgeben
' Anzeige erfolgt so: T1=23 C
Tmp = Sc(1) And 1 ' 0.1C precision
If Tmp = 1 Then Decr Sc(1)
T = Makeint(sc(1) , Sc(2))
T = T * 50 : T = T - 25 : T1 = Sc(8) - Sc(7) : T1 = T1 * 100
T1 = T1 / Sc(8) : T = T + T1 : T = T / 10
'Print T ; ";" ;
Actline = Actline + Str(t)
Actline = Actline + ";"
Next Id
'Print "0"
Actline = Actline + "0"
Print Actline ' für Zeilenvorschub
Writevalues Actline
I = 0
1wreset
1wwrite Skip_rom
1wwrite Start_conversion 'Alle angeschlossenen DS1820 zum Messen veranlassen
Waitms 500 'Ausgabe alle 0,5 Sekunden
Loop
Sub Writevalues(wert As String)
Open "Test.txt" For Append As #6
Print #6 , Wert
Flush #6
Close #6
End Sub
End
Sensor_ids:
Data &H10 , &H8E , &HB0 , &H65 , &H01 , &H08 , &H00 , &H81
Data &H10 , &H7A , &H66 , &H65 , &H01 , &H08 , &H00 , &HED
Data &H10 , &H7B , &HD6 , &H60 , &H01 , &H08 , &H00 , &H14
Data &H10 , &H13 , &HFD , &H5F , &H01 , &H08 , &H00 , &H2C
Der macht nix anderes, als max. 4 DS1820 1Wire Tempsensoren zu suchen und auszulesen. Und er soll das Ergebnis seriell ausgeben und auf die SD Karte beamen.
Wenn ich die Zeile "Writevalues Actline" auskommentiere, dann kriege ich im Terminal schön meine Werte.
Wenn ich die aber rein nehme, dann kriege ich gar keine Messwerte mehr von den Sensoren.
So schaut eine gute Zeile:
$1;1;;243;228;215;0
Aber mit dem Writevalues wird das daraus ...
$1;1;;0
Und ganz nebenbei erwähnt kommt auch garnüscht auf der SD Karte in der Datei an. Wenn ich eine Testanwendung mit nur SD Karten Schreiben erstelle, dann kann ich auch Text auf der Karte ablegen. Ich gehe also mal davon aus das die Hardware ok ist.
Hat jemand einen Tipp was das sein kann? Mir gehen da gerade die Ideen aus ...