Stránka 1 z 1

PIC16F877 - nejde ani blikání LED

Napsal: 10 srp 2016, 12:52
od paulie2907
Dobrý den,

po nějaké době jsem opět narazil na zcestí. Nejde mi udělat ani blikač s PIC16F877. Nejde o blikač, ale na každé desce dělám kontrolní ledku se kterou testuju všechny funkce.

Pro jistotu jsem vzal jiné IO a zkusil na kontaktním nepájivém poli a hle, stejný výsledek i s RC tak XT oscilátorem. Ledka nezabliká - myslím, že mám nějakou botu v programu, jinak si to nedokážu vyložit. Jsem C++kař, ale dělám to v Assembleru, pro mě občas nepochopitelný jazyk :roll: .

Programátor používám PRESTO a samosebou HPV programování - proběhne bez jediné chyby.

Kód: Vybrat vše

; xxxxxxxxxxxxxxxxxxxxxxxx
; x   for UNI - BOARD v 1.0     x
; x firmware for check braket x
; xxxxxxxxxxxxxxxxxxxxxxxx


LIST P=16F877
INCLUDE<P16F877.INC>
 __CONFIG _PWRTE_OFF & _WDT_OFF & _XT_OSC & _LVP_OFF

; // Inputs
#DEFINE INT_LED PORTB,5      ; Senzor cilindru 1

; // Outputs
;#DEFINE SIREN PORTB,1      ; Výstup pro sirénu (maják)

; Registry pro Časové odpočty
CISLO   equ   20h
CISLOA   equ   21h
CISLOB   equ   22h
CISLOC   equ 23h

BSF STATUS,RP0            ;Nastavení banky 1
MOVLW B'00000000'         ;Uložením hodnoty do pracovního registru W
MOVWF TRISA               ;Přesunutí z registru W do registru TRISA (Dochází k nastavení portů vstupně-výstupních pinů)
MOVLW B'00000000'         ;Uložením hodnoty do pracovního registru W
MOVWF TRISB               ;Přesunutí z registru W do registru TRISA (Dochází k nastavení portů vstupně-výstupních pinů)
BCF STATUS,RP0
BCF STATUS,RP1

BCF STATUS, RP0 ;
BCF STATUS, RP1 ; Bank0
 
CLRF PORTA ; Initialize PORTA by
BSF STATUS, RP0 ; Select Bank 1
MOVLW 0x06 ; Configure all pins
MOVWF ADCON1 ; as digital inputs
 
 
INIT
BSF INT_LED
CALL WAIT_1000
BCF INT_LED
CALL WAIT_1000
GOTO INIT


; ---------------------------------- TIMER ZONE ----------------------------------
WAIT_200   CLRF CISLO
POINT_200    INCFSZ CISLO,1
         GOTO POINT_200
         INCFSZ CISLOA,1
         GOTO POINT_200
         RETURN

WAIT_500   CALL WAIT_200
         CALL WAIT_200
         RETURN         
         
WAIT_1000   CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         RETURN

WAIT_2000   CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         RETURN
         
WAIT_3000   CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         RETURN
         
WAIT_4000   CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         RETURN
         
WAIT_5000   CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         RETURN
         
WAIT_10000   CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         CALL WAIT_200
         RETURN
      
END


Pozn : Kód jsem radši dal celý pro jistotu, je to takové "homemade".

Napsal: 10 srp 2016, 13:11
od ST78
Hluboce jsem to nestudoval, ale před hlavní smyčkou je přepnuto na jinou banku a už se to nevrátilo zpět...
Zkus si prověřit Banky :-)

Napsal: 10 srp 2016, 15:13
od procesor
Rád by som videl preklad (listing) xxxx.lst toho xxxx.asm

Možno používaš prekladač, ktorý nepotrebuje aspoň jednu medzeru pred inštrukciou. Moje všetky bežné prekladače text na začiatku riadku považujú za návestie.
edit:
Pozná to aj tak zapísané....
V tom bankovaní bude pes.

Kód: Vybrat vše

Warning[203]: Found opcode in column 1. (BSF)
0000   1683           00023 BSF STATUS,RP0            ;Nastavení banky 1
Warning[203]: Found opcode in column 1. (MOVLW)
0001   3000           00024 MOVLW B'00000000'         ;Uložením hodnoty do pracovního registru W
Warning[203]: Found opcode in column 1. (MOVWF)
Message[302]: Register in operand not in bank 0.  Ensure that bank bits are correct.
0002   0085           00025 MOVWF TRISA               ;Přesunutí z registru W do registru TRISA (Dochází k nastavení portů vstupně-v
                            ýstupních pinů)
Warning[203]: Found opcode in column 1. (MOVLW)
0003   3000           00026 MOVLW B'00000000'         ;Uložením hodnoty do pracovního registru W
Warning[203]: Found opcode in column 1. (MOVWF)
Message[302]: Register in operand not in bank 0.  Ensure that bank bits are correct.
0004   0086           00027 MOVWF TRISB               ;Přesunutí z registru W do registru TRISA (Dochází k nastavení portů vstupně-v
                            ýstupních pinů)
Warning[203]: Found opcode in column 1. (BCF)
0005   1283           00028 BCF STATUS,RP0
Warning[203]: Found opcode in column 1. (BCF)
0006   1303           00029 BCF STATUS,RP1
                      00030
MPASM  5.43                          BLIK.ASM   8-10-2016  15:23:54         PAGE  2


LOC  OBJECT CODE     LINE SOURCE TEXT
  VALUE

Warning[203]: Found opcode in column 1. (BCF)
0007   1283           00031 BCF STATUS, RP0 ;
Warning[203]: Found opcode in column 1. (BCF)
0008   1303           00032 BCF STATUS, RP1 ; Bank0
                      00033 
Warning[203]: Found opcode in column 1. (CLRF)
0009   0185           00034 CLRF PORTA ; Initialize PORTA by
Warning[203]: Found opcode in column 1. (BSF)
000A   1683           00035 BSF STATUS, RP0 ; Select Bank 1
Warning[203]: Found opcode in column 1. (MOVLW)
000B   3006           00036 MOVLW 0x06 ; Configure all pins
Warning[203]: Found opcode in column 1. (MOVWF)
Message[302]: Register in operand not in bank 0.  Ensure that bank bits are correct.
000C   009F           00037 MOVWF ADCON1 ; as digital inputs
                      00038 
                      00039 
000D                  00040 INIT
Warning[203]: Found opcode in column 1. (BSF)
000D   1686           00041 BSF INT_LED
Warning[203]: Found opcode in column 1. (CALL)
000E   201B           00042 CALL WAIT_1000
Warning[203]: Found opcode in column 1. (BCF)
000F   1286           00043 BCF INT_LED
Warning[203]: Found opcode in column 1. (CALL)
0010   201B           00044 CALL WAIT_1000
Warning[203]: Found opcode in column 1. (GOTO)
0011   280D           00045 GOTO INIT
                      00046

Napsal: 10 srp 2016, 21:33
od frpr666
co furt mají všichni s tím assemblerem? Předpokládám, že stejný cíl lze dosáhnout C překladačem, který je zdarma.
Jinak radím maximálně zjednodušit program a vyhnout se věcem jako CALL WAIT_200 50x za sebou. :D

Nedává se na začátek něco takového?

Kód: Vybrat vše

rst code  0x00                  ;Reset Vector
  pagesel Start
  goto    Start

    code                        ;Start Program
Start
  clrf   distance_reg           ;Clear register

  movlw  Tdistance1             ;Move value of Tdistance1
  movwf  distance_reg           ;into distance_reg

a instrukce musí začínat odsazené od začátku řádku?

Napsal: 13 srp 2016, 21:46
od Tranzistor
Asembler je v silných rukách šikovná vec.


A pozri si register ANSEL a ANSELH v Datasheete ;) Jeho stav po resete a čo ma na starosti a hneď ti to dôjde.

Napsal: 15 srp 2016, 13:34
od petrfilipi
Tak takhle mi přeložil pokusné blikání MikroPascal (frekvence je 4MHz) :

; LST file generated by mikroListExporter - v.2.0
; Date/Time: 15.8.2016 13:23:34
;----------------------------------------------

;Address Opcode ASM
0x0000 0x2803 GOTO 3
_main:
;LedBlinking.mpas,27 :: begin
;LedBlinking.mpas,29 :: TRISA := 0; // set direction to be output
0x0003 0x1683 BSF STATUS, 5
0x0004 0x1303 BCF STATUS, 6
0x0005 0x0185 CLRF TRISA
;LedBlinking.mpas,31 :: while TRUE do
L__main2:
;LedBlinking.mpas,34 :: PortA := 0x00; // Turn OFF LEDs on PORTE
0x0006 0x1283 BCF STATUS, 5
0x0007 0x0185 CLRF PORTA
;LedBlinking.mpas,35 :: Delay_ms(1000); // 1 second delay
0x0008 0x3006 MOVLW 6
0x0009 0x00FB MOVWF R11
0x000A 0x3013 MOVLW 19
0x000B 0x00FC MOVWF R12
0x000C 0x30AD MOVLW 173
0x000D 0x00FD MOVWF R13
L__main6:
0x000E 0x0BFD DECFSZ R13, 1
0x000F 0x280E GOTO L__main6
0x0010 0x0BFC DECFSZ R12, 1
0x0011 0x280E GOTO L__main6
0x0012 0x0BFB DECFSZ R11, 1
0x0013 0x280E GOTO L__main6
0x0014 0x0000 NOP
0x0015 0x0000 NOP
;LedBlinking.mpas,37 :: PortA := 0xFF; // Turn ON LEDs on PORTE
0x0016 0x30FF MOVLW 255
0x0017 0x0085 MOVWF PORTA
;LedBlinking.mpas,38 :: Delay_ms(1000); // 1 second delay
0x0018 0x3006 MOVLW 6
0x0019 0x00FB MOVWF R11
0x001A 0x3013 MOVLW 19
0x001B 0x00FC MOVWF R12
0x001C 0x30AD MOVLW 173
0x001D 0x00FD MOVWF R13
L__main7:
0x001E 0x0BFD DECFSZ R13, 1
0x001F 0x281E GOTO L__main7
0x0020 0x0BFC DECFSZ R12, 1
0x0021 0x281E GOTO L__main7
0x0022 0x0BFB DECFSZ R11, 1
0x0023 0x281E GOTO L__main7
0x0024 0x0000 NOP
0x0025 0x0000 NOP
;LedBlinking.mpas,39 :: end; // Endless loop
0x0026 0x2806 GOTO L__main2
;LedBlinking.mpas,40 :: end.
L_end_main:
0x0027 0x2827 GOTO $+0
; end of _main
Symbol List:
//** Routines locations **
//ADDRESS SIZE PROCEDURE
//----------------------------------------------
0x0003 [37] _main
//** Variables locations **
//ADDRESS SIZE VARIABLE
//----------------------------------------------
0x0005 [1] PORTA
0x0070 [1] R0
0x0071 [1] R1
0x0072 [1] R2
0x0073 [1] R3
0x0074 [1] R4
0x0075 [1] R5
0x0076 [1] R6
0x0077 [1] R7
0x0078 [1] R8
0x0079 [1] R9
0x007A [1] R10
0x007B [1] R11
0x007C [1] R12
0x007D [1] R13
0x007E [1] R14
0x007F [1] R15
0x0085 [1] TRISA
//** Label List: **
//----------------------------------------------
L_end__main
L__main1
L__main2
L__main3
L__main4
L__main5
L__main6
L__main7
L_end_main
_main

Napsal: 17 srp 2016, 17:07
od Habesan
Ale tohle je assemblerový kód, který vznikl během překladu pascalového kódu.

To jste se ve škole neučili: "preprocesor, kompiler, assembler, linker..." ???
(Asi poslední příležitost, kdy člověk ty pojmy použije.)

Napsal: 17 srp 2016, 22:15
od petrfilipi
No já jsem si myslel, že zadavatel původního příspěvku chce assembler. Proto jsem použil výpis, kde má jak zdrojový kód (řádky se znakem ; na začátku), tak i přeložené příkazy MikroPascalu do assembleru (časové smyčky 1s jsou vypočítání pro krystal 4MHz).

PF

Napsal: 04 zář 2016, 16:16
od Rako
Program nefunguje hlavne preto že pred vstupom do hlavnej slučky MAIN je
nastavená banka1 ale pracovné registre CISLO a CISLOA su v banke 0.
Takže treba nakoniec inicializácie vložiť príkaz BANKSEL CISLO.
Ďalej chýba vstupný bod programu. To vo finále môže byť chyba ale nemusí,
v závislosti od prekladača. Doplnil by som teda následujúcu sekvenciu príkazov.

ORG 0H
GOTO INIT
ORG 4H
NOP


Opravený, plne funkčný program v prílohe.