Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

kompilacja programu do hex Pomocy

tomk41 29 Paź 2009 20:49 2151 5
  • #1 29 Paź 2009 20:49
    tomk41
    Poziom 9  

    Witam.Ostatnio zakupiłem sobie programator PIC i zbudowałem ciekawy układ i nawet działa
    o to układ : http://hobby_elec.piclist.com/e_pic6_2.htm

    Jednak nie chcę używać gotowego pliku hex dołączonego na stronie z układem, tylko przerobić plik źródłowy w asemblerze gdyż mam potrzebę zmienić trochę układ zapalanych diod.Problem w tym że nie wiem jak to zrobić

    o to źródło programu http://hobby_elec.piclist.com/e_pic6_26.htm

    Czy może ktoś mi to przerobić to źródło bym mógł otworzyć plik w mblap i zmieniać konfigurację zapalania diod poczym zapisać w pliku hex

    Post raportowany - Regulamin, p.15 - proszę poprawić błędy ortograficzne!
    Przeniosłem z Programowanie ogólne.
    [Dr.Vee]

    0 5
  • #2 30 Paź 2009 00:19
    korrus666
    Poziom 40  

    Zrób sobie nowy projekt w mplab. Na dole podanej przez Ciebie strony masz do pobrania plik ze źródłem programu wyglądającym tak.

    Code:

    ;********************************************************
    ;
    ;             The signboard control processing
    ;
    ;                                 Author : Seiichi Inoue
    ;********************************************************
            list            p=pic16f84a
            include         p16f84a.inc
           __config _hs_osc & _wdt_off & _pwrte_on & _cp_off

    ;****************  Label Definition  ********************
    lpcnt   equ     0c              ;Screen loop counter adr
    scrnidx equ     0d              ;Screen data index adr
    w_save  equ     0e              ;W register save adr
    s_save  equ     0f              ;STATUS reg save adr
    scrnhd  equ     10              ;Screen table head adr
    tm_cnt  equ     20              ;Time adjust counter adr
    e_adr   equ     21              ;EEPROM data adr
    e_check equ     22              ;EEPROM end check cnt adr
    s_loop  equ     23              ;Screen data loop cnt adr
    s_index equ     24              ;Screen table index adr
    s_work  equ     25              ;Screen data work area

    ;************************
    ;*     Time adjust      *
    ;************************

    ;This data decides a scroll speed. Basic rate is 26msec.
    tm_adj  equ     0c              ;Time adjust(26msec x 12)

    ;************************
    ;*   EEPROM data size   *
    ;************************
    ;If the data size is 30 bytes, then simply set d'30'.

    e_size  equ    d'32'            ;EEPROM data size

    ;***************  EEPROM Data Definition  ***************
            org     h'2100'
            de      b'11111111'
            de      b'11111111'




            de      b'11100011'
            de      b'11000001'
            de      b'10000000'
            de      b'00000001'
            de      b'00000011'
            de      b'00000001'
            de      b'10000000'
            de      b'11000001'
            de      b'11100011'
            de      b'11111111'
            de      b'11111111'
            de      b'11111111'
            de      b'11111111'
            de      b'11111111'
            de      b'11111111'
            de      b'11111111'
            de      b'11111111'
            de      b'11111111'
            de      b'11111111'
            de      b'11111111'
            de      b'11111111'
            de      b'11111111'
            de      b'11111111'
            de      b'11111111'
            de      b'11111111'
            de      b'11111111'
            de      b'11111111'
            de      b'11111111'
            de      b'11111111'
            de      b'11111111'

    ;****************  Program Start  ***********************
            org     0               ;Reset Vector
            goto    init
            org     4               ;Interrupt Vector
            goto    int

    ;****************  Initial Process  *********************
            org     5
    init    bsf     status,rp0      ;Change to Bank1
            clrf    trisa           ;Set PORTA to Output mode
            clrf    trisb           ;Set PORTB to Output mode
            movlw   h'07'           ;TOCS=0,PSA=0,PS2/1/0=111
            movwf   option_reg      ;Set timer condition
            bcf     status,rp0      ;Change to Bank0
            movlw   h'00'           ;Set timer value
            movwf   tmr0            ;TMR0 = 0 (255 counts)
            movlw   tm_adj          ;Set time adjust value
            movwf   tm_cnt          ;Save time adjust
            clrf    e_adr           ;Clear EEPROM data adr
            movlw   e_size          ;Set EEPROM data size
            movwf   e_check         ;Save EEPROM end check
            movlw   h'a0'           ;GIE=1,TOIE=1
            movwf   intcon          ;Interruption enable


    ;**************  Screen Load Process  *******************
    screen  bsf     intcon,gie      ;Interrupt enable
            movlw   d'16'           ;Set loop count
            movwf   lpcnt           ;Save loop count
            movlw   h'0f'           ;Set screen index
            movwf   scrnidx         ;Save index
            bcf     intcon,gie      ;Interrupt disable
    scrnlp  movlw   h'ff'           ;Set LED OFF data
            movwf   portb           ;Output Data
            movf    scrnidx,w       ;Set Position
            movwf   porta           ;Output Position
            movlw   scrnhd          ;Set Table head address
            addwf   scrnidx,w       ;Head + Index
            movwf   fsr             ;Set Table address
            movf    indf,w          ;Read Data
            movwf   portb           ;Output Data
            decf    scrnidx,f       ;Index - 1
            decfsz  lpcnt,f         ;Loop end ?
            goto    scrnlp          ;No. Next line
            goto    screen          ;Yes. Next screen


    ;************  Begin Interruption Process  **************
    int     movwf   w_save          ;Save W register
            movf    status,w        ;Read STATUS reg
            movwf   s_save          ;Save STATUS reg
            btfsc   intcon,t0if     ;Time out interruption ?
            goto    timer_int       ;Jump to Timer process
            goto    init            ;Reset(Illegal interrupt)


    ;************  END of Interruption Process **************
    int_end movf    s_save,w        ;Read saved STATUS reg
            movwf   status          ;Recover STATUS reg
            swapf   w_save,f        ;Read saved W register
            swapf   w_save,w        ;Recover W register
            retfie       
           

    ;***********  Time-out interruption Process  ************
    timer_int
            bcf     intcon,t0if     ;Clear timer int flag
            movlw   h'00'           ;Set timer value
            movwf   tmr0            ;TMR0 = 0 (255 counts)
            decfsz  tm_cnt,f        ;Time over ?
            goto    int_end         ;No. Retry
            movlw   tm_adj          ;Set time adjust value
            movwf   tm_cnt          ;Save time adjust


    ;************  Screen data shift Process  ***************
            movlw   d'15'           ;Set loop count
            movwf   s_loop          ;Save loop count
            movlw   scrnhd          ;Set screen head adr
            movwf   s_index         ;Set screen adr
    loop    incf    s_index,w       ;Inclement index
            movwf   fsr             ;Set read addres
            movf    indf,w          ;Read data
            movwf   s_work          ;Save data
            movf    s_index,w       ;Read index
            movwf   fsr             ;Set write address
            movf    s_work,w        ;Recover data
            movwf   indf            ;Write data
            incf    s_index,f       ;Inclement index
            decfsz  s_loop,f        ;All shifted ?
            goto    loop            ;No. Continue.


    ;**************  New data write Process  ****************
            movf    s_index,w       ;Read index
            movwf   fsr             ;Set write address
            movf    e_adr,w         ;Read EEPROM address
            movwf   eeadr           ;Set EEPROM address
            bsf     status,rp0      ;Change to Bank1
            bsf     eecon1,rd       ;Start EEPROM reading
            bcf     status,rp0      ;Change to Bank0
            movf    eedata,w        ;Read EEPROM data
            movwf   indf            ;Write new data
            incf    e_adr,f         ;Inclement data address
            decfsz  e_check,f       ;End of EEPROM data ?
            goto    int_end         ;No. Return
            clrf    e_adr           ;Clear EEPROM data adr
            movlw   e_size          ;Set EEPROM data size
            movwf   e_check         ;Save EEPROM end check
            goto    int_end         ;Return


    ;********************************************************
    ;          END of signboard control processing
    ;********************************************************
            end


    Dodaj sobie do projektu ten plik i już masz program do modyfikacji.
    Za wyświetlany znak odpowiedzialna jest sekcja:
    Code:
    ;***************  EEPROM Data Definition  ***************

    Masz tam 32 linie z bajtami odpowiedzialnymi za zapalanie się diod.
    W projekcie masz matrycę 8x16. Każdy bajt tej 32-bajtowej sekcji to jedna kolumna tego wyświetlanego znaku. 0 oznacza zapaloną diodę a 1 zgaszoną. Zresztą możesz poeksperymentować i zobaczyć co się zmienia jak modyfikujesz te dane.
    Powodzenia.

    0
  • #3 30 Paź 2009 08:52
    tomk41
    Poziom 9  

    Wita.Dziękuje za odpowiedz...właśnie dodałem nowy projekt do mplab który widać wyżej ale wyskakują błędy kiedy robię Quckbulit o to lista :
    Co Robię źle
    kompilacja programu do hex Pomocy

    0
  • Pomocny post
    #5 30 Paź 2009 11:08
    K_o_n_r_a_d
    Poziom 23  

    Wszystko masz napisane w komunikacie błędu.

    Code:
    Error[113]   D:\1111111111111111111111111111\NOWY FOLDER\UNTITLED.ASM 175 : Symbol not previously defined (eedata)
    Wielkośc liter ma znaczenie. Użyj takich jak są w definicji. Otwórz plik, np. p16f84a.inc, znajdziesz go w katalogu C:\Program Files\Microchip\MPASM Suite i tam są zdefiniowane.
    Czyli w przypadku lini 175 zamiast:
    Code:
    movf    eedata,w 

    Wpisz:
    Code:
    movf    EEDATA,w


    Dodano po 1 [minuty]:

    Ewentualnie wyłącz "czułość wilkości liter" :)
    Build Options > zakładka MPASM Assembler > Disable case sensitivity

    0
  • #6 30 Paź 2009 12:08
    tomk41
    Poziom 9  

    Bardzo dziękuje za pomoc !!!Chodziło o duże litery ...Gdyby nie Wy to już chyba bym sobie dał z tym spokój:) POZDRAWIAM

    0