AVR-DOS
Köszönöm a tippeket.
Sorban:
Close #7 előtt: Flush #7
Ez a memóriában a bufferelt lépéseket lezárja + FAT táblát frissíti.
- Próbáltam, nem jött be.
A FAT és az adatírást ne lehessen egyszerre. Kisebb memóriát foglal. Configmmc.bas-ban van benne...
- Ezt nem értem. :
Minek definiáltad a Filename változót?
- string, sajnos ennek értéke naponta változik (a file neve a dátum), így nem lehet fix.
- az egész rendszer 3.3 V-on jár, azaz nincs szint illesztés. Csak egyetlen SD kártyával próbáltam, eddig máshol nem volt problémám vele. A távolság kb 10 cm. A proci 16 MHz-en jár, próbáltam csökkenteni az SPI sebességét, de nem jelentet semmit.
Az a furcsa, hogy reset után hibátlanul kezd loggolni (azaz nincs kihagyott időbélyeg), majd valami történik, és azután már semmi sem történik, hibaüzenet sincsen.
Most azt próbálom, hogy a kód SD kártyát kezelő részét kiemeltem a programból, csak az fut (fix időközönként egy vagy több sort hozzáír), és tesztelem. Amit eddig észrevettem a rövid idő alatt, hogy kétszer is 22k elérése után állt le a loggolás.
Nem adom fel....
Sorban:
Close #7 előtt: Flush #7
Ez a memóriában a bufferelt lépéseket lezárja + FAT táblát frissíti.
- Próbáltam, nem jött be.
A FAT és az adatírást ne lehessen egyszerre. Kisebb memóriát foglal. Configmmc.bas-ban van benne...
- Ezt nem értem. :
Minek definiáltad a Filename változót?
- string, sajnos ennek értéke naponta változik (a file neve a dátum), így nem lehet fix.
- az egész rendszer 3.3 V-on jár, azaz nincs szint illesztés. Csak egyetlen SD kártyával próbáltam, eddig máshol nem volt problémám vele. A távolság kb 10 cm. A proci 16 MHz-en jár, próbáltam csökkenteni az SPI sebességét, de nem jelentet semmit.
Az a furcsa, hogy reset után hibátlanul kezd loggolni (azaz nincs kihagyott időbélyeg), majd valami történik, és azután már semmi sem történik, hibaüzenet sincsen.
Most azt próbálom, hogy a kód SD kártyát kezelő részét kiemeltem a programból, csak az fut (fix időközönként egy vagy több sort hozzáír), és tesztelem. Amit eddig észrevettem a rövid idő alatt, hogy kétszer is 22k elérése után állt le a loggolás.
Nem adom fel....
Annyira egyszerű már a program, hogy nem hiszem.
Most csináltam egy 800k-s txt filet, hiba nélkül.
Előtte 14-nél leállt, de nem jelzett hibát....
Ez a legrosszabb. nem találom a logikát....
Stcheck-et még nem próbáltam.
És egy kérdés: mennyire viseli meg az SD kártyát, ha egy meglévő állományhoz egyenként pl.1000 sort hozzáfűzök (append)?
Mintha valami a határon működne, néha átbillen, persze utána már semmi hozzáfűzés nem jó....
Most csináltam egy 800k-s txt filet, hiba nélkül.
Előtte 14-nél leállt, de nem jelzett hibát....
Ez a legrosszabb. nem találom a logikát....
Stcheck-et még nem próbáltam.
Kód: Egész kijelölése
$crystal = 16000000
$regfile = "xm128a1def.dat"
$swstack = 400 '250
$hwstack = 400 '250
$framesize = 400
Config Pinf.1 = Output
Dim Sys_sec As Byte
Dim Btemp1 As Byte
Dim Filename As String * 12
Dim Numberofwrite As Integer
Dim A As Integer '250
$lib "xmega.lib" : $external _xmegafix_clear : $external _xmegafix_rol_r1014
Config Osc = Disabled , Extosc = Enabled , Range = 12mhz_16mhz , Startup = Xtal_256clk
Config Sysclock = External , Prescalea = 1 , Prescalebc = 1_1
Config Clock = Soft , Rtc = 1khz_32khz_crystosc , Gosub = Sectic
Config Priority = Static , Vector = Application , Lo = Enabled
$include "Config_MMC_SerialRouter_HWSPI_FAT.bas" ' Load MMC code and config
Config Com1 = 38400 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8 'Heater module
Config Com2 = 38400 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8 'Sprinkler module
Config Com3 = 38400 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8 'Reserved for Alarmer
Config Com4 = 38400 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8 'Ethernet module
Config Com5 = 38400 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8 'SMS module
Config Com6 = 38400 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8 'Not use
Config Com7 = 38400 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8 'Monitor, direct test
Open "com1:" For Binary As #1
Open "com2:" For Binary As #2
Open "com3:" For Binary As #3
Open "com4:" For Binary As #4
Open "com5:" For Binary As #5
Open "com6:" For Binary As #6
Open "com7:" For Binary As #7
Enable Interrupts
Config Date = Ymd , Separator = .
_year = 12 'year
_month = 12 'month
_day = 20 'day
_hour = 13 'hour
_min = 14 'min
_sec = 15 'sec
Print #7 , "System time:" ; Date$ ; " " ; Time$
If Gbdriveerror = 0 Then 'from.... Gbdriveerror = Driveinit()
$include "Config_AVR-DOS_SerialRouter_HWSPI_FAT.BAS" ' Include AVR-DOS Configuration and library
Print #7 , "Init File System ... " ;
Btemp1 = Initfilesystem(1) ' Reads the Master boot record and the partition boot record (Sector) from the flash card and initializes the file system
If Btemp1 <> 0 Then
Print #7 , "Error: " ; Btemp1 ; " at Init file system"
Else
Print #7 , "OK --> Btemp1= " ; Btemp1 ; " / Gbdriveerror = " ; Gbdriveerror
Print #7 , "SD CARD details:"
Print #7 , "Filesystem = " ; Gbfilesystem
Print #7 , "FAT Start Sector: " ; Glfatfirstsector
Print #7 , "Root Start Sector: " ; Glrootfirstsector
Print #7 , "Data First Sector: " ; Gldatafirstsector
Print #7 , "Max. Cluster Nummber: " ; Glmaxclusternumber
Print #7 , "Sectors per Cluster: " ; Gbsectorspercluster
Print #7 , "Root Entries: " ; Gwrootentries
Print #7 , "Sectors per FAT: " ; Glsectorsperfat
Print #7 , "Number of FATs: " ; Gbnumberoffats
Print #7 , "End of details "
Print #7 ,
Print #7 , "Disksize : " ; Disksize() ' show disk size in bytes
'Print #7 , "Disk free: " ; Diskfree() ' show free space too
End If
End If
Do
Loop
Sectic:
Incr Sys_sec
If Sys_sec = 10 Then Gosub Writesd
Return
Writesd:
Sys_sec = 0
Incr Numberofwrite
Set Portf.1 ' led on
Btemp1 = Initfilesystem(1) ' Reads the Master boot record and the partition boot record (Sector) from the flash card and initializes the file system
If Btemp1 <> 0 Then
Print #7 , "Error: " ; Btemp1 ; " at Init file system"
Reset Portf.1
Else
Filename = "TEST1.TXT"
Chdir "\"
Chdir "Test"
Print #7 , Filename ; " Opening for append..."
Open Filename For Append As 10 '#file_handle ' open file for output with file_handle
Print #7 , Numberofwrite ; " Write: Test012345678901234567890123456789"
For A = 1 To 1000
Print #10 , Numberofwrite ; " Write : Test012345678901234567890123456789"
Next A
Print #7 , "Close..."
Close #10
Reset Portf.1 ' led off
End If
Return
És egy kérdés: mennyire viseli meg az SD kártyát, ha egy meglévő állományhoz egyenként pl.1000 sort hozzáfűzök (append)?
Mintha valami a határon működne, néha átbillen, persze utána már semmi hozzáfűzés nem jó....
Milyen időközönként hívod meg a Sectic megszakítást?
Szerintem Túl hosszú a megszakítás rutinod.
Hiszen valójában így müxik:
A felhasználónak nem megszakításban szokás üziket küldeni.
Mert lassú a soros port.
És az egész SD írás megszakításban van? Ne már!
A megszakítás rutinban csak 1 jelzőt szoktunk be billenteni.
Aminek hatására a Fő Do … Loop Elvégzi az SD kezelést.
Hiszen közben más megszakításoknak is élnie kel.
Szerintem Túl hosszú a megszakítás rutinod.
Hiszen valójában így müxik:
Kód: Egész kijelölése
Sectic:
Incr Sys_sec
If Sys_sec = 10 Then
Sys_sec = 0
Incr Numberofwrite
Set Portf.1 ' led on
Btemp1 = Initfilesystem(1) ' Reads the Master boot record and the partition boot record (Sector) from the flash card and initializes the file system
If Btemp1 <> 0 Then
Print #7 , "Error: " ; Btemp1 ; " at Init file system"
Reset Portf.1
Else
Filename = "TEST1.TXT"
Chdir "\"
Chdir "Test"
Print #7 , Filename ; " Opening for append..."
Open Filename For Append As 10 '#file_handle ' open file for output with file_handle
Print #7 , Numberofwrite ; " Write: Test012345678901234567890123456789"
For A = 1 To 1000
Print #10 , Numberofwrite ; " Write : Test012345678901234567890123456789"
Next A
Print #7 , "Close..."
Close #10
Reset Portf.1 ' led off
End If
End If
Return
Mert lassú a soros port.
És az egész SD írás megszakításban van? Ne már!
A megszakítás rutinban csak 1 jelzőt szoktunk be billenteni.
Aminek hatására a Fő Do … Loop Elvégzi az SD kezelést.
Hiszen közben más megszakításoknak is élnie kel.
Pedig tényleg nincs igazad!
Ha az irás nem fejeződik be 1 másodperc alatt, tehát még fut az SD irása, de közben már jönne az újabb megszakítás hívás - ami emiatt nem tud lefutni. Ettől simán elszállhat a program.
Megszakításon belul csak minimális és gyorsan lefutó feladatokat szabad végezni, pl. jelzőbit beállítása, és majd a főprogram megnézi a bitet és elvégzi az írást...
Ahogy növekszik a file az SD kártyán, úgy egyre tovább tart az append, amikor már nem tud lefutni a következő megszakítás hívásáig tartó idő alatt akkor....
Ha az irás nem fejeződik be 1 másodperc alatt, tehát még fut az SD irása, de közben már jönne az újabb megszakítás hívás - ami emiatt nem tud lefutni. Ettől simán elszállhat a program.
Megszakításon belul csak minimális és gyorsan lefutó feladatokat szabad végezni, pl. jelzőbit beállítása, és majd a főprogram megnézi a bitet és elvégzi az írást...
Ahogy növekszik a file az SD kártyán, úgy egyre tovább tart az append, amikor már nem tud lefutni a következő megszakítás hívásáig tartó idő alatt akkor....
Megszakítást nem szakítasz meg. Megszakítás-jelzőbit bebillen, és amikor a hosszú-hosszú-hossző megszakítés végetér, akkor ujrik újra és pótolja a lemaradást
Kártyaolvasás: ~40 kbyte/sec, az írás ~25..30 k/sec.
Soros sebességed mekkora?
Szerintem az is lehet gond.
9600 bps-nél 1 karakter, 1 msec.
Illetve ha a sorosportod bufferelt - akkor a hosszú INT miatt adatvesztés...
Kártyaolvasás: ~40 kbyte/sec, az írás ~25..30 k/sec.
Soros sebességed mekkora?
Szerintem az is lehet gond.
9600 bps-nél 1 karakter, 1 msec.
Illetve ha a sorosportod bufferelt - akkor a hosszú INT miatt adatvesztés...
Nem szeretnék ellenkezni az urakkal, de én a következőt gondolom:
-Való igaz, hogy másodpercenként van egy megszakítás, de ez csak egy érték növelése (incr) és semmi több. Esetlegesen ez beleüthet az sd írás ciklusba, de ez már elég ahhoz, hogy szétessen az írás???
Az írás biztosan nem tart több másodpercig, vagyis a második sd írás meghívása nem szólhat bele az előző végébe.
(Az írást folyamatát az f.1-re kötött led jelzi, tehát látom a "kitöltési" tényezőt)
-van eset, mikor már néhány ciklus után elszáll az írás (1-5kbyte méret), de van olyan, hogy a file folyamatosan növekszik több száz kbyte-ra...
Ja, közben a kódot módosítottam, de nem javult a helyzet:
Még azt meg próbálom, hogy a sectic-ben csak egy bitet állítok át, ami a do-loop-ban jelent majd érték növelést. Ami még érdekes, hogy ez a program egy nagyobb program kivágott része, de a hibajelenség ugyanaz. (ott több minden történik közben)
Köszönöm a hozzászólásokat!
-Való igaz, hogy másodpercenként van egy megszakítás, de ez csak egy érték növelése (incr) és semmi több. Esetlegesen ez beleüthet az sd írás ciklusba, de ez már elég ahhoz, hogy szétessen az írás???
Az írás biztosan nem tart több másodpercig, vagyis a második sd írás meghívása nem szólhat bele az előző végébe.
(Az írást folyamatát az f.1-re kötött led jelzi, tehát látom a "kitöltési" tényezőt)
-van eset, mikor már néhány ciklus után elszáll az írás (1-5kbyte méret), de van olyan, hogy a file folyamatosan növekszik több száz kbyte-ra...
Ja, közben a kódot módosítottam, de nem javult a helyzet:
Kód: Egész kijelölése
Do
If Sys_sec = 3 Then Gosub Writesd
Loop
Sectic:
Incr Sys_sec
Return
Köszönöm a hozzászólásokat!
Már meg 3 másodpercenként akarsz 1000 sort írni?
És ha egyszer nem kapja el a Do loop?
Akkor majd ha átfordul a számláló, akkor lesz megint 3.
Mivel ezt nem ismerjük: Config_MMC_SerialRouter_HWSPI_FAT.bas
Akármilyen veremkezelési hiba lehet.
És ha egyszer nem kapja el a Do loop?
Akkor majd ha átfordul a számláló, akkor lesz megint 3.
Mivel ezt nem ismerjük: Config_MMC_SerialRouter_HWSPI_FAT.bas
Akármilyen veremkezelési hiba lehet.
A hozzászólást 1 alkalommal szerkesztették, utoljára kapu48 2012. december 20. csütörtök, 18:31-kor.
Kapu 48:
Csak a teszt alatt szeretnék 3 másodpercenként sd-re írni, a valódi programban ez 30 percenként történik, de így csak a végtelenben találnám meg a hibát, annyit kellene mindig várni a jelenségre, és a tesztelések eredményére...(Most kicsit így brutálisabb a teszt.)
Közben próbáltam 10-100-1000 sorral is...2-5-10 mp. szünetekkel is...
Nincs változás.
Robi:
A legutolsó dolog lesz a szoftveres SPI, mivel kész a nyák
(emlékei szerint szoftverest nem lehet hardveresre konfigurálni)
Ha windows alatt nyitom meg a file-t, sokszor a "sérült, olvashatatlan" hibaüzenet jelenik meg, azaz chkdsk szükséges...
Csak a teszt alatt szeretnék 3 másodpercenként sd-re írni, a valódi programban ez 30 percenként történik, de így csak a végtelenben találnám meg a hibát, annyit kellene mindig várni a jelenségre, és a tesztelések eredményére...(Most kicsit így brutálisabb a teszt.)
Közben próbáltam 10-100-1000 sorral is...2-5-10 mp. szünetekkel is...
Nincs változás.
Robi:
A legutolsó dolog lesz a szoftveres SPI, mivel kész a nyák
(emlékei szerint szoftverest nem lehet hardveresre konfigurálni)
Ha windows alatt nyitom meg a file-t, sokszor a "sérült, olvashatatlan" hibaüzenet jelenik meg, azaz chkdsk szükséges...