AVR-DOS Seek ?

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Válasz küldése
Avatar
glbtech
DrótVégénSzéndarab
Hozzászólások: 29
Csatlakozott: 2007. február 13. kedd, 7:00

AVR-DOS Seek ?

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

Sziasztok. SD kártyát kezelek az AVR-DOS-al, és minden rendben működik vele, kivéve a seek parancsot. Ha seek-el vagy loc-al kiolvasom a file pointer aktuális értékét akkor az hibátlanul mutatja is azt, ahogy olvasok megfelelően növekszik, de ha a seek-el megpróbálom mondjuk a file elejére állítani akkor nem történik semmi. Érdekes módon ha mondjuk 0-ra állítom és utána kiolvasom a seek-el akkor írja hogy nulla, de ha megpróbálom a fájlt olvasni akár get-el, input-al akkor nem olvas a file elejéről. Találkoztatok már ilyen hibával ? Ha bezárom a fáljt és újra nyitom akkor természetesen hibátlanul megy újra amíg el nem éri a file végét.
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

Hali Valaki - Mindenki!

AVR-DOS
A fenti Seek problémára még mindég nem tudtok megoldást?

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

 Ltemp = Seek(#10)  ' Kezdő pozició tárolása
...
Line Input #10 , Temps  ' Sorok beolvasása
...
' ha File vége
Seek #10 , Ltemp      ' File 4. sorára pozicionál
   Print "doserror: " ; Gbdoserror

doserror: 98 fájlelérés hiba
:?:
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

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

Tipp: az EOF részt nem vizsgálod és ezért áll fejre.
A Seek - ha jól emlékszem - Byte szintű pozícionálást tud, nem sorszintűt.
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

Beraktam a fájl végére +1 sort.
Így nem olvasom végig a fájlt, tehát nemjön EOF jel.
De a hiba ugyanaz!

Csak 1*es buffert használok a kevés SRAM miatt!
Lehet ez az oka?

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

 ' > Kezelése FAT-puffer SRAM:
' > 0 = FAT-és DIR-puffer kezelik egy SRAM puffer 561 bájt
' > 1 = FAT-és DIR-puffer kezelik külön SRAM buffer a 1078 bájt
' > 1. paraméter növekvő sebessége file-kezelés
Const Csepfathandle = 0                                     ' [default = 1]
:?
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

Maradt a legrosszabb lehetőség!
Bezárni a Fájlt, és újranyitni az elejétől.
(Így viszont nagyon lassú az ismétlés!)
Pedig én csak a 4. sortól akartam ismételni.
:(

Még csak az elején vagyok a gyakorlatoknak!
De már szerintem a „KokkeKat_FAT_SD_lib” jóval gyorsabb az „AVR-DOS”-nál.
8)

„A Seek - ha jól emlékszem - Byte szintű pozícionálást tud, nem sorszintűt.”
Sajnos még a Byte ként i olvasást sem sikerült megoldanom!
Ott is a pozicionálás rejtelmére nem találom a megoldást!
Nem tudsz rá példát mutatni?
:?:
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

Ha valaki már járt úgy, mint én, hogy sokat szívott a HW. SPI-vel!
És nem értette az okát. Annak óloztam ide, mint lényegeges új infót!
Az „AVR-DOS comfig_mmc.bas” –ból.
Miszerint ha nem az SS kimenetet használjuk CS.-nek, akkor ís kimenetnek kel állítani!
Különben Slave-ként Működik az SPI!

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

' M128 SPI init

   ' define Chip-Select Pin
' ->
' -> Dieser Pin wird für Chip-Select benutzt.
' > Ezt a PIN-kódot használni chipet válassza ki.
      Config Portb.0 = Output                               ' define here Pin for CS of MMC/SD Card
      Mmc_cs Alias Portb.0


   ' Define here SS Pin of HW-SPI of the CPU (f.e. Pinb.0 on M128)
   ' If an other Pin than SS is used for MMC_SS, SS must be set to OUTPUT and high for proper work of SPI
   ' otherwise AVR starts SPI-SLAVE if SS-Pin is INPUT and goes to LOW

' > Határozza meg itt SS Pin a HW-SPI a CPU (pl. Pinb.0 az M128)
' > Ha egy másik Pin, mint SS használják MMC_SS, SS-ra kell állítani OUTPUT és a magas megfelelő munka SPI
' > egyébként AVR kezdődik SPI-SLAVE, ha SS-Pin is INPUT, és megy a LOW

' ->
' -> Hier muss der SS-Pin des Hardware-SPI angegeben werden. (Auch wenn ein anderer Pin für Chip-Select benutzt wird.)
' -> Dieser muss als Ausgang konfiguriert sein und auf 1 gehalten werden, da sonst automatisch der SPI-Slave-Modus aktiviert wird.

' > Itt az SS pin az SPI hardveres lehet megadni. (Még ha egy másik érintkező chip válassza ki kell használni.)
' > Ezt kell beállítani, mint egy kimeneti és lehet tartani az 1, ellenkező esetben az automatikus SPI szolga mód.

      Config Portb.0 = Output                               ' define here Pin of SPI SS
      Spi_ss Alias Portb.0
      Set Spi_ss                                            ' Set SPI-SS to Output and High por Proper work of
   #endif                                                   ' SPI as Master
'...............................................................................

   ' HW-SPI is configured to highest Speed
   Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = High , Phase = 1 , Clockrate = 4 , Noss = 1
'   Spsr = 1                                       ' Double speed on ATMega128
   Spiinit                                                  ' Init SPI
Három nyelvre is le van fordítva, mivel nem akartam elhinni az első szóra!
:roll:
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

Szóval a „Seek Set” csak Bynárisan megnyitott fájlokon működik!
Benne van a leírásban. Csak hát elkerülte a figyelmemet!
Viszont szerencsére a „Line Input” Is működik Bynáris fájlra, így megoldódni látszik a problémám!
Azért köszi a segítséget.

:)
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

Ha már megírtam közben a hibakeresőt használjátok egészséggel!
Persze nem Mega32-esbe való! :)

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


'  My_Seek.bas
' AVR-DOS Seek Comand Function. Error kereséshez!
' By: Kapu48 2011. 08.

$regfile = "M128def.dat"
$crystal = 11059200                                         ' Táp fesz: 3.3V
'$crystal = 16000000                                         ' Táp fesz: 5V

'$regfile = "m64def.dat"
'$crystal = 14746000

'$regfile = "m32def.dat"
'$crystal = 16000000

$baud = 19200
' Szükség van nagyobb halomra!
$hwstack = 140
$swstack = 140
$framesize = 140

' Feltételes Fordító beállítások:

' Chip Select a Config_MMC-nek
'Const Loadchip = 32                                         ' ATMega32
'Const Loadchip = 644      ' ATMega644
'Const Loadchip = 64       ' ATMega64
Const Loadchip = 128                                        ' ATMega128


' Bemenő adatok:
' Bseektoken = 1 File pozíció olvasása
' Bseektoken = 2 File pozíció beállítása
' L_seek = a kivánt file pozíció megadása (Long)
' FMy_seek Visszatér a jelenlegi file pozícióval
Declare Function Fmy_seek(byval Bseektoken As Byte , Byval L_seek As Long) As Long
' Fmy_seek Változók
Dim Lmy_seek As Long , Llong1 As Long , Llong2 As Long , Bseek_token As Byte , Bseek_error As Byte
Dim Bfileattribut As Byte

' Config_MMC integrálja
'  SPI Csapokat ebben a fájlban kell igazítani!
$include "M64_Config_MMC.bas"


' Config_AVR-DOS integrálja
'  Buffer mérete, száma file kezeli, stb, kell párosítani ezt a fájlt!
$include "Config_AVR-DOS.BAS"

Dim Ssor As String * 100
Bseek_error = 0

Open "Teszt.txt" For Binary As #10

' File pozíció lekérdezés
'LMy_seek = 0
'BSeek_token = 1
Line Input #10 , Ssor                                       ' 1 sor beolvasása

Lmy_seek = Fmy_seek(1 , 0)                                  ' File pozíció megjegyzése
If Bseek_error = 0 Then
   Print "1 Jelenlegi file poz: " ; Lmy_seek
Else
   Print "R Seek_error: " ; Bseek_error
End If

Line Input #10 , Ssor                                       ' Következő sor beolvasása
' File pozíció beállítása
'BSeek_token = 2
'LMy_seek = LMy_seek
Lmy_seek = Fmy_seek(2 , Lmy_seek)                           ' Vissza az előzőleg olvasott File pozícióba
If Bseek_error = 0 Then
   Print "2 Jelenlegi file poz: " ; Lmy_seek
Else
   Print "Set Seek_error: " ; Bseek_error
End If



End                                                         'end program

' Bemenő adatok:
' Bseektoken = 1 File pozíció olvasása
' Bseektoken = 2 File pozíció beállítása
' L_seek = a kívánt file pozíció megadása (Long)

' FMy_seek: Visszatér a jelenlegi file pozícióval
' Bseek_error = Seek Error code
Function Fmy_seek(byval Bseektoken As Byte , Byval L_seek As Long) As Long

 Llong1 = Filelen()                                         ' Jelenlegi File hossza
 If L_seek <= Llong1 Then                                   ' Ha még a File hosszon belül vagyunk?

    Select Case Bseektoken
      Case 1 :
          Llong2 = Seek(#10)
          If Gbdoserror = 0 Then
               Print "Seek Read: " ; Llong2
               Bseek_error = 0                              ' 0 No error
               Fmy_seek = Llong2
          Else
               Print "Seek Read Error: " ; Gbdoserror
               Bseek_error = 1                              ' 1 olvasás error
          End If

      Case 2 :
          Bfileattribut = Fileattr(#10)
          If Bfileattribut = 32 Then
            Seek #10 , L_seek
            If Gbdoserror <> 0 Then
               Print "Seek Set Error: " ; Gbdoserror
               Bseek_error = 2                              ' 2 Pozicionálás error
            Else
               Llong2 = Seek(#10)
               If Gbdoserror = 0 Then
                  If L_seek <> Llong2 Then
                   Print "Seek Set <> Error: "
                   Bseek_error = 2                          ' 2 Pozicionálás  error
                  Else
                   Print "Seek OK: " ; Llong2
                   Bseek_error = 0                          ' 0 No error
                   Fmy_seek = Llong2
                  End If
               Else
                 Print "Seek Poz. Error: " ; Gbdoserror
                 Bseek_error = 1                            ' 1 olvasás error
               End If
            End If
          Else
             Print "Seek Set:Nem Binary File  Error!"
             Bseek_error = 4                                ' 4 Csak Binary Filere működik a Seek Set!
          End If
      Case Else :
         Print "Parameter Error 1 or 2 !"
         Bseek_error = 3                                    ' 3 Paraméter error
   End Select
 Else
     Print "Nagy Pozicio.  Error !"
     Bseek_error = 5                                        ' 5 Tul nagy pozicio Paraméter error
 End If
End Function
'
8)
Feltételezve, hogy a fájl megnyitás már működik! Mert az egy előző téma lenne.
Válasz küldése