Thanks darrel,
i've got a weird one here... i'm not sure what the hell is going on but something is screwed...
basically, it's a test program, every time TMR1 over flows it toggles an LED, just so that i can see it's working...
it's doing weird things to the ports so i simulated it in oshonsoft's pic simulator...
i toggle the PIR1.0 manually...
What i found is the first overrflow turns PORTB.1 on,
Second overflow turns PORTB.3 on
3 and above overflows turn PORTC3 on and off...
It's not supposed to touch PORTC at all!
Here is that BAS file
Code:
ASM
device pic16F877A
device HS_OSC
device WDT_ON
device PWRT_ON
device BOD_ON
device LVP_OFF
device WRT_OFF
device CPD_OFF
device DEBUG_OFF
ENDASM
Define OSC 24 ' Set clock speed
INTCON = 0 ' Disable all interupts
TRISE = %00000111 ' Set PortE to all inputs
TRISD = %00000000 ' Set PortD to all outputs
TRISC = %00000000 ' Set PortC to all outputs
TRISB = %00000000 ' Set PortB to all outputs
TRISA = %11111111 ' Set PORTA to all input
HIGH PORTB
HIGH PORTB.0
'pause 5000
low PORTB
gosub TMR1setup
loop:
if PIR1.0 = 1 then ' if TMR1 has overflowed
T1CON.0 = 0 ' Stop tmr 1
PIR1.0 = 0
toggle PORTB
gosub TMR1setup ' reset and restart TMR1
endif
goto loop
TMR1setup:
TMR1L = 0 ' reset TMR1 low to 0
TMR1H = 0 ' reset TMR1 high to 0
PIE1.0 = 0 ' Disable TMR1 interupt (double check)
T1CON.5 = 0 ' Setup TMR1 timings 1:1
T1CON.4 = 0 ' Setup TMR1 timings 1:1
T1CON.3 = 1 ' Oscillator is ON (LP OSC Mode)
T1CON.2 = 1 ' do not Synchronize external clock input
T1CON.1 = 1 ' External clock from pin RC0
T1CON.0 = 1 ' Enables Timer1
return
Here is the ASM file
Code:
; PicBasic Pro Compiler 2.44, (c) 1998, 2003 microEngineering Labs, Inc. All Rights Reserved.
PM_USED EQU 1
INCLUDE "16F877A.INC"
; Define statements.
#define CODE_SIZE 8
#define OSC 24
RAM_START EQU 00020h
RAM_END EQU 001EFh
RAM_BANKS EQU 00004h
BANK0_START EQU 00020h
BANK0_END EQU 0007Fh
BANK1_START EQU 000A0h
BANK1_END EQU 000EFh
BANK2_START EQU 00110h
BANK2_END EQU 0016Fh
BANK3_START EQU 00190h
BANK3_END EQU 001EFh
EEPROM_START EQU 02100h
EEPROM_END EQU 021FFh
R0 EQU RAM_START + 000h
R1 EQU RAM_START + 002h
R2 EQU RAM_START + 004h
R3 EQU RAM_START + 006h
R4 EQU RAM_START + 008h
R5 EQU RAM_START + 00Ah
R6 EQU RAM_START + 00Ch
R7 EQU RAM_START + 00Eh
R8 EQU RAM_START + 010h
FLAGS EQU RAM_START + 012h
GOP EQU RAM_START + 013h
RM1 EQU RAM_START + 014h
RM2 EQU RAM_START + 015h
RR1 EQU RAM_START + 016h
RR2 EQU RAM_START + 017h
_PORTL EQU PORTB
_PORTH EQU PORTC
_TRISL EQU TRISB
_TRISH EQU TRISC
#define _PORTB_0 PORTB, 000h
#define _PIR1_0 PIR1, 000h
#define _T1CON_0 T1CON, 000h
#define _PIE1_0 PIE1, 000h
#define _T1CON_5 T1CON, 005h
#define _T1CON_4 T1CON, 004h
#define _T1CON_3 T1CON, 003h
#define _T1CON_2 T1CON, 002h
#define _T1CON_1 T1CON, 001h
INCLUDE "XTALTE~1.MAC"
INCLUDE "PBPPIC14.LIB"
ASM?
device pic16F877A
device HS_OSC
device WDT_ON
device PWRT_ON
device BOD_ON
device LVP_OFF
device WRT_OFF
device CPD_OFF
device DEBUG_OFF
ENDASM?
MOVE?CB 000h, INTCON
MOVE?CB 007h, TRISE
MOVE?CB 000h, TRISD
MOVE?CB 000h, TRISC
MOVE?CB 000h, TRISB
MOVE?CB 0FFh, TRISA
HIGH?B PORTB
HIGH?T _PORTB_0
LOW?B PORTB
GOSUB?L _TMR1setup
LABEL?L _loop
CMPNE?TCL _PIR1_0, 001h, L00001
MOVE?CT 000h, _T1CON_0
MOVE?CT 000h, _PIR1_0
TOGGLE?B PORTB
GOSUB?L _TMR1setup
LABEL?L L00001
GOTO?L _loop
LABEL?L _TMR1setup
MOVE?CB 000h, TMR1L
MOVE?CB 000h, TMR1H
MOVE?CT 000h, _PIE1_0
MOVE?CT 000h, _T1CON_5
MOVE?CT 000h, _T1CON_4
MOVE?CT 001h, _T1CON_3
MOVE?CT 001h, _T1CON_2
MOVE?CT 001h, _T1CON_1
MOVE?CT 001h, _T1CON_0
RETURN?
END
And here is the MAC file...
Code:
NOLIST
; PicBasic Pro Compiler 2.44, (c) 1998, 2003 microEngineering Labs, Inc. All Rights Reserved.
LABEL?L macro Label
RST?RP
ifdef PM_USED
LALL
Label
XALL
else
Label
endif
endm
CMPNE?TCL macro Regin, Bitin, Cin, Label
if (Cin == 0)
CLRWDT?
BIT?GOTO 1, Regin, Bitin, Label
else
if (Cin == 1)
CLRWDT?
BIT?GOTO 0, Regin, Bitin, Label
else
L?GOTO Label
endif
endif
endm
ASM? macro
RST?RP
endm
ENDASM? macro
endm
GOSUB?L macro Label
local dlabel
ifdef DEBUG_STACK
CHK?RP DEBUG_STACK
ifdef DEBUG_STACK_ADDR
bcf STATUS, C
rlf DEBUG_STACK, W
addlw DEBUG_STACK_ADDR
movwf FSR
movlw low (dlabel)
movwf INDF
incf FSR, F
movlw (dlabel) >> 8
movwf INDF
endif
incf DEBUG_STACK, F
endif
L?CALL Label
dlabel
endm
GOTO?L macro Label
L?GOTO Label
endm
HIGH?B macro Bin
MOVE?BA Bin
L?CALL HIGHP
endm
HIGH_USED = 1
HIGH?T macro Regin, Bitin
MOVE?CT 1, Regin, Bitin
MOVE?CT 0, ((Regin) + 80h), Bitin
endm
LOW?B macro Bin
MOVE?BA Bin
L?CALL LOWP
endm
LOW_USED = 1
RETURN? macro
ifdef DEBUG_STACK
CHK?RP DEBUG_STACK
decf DEBUG_STACK, F
endif
RST?RP
return
endm
TOGGLE?B macro Bin
MOVE?BA Bin
L?CALL TOGGLE
endm
TOGGLE_USED = 1
LIST
And this is the HEX file
Code:
:1000000026280F2080040B280F20FF3A80050C289B
:100010000F2080060B28FF3A841780052128A800AE
:100020000630A8190730840000308A0028080739F4
:10003000820701340234043408341034203440344C
:100040008034831303138312640008008B0183162A
:1000500007308900880187018601FF3085008312FF
:1000600006088A010120061483160610831206086A
:100070008A0104208A110A124C2064008A110A1293
:100080000C1C4A2810100C1006088A0108208A113E
:100090000A124C208A013D288E018F0183160C1014
:1000A000831290121012901510159014101408005D
:02400E00763FFB
:00000001FF
I'm struggling to see whats gone wrong...
Bookmarks