AVR-DOS

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Válasz küldése
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Tipp1:
Close #7 előtt: Flush #7
Ez a memóriában a bufferelt lépéseket lezárja + FAT táblát frissíi.

Tipp2:
A FAT és az adatírást ne lehessen egyszerre. Kisebb memóriát foglal. Configmmc.bas-ban van benne...
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Minek definiáltad a Filename változót?

For the AVR-DOS file system, Device can also be a string or filename constant like "readme.txt" or sFileName

És így:
Open „MarLetezo.txt” For Append As 10
Avatar
ekkold
DrótVégénSzéndarab
Hozzászólások: 16
Csatlakozott: 2012. szeptember 25. kedd, 6:00

Hozzászólás Szerző: ekkold »

Nem lehet hardver probléma? Többféle SD kártyával is próbáltad? AZ AVR mekkora tápfeszről jár? Van feszültség illesztés (ha igen, akkor hogyan)? Milyen messze van az AVRtől az SD kártya a panelen? Mekkora sebességgel jár a proci? Próbáltad az SPI sebességét csökkkenteni?
Avatar
CsendesJ
Biztosítékgyilkos
Hozzászólások: 57
Csatlakozott: 2008. augusztus 31. vasárnap, 6:00

Hozzászólás Szerző: CsendesJ »

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....
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Memóriakeveredés/buffer összefutás?
stcheck utasítás?
Avatar
CsendesJ
Biztosítékgyilkos
Hozzászólások: 57
Csatlakozott: 2008. augusztus 31. vasárnap, 6:00

Hozzászólás Szerző: CsendesJ »

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.

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ó....
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

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:

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
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.
:x
Avatar
CsendesJ
Biztosítékgyilkos
Hozzászólások: 57
Csatlakozott: 2008. augusztus 31. vasárnap, 6:00

Hozzászólás Szerző: CsendesJ »

Szerintem rosszul látod.

A sectic rutin másodpercenként hívódik meg, és ebből 10 másodpercenként hívódik meg az sdwrite subrutin.

A program mást nem csinál (do-loop)

Javíts ki ha nincs igazam....
Avatar
ekkold
DrótVégénSzéndarab
Hozzászólások: 16
Csatlakozott: 2012. szeptember 25. kedd, 6:00

Hozzászólás Szerző: ekkold »

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....
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Én nem javítlak ki, másodszor is.

Belenyugszom, hogy vannak emberek, akik csak a saját kárukon tanulnak!
:lol:
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

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...
Avatar
CsendesJ
Biztosítékgyilkos
Hozzászólások: 57
Csatlakozott: 2008. augusztus 31. vasárnap, 6:00

Hozzászólás Szerző: CsendesJ »

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:

Kód: Egész kijelölése

Do
If Sys_sec = 3 Then Gosub Writesd
Loop

Sectic:
Incr Sys_sec
Return
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!
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

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.

:cry:
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.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Hülye tipp:
Tedd át SW alapú SPI-re. Hátha a HW-es a /SS lábon bekavar a ChipSelectnek...


A Chipselect után várj 1 ms-t és utána inicializálj ; az írás befejezése után is 1-t, és utána vedd el a CS-t...
Avatar
CsendesJ
Biztosítékgyilkos
Hozzászólások: 57
Csatlakozott: 2008. augusztus 31. vasárnap, 6:00

Hozzászólás Szerző: CsendesJ »

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...
Válasz küldése