16f84 och MPASM
16f84 och MPASM
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..
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
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
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.
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
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.
Om det är så, så får du nog beskriva lite närmare vad du/ni har problem med.
Re: 16f84 och MPASM
ä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.
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
> 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.
Tex (from template för 16F84A) :
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.
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'
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
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
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
måste man i programmet skriva in frekvensen på kristallen ?
skriver så här
Kod: Markera allt
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
Re: 16f84 och MPASM
> 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 ?
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
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.
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
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...

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...