Sida 1 av 1

16f84 och MPASM

Postat: 7 augusti 2010, 12:35:27
av Nc
Vet att 16f84 är en väldigt gammal processor men var det vi använde år 2000 då vi gjorde detta program,

då jag försöker köra den asm fil jag har kvar i mpasmwin (senaste version) så gnäller den på att p16cxxd.inc och p16cxx.inc inte finns,

Någon som vet var man kan finna dessa filer alternativt ersättningsbibliotek så man slipper skriva om programmet..

Re: 16f84 och MPASM

Postat: 7 augusti 2010, 12:51:08
av Icecap
Ta bort ena include och ändra namnet på den andra till "p16f84.inc" eller "p16f84a.inc" beroende på vilken processor ni använder.

Re: 16f84 och MPASM

Postat: 7 augusti 2010, 15:35:47
av Nc
Tack nu har vi kommit en bra bit längre,

bytt programmerare till wisp så verkar inte riktigt få ordning på kristallstyrningen för så fort programmet går in i en vänt loop så händer inget mer men kan ju vara jag som inte får till fuses på rätt sätt.

för alla utgångar som sätts innan dessa loopar fungerar som de ska.

Re: 16f84 och MPASM

Postat: 7 augusti 2010, 15:40:07
av sodjan
Vill du/ni ha hjälp ? Det ser inte riktigt ut så nu.
Om det är så, så får du nog beskriva lite närmare vad du/ni har problem med.

Re: 16f84 och MPASM

Postat: 7 augusti 2010, 15:59:38
av Nc
är styrning till en amatörradio repiter (baserad på en cw generator vi hittade koden till, så det är endast styrningen av den som vi gjort men de är länge sedan)

efter lite testande så har vi konstaterat att våra loopar tar mycket längre tid än de ska.

lade till __CONFIG(0x3FF1) för att flytta in fuses i koden tidigare sate vi de i den programvara man programmerade kretsen med, men nåt där stämmer nog inte för känns inte som det går med den externa kristallen

Det är ju inte direkt snygg kod men så här ser den ut.

Kod: Markera allt


        include "p16f84.inc"
        ;include "p16cxx.inc"
        include "p16cxxd.inc"




__CONFIG(0x3FF1)





; our variables
ydel	equ	0x09
xdel	equ	0x0a
del	equ	0x0b
cnt     equ     0x0c
cyc     equ     0x0d
units   equ     0x0e
tmp     equ     0x0f




        org   0x000         ; The main line code starts here

; First we do all required initialization

Start

; Set port A as output
        bsf     STATUS,RP0      ;Bank 1
        movlw   0
        movwf   TRISA

; Enable port B pullups
	bcf     OPTION_REG,NOT_RBPU


	


; Switch back to bank 0
        bcf     STATUS,RP0      ;Bank 0

; Ready for main loop
Top


	bcf	RA1
	call	notuse
	movlw   10      ;wait 
        movwf   units
        call    dlunit
Lock1        
	btfss	6,0
	goto	Lock1
	
	bsf     RA1     ;key the transmitter
	movlw	10
	movwf	units
	call	dlunit
	call	Brus
	call	id


        
	movlw   20      ;wait 2,5 seconds
        movwf   units
        call    dlunit

       
        bcf     RA1     ;unkey the transmitter

        goto    Top




; Send an ID message
id      call    dash
        call    dot
        call    dot
        call    spc
        call    dot
        call    ps
        call    dot
        call    dot
        call    dot
        call    spc
        call    dash
        call    dot
        call    dash
        call    spc
        call    dot
        call    dot
        call    dot
        call    dash
        call    dash
        call    spc
        call    dot
        call    dash
        call    dot
        call    spc
        call    dot
        call    dot
        call    spc
        call    dash
        call    dot
        call    ps
        return




; Send a dot
dot     movlw   1
        movwf   units
        call    tnunit
        movlw   1
        movwf   units
        call    dlunit
        return




;Send a dash
dash    movlw   3
        movwf   units
        call    tnunit
        movlw   1
        movwf   units
        call    dlunit
        return




;Finish a space
spc     movlw   2
        movwf   units
        call    dlunit
        return




;Finish a pause
ps      movlw   6
        movwf   units
        call    dlunit
        return




; Delay units * 90 cycles of 750 Hz tone
dlunit  movlw   70
        movwf   cyc
dlhi    nop
        bcf     RA0             ;set tone bit low
        call    haf             ;wait a bit

        nop                     ;waste 8 cycles for symmetry
        movlw   2
        movwf   tmp
dlmid   decfsz  tmp,1
        goto    dlmid

        bcf     RA0             ;set tone bit low
        call    haf             ;wait a bit

        decfsz  cyc,1           ;one less cycle to send
        goto    dlpad           ;do another cycle

        decfsz  units,1         ;Another unit done
        goto    dlunit
        return

dlpad   nop                     ;4 cycles for padding
        nop
        goto    dlhi




; Send units * 90 cycles of 750 Hz tone
tnunit  movlw   90
        movwf   cyc
tnhi    nop
        bsf     RA0             ;set tone bit high
        call    haf             ;wait a bit

        nop                     ;waste 8 cycles for symmetry
        movlw   2
        movwf   tmp
tnmid   decfsz  tmp,1
        goto    tnmid

        bcf     RA0             ;set tone bit low
        call    haf             ;wait a bit

        decfsz  cyc,1           ;one less cycle to send
        goto    tnpad           ;do another cycle

        decfsz  units,1         ;Another unit done
        goto    tnunit
        return

tnpad   nop                     ;4 cycles for padding
        nop
        goto    tnhi



; delay for half a cycle of 750 Hz

; A 750 HZ tone is 1.333333 milliseconds
; in duration.  This means each half cycle
; of the tone is 666.6666 microseconds.
; Since I'm using a 6.0 MHz Xtal, this
; is 1000 CPU cycles per tone half cycle.

; Since the routine that calls this to generate
; the tone takes 11 CPU cycles per Tone half
; cycle, we need to burn up 989 CPU cycles
; in this routine.

; This routine takes 13 + ((K -1) * 4) cycles
; where K is the argument for the movlw
; instruction.

haf
        nop
        nop
        nop
        movlw   245
        movwf   cnt
luphaf
        nop
        decfsz  cnt,1
        goto    luphaf
        goto    lupxt
lupxt   nop
        return

Brus	movlw	250
	movwf	cyc
	call	id1
brus6	movlw	250
	movwf	tmp
brus5	movlw	250
	movwf	cnt
brus1	nop
	goto	brus2
brus3	decfsz	cnt,1
	goto	brus1
	decfsz	tmp,1
	goto	brus5
	decfsz	cyc,1
	goto	brus6
	Return
brus2 
	btfsc	6,1	;kollar Rb1
	goto	brus3

	movlw   10      ;wait 
        movwf   units
        call    dlunit
Brus4        
	btfss	6,1
	goto	Brus4
	goto	Brus

id1	call	dash
	call	dot
	call	dash
	Return
	
notuse	
	movlw	35
	movwf	tmp
notuse1	movlw	250
	movwf	cnt
notuse2	movlw	250
	movwf	cyc
notuse3	movlw	250
	movwf	units   
notuse4	goto	rain
notuse5	decfsz	units,1
	goto	notuse4
	decfsz	cyc,1
	goto	notuse3
	decfsz	cnt,1
	goto	notuse2
	decfsz	tmp,1
	goto	notuse3
	movlw   10      ;wait 
        movwf   units
        call    dlunit
	bsf	RA1	;key Transmitter
	movlw   10      ;wait 1,25 seconds
        movwf   units
        call    dlunit
	call	id
	movlw   10      ;wait 1,25 seconds
        movwf   units
        call    dlunit
	bcf	RA1	;Unkey transmiter
	goto	notuse

rain	btfsc	6,0	;Kollar RB0
	goto	notuse5
	movlw   255	;wait 
        movwf   del
tut	movlw	255
	movwf	xdel	
pip     movlw	255
	movwf	ydel
honk	decfsz	ydel,1
	goto	honk
	nop
	nop
	
	decfsz	xdel,1
	goto 	pip
	decfsz 	del,1
	goto 	tut	
	
	nop
	nop
	btfsc	6,0	;kollar RB0
	goto	notuse5	;bestämer längden på tonen RB0
	return
	end



Re: 16f84 och MPASM

Postat: 7 augusti 2010, 16:30:15
av sodjan
> lade till __CONFIG(0x3FF1)

Skriv intre så. Ange de olika CONFIG parameterarna separat så att det går
att läsa. De finns i INC filen.

Kod: Markera allt

;==========================================================================
;
;       Configuration Bits
;
;==========================================================================

_CP_ON                       EQU     H'000F'
_CP_OFF                      EQU     H'3FFF'
_PWRTE_ON                    EQU     H'3FF7'
_PWRTE_OFF                   EQU     H'3FFF'
_WDT_ON                      EQU     H'3FFF'
_WDT_OFF                     EQU     H'3FFB'
_LP_OSC                      EQU     H'3FFC'
_XT_OSC                      EQU     H'3FFD'
_HS_OSC                      EQU     H'3FFE'
_RC_OSC                      EQU     H'3FFF'
Tex (from template för 16F84A) :

Kod: Markera allt

	list      p=16F84             ; list directive to define processor
	#include <p16F84.inc>         ; processor specific variable definitions

	__CONFIG   _CP_OFF & _WDT_ON & _PWRTE_ON & _RC_OSC
I erat fall ska ni använda _LP_OSC, _XT_OSC eller _HS_OSC beroende på vilken
kristall ni har (frekvens).

> ...för att flytta in fuses i koden

Det kallas inte "fuses" i PIC, men annars så är det helt rätt. Mycket bättre
att ha CONFIG inställningarna i koden så förljer det alltid med oavsett vilka
verktyg man använder för övrigt.

Re: 16f84 och MPASM

Postat: 8 augusti 2010, 13:39:37
av Nc
Har en 4 MHz kristall Så bör vara XT men har provat alla tre för säkerhetsskull men allt går fruktansvärt långsamt iallafall,

skriver så här

Kod: Markera allt

__CONFIG   _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
måste man i programmet skriva in frekvensen på kristallen ?

Re: 16f84 och MPASM

Postat: 8 augusti 2010, 13:46:33
av sodjan
> men allt går fruktansvärt långsamt iallafall,

Det är en fullständigt värdelös uppgift !
Ange istället exakt *HUR* långsamt det går.

Notera även att det i koden bl.a står "Since I'm using a 6.0 MHz Xtal,"
men det har du säkert redan noterat och tragit hänsyn till, eller hur ?

Re: 16f84 och MPASM

Postat: 8 augusti 2010, 15:54:51
av Nc
Jo för står det.

Den går hälften av vad den skall, har en annan variant med exakt samma CW delar (de som vi hittade på internet ) och den fungerar utan problem med samma 4mhz kristal så vet inte riktigt vad som gjort att det blir fel. men gjort om alla räknare nu så det stämmer.

Tack för all hjälp å info nu har man lärt sig lite mer vilket aldrig är fel.

Re: 16f84 och MPASM

Postat: 8 augusti 2010, 16:19:42
av sodjan
Hälften så snabbt är väl väldigt långt från "fruktansvärt långsamt"... :-)

Hm, det känns lite som att den urprungliga koden var skriven för 8 MHz.

Hur som helst, detta är väldigt enkelt och snabbt att verifiera med
"stopwatch" i MPLAB/SIM. Bara att sätta några break-points, köra
samt läsa av stoppuret...