اطلاعیه

Collapse
No announcement yet.

مشکل این برنامه mmc چیه؟؟

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    مشکل این برنامه mmc چیه؟؟

    سلام دوستان.همگی خسته نباشید.

    اول از همه شرمنده که تاپیک یه کم طولانی شد امیدوارم حوصله کنبد تا آخرش رو بخونید. :rolleyes:

    من یه برنامه از اینترنت گرفتم که راه انداز mmc هست. برنامه به زبان بیسیک(BASCOM) نوشته شده و از چند تا روال تشکیل شده. یکی از این روالها Minitهست که در واقع mmc رو به مد spi میبره و دستورات CMD0و CMD1 رو ارسال میکنه و پاسخ mmc رو تو lcd نشون میده.کاری که من کردم اینه که فراخونیه سایر روال ها رو از بدنه اصلی برنامه حذف کردم و در واقع کاری کردم که برنامه فقط minit رو اجرا کنه تا ببینم mmc کار میکنه یانه. تو برنامه با این که از دستور lcd استفاده شده اما lcd پیکر بندی نشده در نتیجه من config lcd رو به برنامه اضافه کردم.و lcd رو پیکربندی کردم.

    حالا وقتی برنامه رو اجرا میکنم lcd هیچ چیزی نشون نمیده. اول فکر کردم مشکل از mmc هست که رهاندازی نمیشه اما وقتی در شروع برنامه قبل از اینکه minit فراخونی بشه این دستور رو اضافه کردم
    کد:
    lcd "test it"
    wait 1
    اما باز هم lcd چیزی نشون نداد. :cry2:
    در واقع این اولین خط برنامه هست و میکرو باید اون رو بدونه هیچ مشکلی انجام بده.
    این رو هم بگم که lcd هیچ مشکلی نداره چون زمانی که همون میکرو رو با یه برنامه ساده تست میکنم با همون اتصالات روی همون بردبرد کاملا درسته و کار میکنه. در ضمن برنامه هم هیچ error ی نمیده. :eek:


    این کد اصلی هست که من از اینترنت گرفتم:

    کد:
    ' Program: MMC.BAS written using Bascom-AVR ver 1.11.6.2
    ' Basic program to interface with a Sandisk
    ' MMC module using the SPI protocol.
    '
    '        ALPHA CODE
    '   **** NOT FOR COMMERCIAL USE *****
    '      Ver. 0.0.9 Aug, 2001
    '
    ' Project Reference: MMC-AT103L
    ' MCU: Atmel AT103L
    ' Software: Bascom-AVR ver 1.11.6.2
    ' Atmel Programmer: STK300 development board set at 3.3v.
    '        ISP and terminal output
    '
    ' Initial Date: July 23, 2001
    ' Projected Completion Date: Unknown
    '
    ' Author: Ranjit Diol
    '    rsdiol@compsys1.com
    '    http://www.compsys1.com/workbench
    '
    '***************************************************************
    '           (c) COMPSys, 2001
    '          All Rights Reserved
    '***************************************************************
    
    '
    ' DISCLAIMER: This file is being released as non-commericial
    ' software. It is being provided "AS IS", neither the author,
    ' nor COMPSys shall be held liable for any damages caused
    ' by its use either directly or indirectly in any form or manner.
    '
    '===============================================================
    '
    'Brief: The MMC is a 3volt part therefore all data lines
    '   must be conditioned if interfacing with a 5v mcu.
    '   Or, a 3.3v MCU can be used such as the AT103L or the AT90LS8535
    '
    'IMPORTANT NOTE:
    '   In SPI mode the MMC's minimum block size is 512 bytes
    '   therefore data has to be accumulated first either in an eeprom
    '   or in memory before sending it out as a chunk of 512 bytes.
    '
    '   MMC pins in SPI mode:
    '      Pin1:ChipSelect(SS),Pin2:MMC input(MOSI),Pin3:GND,Pin4:3V+,
    '      Pin5:Clock(SCK), Pin6:GND, Pin7:MMC output(MISO)
    '   AT103L pins:
    '      Portb.0 SS,Portb.1 SCK,Portb.2 MOSI, Portb.3 MISO
    '
    '
    '==============================================================
    
    $regfile = "M103def.dat"                  'AT103L mcu
    
    'Constants
    Const Msbl = 0
    Const Msbh = 1
    Const Dly = 2
    Const Bits8 = 8
    Const Bits16 = 16
    Const Bits32 = 32
    
    'Variables
    Dim Res(16) As Byte
    Dim Indat(512) As Byte                   'Memory buffer for temp storage.
    Dim Dat As Byte
    Dim Resp As Byte
    Dim Resp2 As Word
    Dim I As Word
    Dim J As Word
    Dim X As Byte
    Dim Y As Byte
    Dim K As Byte
    Dim Bout As Byte
    Dim Addr1 As Byte
    Dim Addr2 As Byte
    Dim Addr3 As Byte
    Dim Addr4 As Byte
    Dim Addr As Long
    Dim Saddr As Long
    Dim Eaddr As Long
    
    'Aliases
    Cs Alias Portb.0
    Clk Alias Portb.1
    Miso Alias Pinb.3                     'inp
    Mosi Alias Portb.2                     'out
    
    'Declarations
    Declare Sub Mprint
    Declare Sub Minit
    Declare Sub Mstatus
    Declare Sub Mwrite(byval Bout As Byte , Byval Addr As Long )
    Declare Sub Mread(byval Addr As Long )
    Declare Sub Merase(byval Saddr As Long , Byval Eaddr As Long)
    
    'AT103 HW SPI Portb0=SS to MMC 1, Portb1=clock to MMC 5, MISO=Portb3 to MMC 7, MOSI=Portb2 to MMC 2
    
    Config Pinb.0 = Output
    Config Pinb.1 = Output
    Config Pinb.2 = Output
    Config Pinb.3 = Input
    Waitms 300
    Config Spi = Soft , Din = Pinb.3 , Dout = Portb.2 , Ss = Portb.0 , Clock = Portb.1
    
    Spiinit
    
    
    
    
    '******** MAIN PROGRAM *************
    Main:
    
    'Initialize the MMCC
    Minit
    
    
    'If you want to use the ERASE routine
    'Uncomment and enter the start/end 32bit address values
    
    'Call erase subroutine enter StartAddr , EndAddr
    'Merase &H00000000 , &H00001000
    
    
    'call write subroutine as: BYTE-TO-WRITE, 32BIT_ADDRESS
    Mwrite &HBE , &H00000000
    
    'Call read sub from 512 from address are put in array INDAT
    Mread &H00000000
    
    'Call print sub print 512 bytes stored in INDAT array
    Mprint
    
    
    Xloop:
    Set Cs
    Shiftout Mosi , Clk , Dat , Msbl
    Endloop:
    Goto Endloop
    
    End                            'end program
    '************ END OF PROGRAM **************
    
    
    
    '======= SUB ROUTINES AND FUNCTIONS =======
    
    '*** INITIALIZATION OF MMC ***
    Sub Minit
    Set Cs
    Dat = &HFF
    For I = 1 To 10
     Shiftout Mosi , Clk , Dat , Msbl
    Next I
    Resp = 255
    Reset Cs
    
    Cmd0:
    Dat = &H40
    Shiftout Mosi , Clk , Dat , Msbl
    Addr = &H00000000
    Shiftout Mosi , Clk , Addr , Msbl
    Dat = &H95
    Shiftout Mosi , Clk , Dat , Msbl
    While Resp <> &H01
    Shiftin Miso , Clk , Resp , Msbl
    Wend
    
    Lcd "C0:" ; Hex(resp)
                       'Initialized
    Set Cs
    Waitms 50
    Reset Cs
    Dat = &HFF
    
    Cmd1:
    While Resp <> &H00
    Set Cs
    Shiftout Mosi , Clk , Dat , Msbl
    Shiftin Miso , Clk , Resp , Msbl
    Reset Cs
    Dat = &H41
    Shiftout Mosi , Clk , Dat , Msbl
    Addr = 0
    Shiftout Mosi , Clk , Addr , Msbl
    Dat = &HFF
    Shiftout Mosi , Clk , Dat , Msbl
    Shiftout Mosi , Clk , Dat , Msbl
    Shiftin Miso , Clk , Resp , Msbl
    Wend
    
    Dat = &HFF
    Set Cs
    Lcd "C1:" ; Hex(resp)
    End Sub
    
    '**** READ routine assumes ADDR uses Status subroutine *****
    Sub Mread(byval Addr As Long)
    Set Cs
    Dat = &HFF
    Shiftout Mosi , Clk , Dat , Msbl
    Shiftin Miso , Clk , Resp , Msbl
    Reset Cs
    Dat = &H51
    Shiftout Mosi , Clk , Dat , Msbl
    Shiftout Mosi , Clk , Addr , Msbl
    Dat = &HFF
    Shiftout Mosi , Clk , Dat , Msbl
    Shiftin Miso , Clk , Resp , Msbl
    
    While Resp <> 0
    Shiftin Miso , Clk , Resp , Msbl
    Wend
    
    While Resp <> &HFE
     Shiftin Miso , Clk , Resp , Msbl
    Wend
    
    'Lcd Hex(resp)
    For I = 1 To 512
      Shiftin Miso , Clk , Resp , Msbl
      Indat(i) = Resp
      'Print Hex(resp);
    Next I
    
    Shiftin Miso , Clk , Resp , Msbl
    Shiftin Miso , Clk , Resp , Msbl
    
    Set Cs
    Mstatus
    'Return
    End Sub
    
    '****Block Start Tag / End Tag and ERASE ****
    Sub Merase(byval Saddr As Long , Byval Eaddr As Long)
    
    'erase first 1024 bytes
    
    'Block START TAG
    Cmd32:
    
    Set Cs
    Shiftout Mosi , Clk , Dat , Msbl
    Shiftin Miso , Clk , Resp , Msbl
    Reset Cs
    Dat = &H60
    Shiftout Mosi , Clk , Dat , Msbl
    Shiftout Mosi , Clk , Saddr , Msbl
    Dat = &HFF
    Shiftout Mosi , Clk , Dat , Msbl
    Shiftout Mosi , Clk , Dat , Msbl
    Shiftin Miso , Clk , Resp , Msbl
    While Resp <> &H00
    Shiftin Miso , Clk , Resp , Msbl
    Wend
    
    'Block END TAG
    Cmd33:
    
    Set Cs
    Shiftout Mosi , Clk , Dat , Msbl
    Shiftin Miso , Clk , Resp , Msbl
    Reset Cs
    Dat = &H61
    Shiftout Mosi , Clk , Dat , Msbl
    Shiftout Mosi , Clk , Eaddr , Msbl
    Dat = &HFF
    Shiftout Mosi , Clk , Dat , Msbl
    Shiftout Mosi , Clk , Dat , Msbl
    Shiftin Miso , Clk , Resp , Msbl
    While Resp <> &H00
    Shiftin Miso , Clk , Resp , Msbl
    Wend
    
    'ERASE SELECTED BLOCK
    Cmd38:
    Set Cs
    Shiftout Mosi , Clk , Dat , Msbl
    Shiftin Miso , Clk , Resp , Msbl
    Reset Cs
    Dat = &H66
    Shiftout Mosi , Clk , Dat , Msbl
    Addr = 0
    Shiftout Mosi , Clk , Addr , Msbl
    Dat = &HFF
    Shiftout Mosi , Clk , Dat , Msbl
    Shiftout Mosi , Clk , Dat , Msbl
    Shiftin Miso , Clk , Resp , Msbl
    While Resp = 0
    Shiftin Miso , Clk , Resp , Msbl
    Wend
    
    Mstatus
    End Sub
    
    '** WRITE Routine assumes ADDR, BOUT uses Status subroutine **
    Sub Mwrite(byval Bout As Byte , Byval Addr As Long)
    Cmd24:
    Set Cs
    Dat = &HFF
    Shiftout Mosi , Clk , Dat , Msbl
    Shiftin Miso , Clk , Resp , Msbl
    Reset Cs
    Dat = &H58
    Shiftout Mosi , Clk , Dat , Msbl
    Shiftout Mosi , Clk , Addr , Msbl
    Dat = &HFF
    Shiftout Mosi , Clk , Dat , Msbl
    Shiftout Mosi , Clk , Dat , Msbl
    Shiftin Miso , Clk , Resp , Msbl
    While Resp <> 0
    Shiftin Miso , Clk , Resp , Msbl
    Wend
    Lcd "C24:" ; Hex(resp)
    
    Dat = &HFE
    Shiftout Mosi , Clk , Dat , Msbl
    
    For I = 1 To 512
     Shiftout Mosi , Clk , Bout , Msbl
    Next I
    Dat = &HFF
    Shiftout Mosi , Clk , Dat , Msbl
    Shiftout Mosi , Clk , Dat , Msbl
    Shiftin Miso , Clk , Resp , Msbl
    
    'If Y = &H05 write is a success
    Y = Resp And &H0F
    
    'If Resp = 0 the MMC is busy
    Shiftin Miso , Clk , Resp , Msbl
    While Resp = 0
    Shiftin Miso , Clk , Resp , Msbl
    Wend
    
    Lowerline
    
    Lcd "Wr:" ; Hex(y)
    Set Cs
    Mstatus
    End Sub
    
    'Get MMC Status
    Sub Mstatus
    Cmd13:
    Set Cs
    Shiftout Mosi , Clk , Dat , Msbl
    Shiftin Miso , Clk , Resp , Msbl
    Reset Cs
    Dat = &H4D
    Shiftout Mosi , Clk , Dat , Msbl
    Addr = 0
    Shiftout Mosi , Clk , Addr , Msbl
    Dat = &HFF
    Shiftout Mosi , Clk , Dat , Msbl
    Shiftout Mosi , Clk , Dat , Msbl
    Shiftin Miso , Clk , Resp2 , Msbl
    Print "Status:" ; Hex(resp2)
    Set Cs
    'Return
    End Sub
    
    Sub Mprint
    For I = 1 To 512
    Print Hex(indat(i));
    Next
    Mstatus
    End Sub



    این هم برنامه ای که من تغییرش دادم(فقط بدنه اصلی رو تغییر دادم و برای شلوغ نشدن فقط کد همون قسمت رو میزارم)





    کد:
    Config Lcd = 16 * 2
    Config Lcdbus = 4
    Config Lcdpin = Pin , Db7 = Portd.0 , Db6 = Portd.1 , Db5 = Portd.2 , Db4 = Portd.3 , E = Portd.4 , Rs = Portd.5
    Spiinit
    کد:
    
    
    
    '******** MAIN PROGRAM *************
    Main:
    Lcd "test"
    Wait 1
    
    'Initialize the MMCC
    Minit
    
    Xloop:
    Set Cs
    Shiftout Mosi , Clk , Dat , Msbl
    Endloop:
    Goto Endloop
    
    End                            'end program
    '************ END OF PROGRAM **************
    میکروی من mega32 هست و از کریستال 4MHz استفاده میکنم.
    به نظر شما دلیله این که lcd چیزی رو نشون نمیده چیه؟؟ :question: :question:

    موفق باشید





    Work with what you have .Never limit yourself by things you could have had

    #2
    پاسخ : مشکل این برنامه mmc چیه؟؟

    سلام دوباره

    دوستان میدونم حجم برنامه زیاده و خوندنش وقت میگیره. ولی مسئله فقت پیدا کردن مشکل برنامه در بدنه اصلی و روال minit هست.

    خواهش میکنم کمکم کنید.
    Work with what you have .Never limit yourself by things you could have had

    دیدگاه


      #3
      پاسخ : مشکل این برنامه mmc چیه؟؟

      سلام دوستان عزیز
      من می خوام دو تا متغییر رو داخل MMC ذخیره کنم که همه میدونیم به صورت TEXT ذخیره می شه مشکل اینجاست که باید در هنگام نوشتن در MMC دو تا متغییر به اندازه فرمان کلید TAB با هم فاصله داشته باشن تا زمانی که بخوام با نرم افزار اکسل بازشون کنم از همدیگه تفکیک شده باشن . تا حالا که نتونستم این کار رو انجام بدم و مقادیر دو متغییر به هم وصل میشن حتی از دستورات زیر هم استفاده کردم که فرمان TAB رو اجرا کنن ولی نشد . ممنون می شم راهنمایی کنین
      PRINT#1 , V;CHR(9);V2
      PRINT#1,V;"\T";V2
      با سپاس
      انجمن LABVIEW
      http://www.eca.ir/forum2/index.php?board=279.0
      اموزش ميكروكنترلرهاي AVR به زبان ساده
      http://www.eca.ir/forum2/index.php/topic,7070.0.html

      دیدگاه


        #4
        پاسخ : مشکل این برنامه mmc چیه؟؟

        سلام مجدد خدمت دوستان
        من خودم یک مقدار تحقیق کردم و متوجه شدم برای ایجاد فرمان TAB بین هر کارکتر که قراره در MMC ذخیره بشه باید در کتابخانه AVR_DOS تغییراتی انجام بشه .
        این قسمت رو از داخل برنامه AVR_DOS براتون میزارم :

        ' Character to separate ASCII Values in WRITE - statement (and INPUT)
        ' Normally a comma (,) is used. but it can be changed to other values, f.E.
        ' to TAB (ASCII-Code 9) if EXCEL Files with Tab separated values should be
        ' written or read. This parameter works for WRITE and INPUT
        ' Parameter value is the ASSCII-Code of the separator
        ' 44 = comma [default]
        ' 9 = TAB ' [default = 44]
        این قسمت میگه اگه می خوای بین کارکترها TAB ایجاد بشه باید مقدار از 44 به 9 تغییر حالت بده . من این کار رو انجام دادم ولی نمی دونم چرا زمانی که می خوام AVR-DOS رو کامپایل کنم خطا می ده . البته قبلش هم که تغییر بدم کلا خطا می ده .
        لطفا راهنمایی کنین دوستان
        با سپاس
        انجمن LABVIEW
        http://www.eca.ir/forum2/index.php?board=279.0
        اموزش ميكروكنترلرهاي AVR به زبان ساده
        http://www.eca.ir/forum2/index.php/topic,7070.0.html

        دیدگاه

        لطفا صبر کنید...
        X