Här är en kod som jag skrivit som gör det du vill.
Jag vill UNDERSTRYKA att jag gjort detta för min egen skull. Jag tycker att det är kul att testa nya saker. Jag hade tex aldrig räknat på så höga tal (8timmar) och jag hade aldrig använt TMR1.
Som jag har räknat funkar detta och precisionen (den teoretiska, i simulatorn) borde var under en sekund fel.
MEN jag använder dock den interna klockan på 4MHz så den faktiska precisionen är inte lika hög.
PICen är en 16f690 (för att jag hade en egen "grundkod" till den)
Som koden är skriven här ligger reläet på PORTA bit O. (PORTA,0)
Det är juh dock skrivet i Assembler.
Relääet växlar var 8e timma.
Som sagt detta är inte tänkt som "här har du den perfekta lösningen". Det är säkert långt ifrån. Men jag tyckte att det var kul att testa.
MVH Peter F
Kod: Markera allt
;**********************************************************************
; This file is a basic code template for object module code *
; generation on the PIC16F690. This file contains the *
; basic code building blocks to build upon. *
; *
; Refer to the MPASM User's Guide for additional information on *
; features of the assembler and linker (Document DS33014). *
; *
; Refer to the respective PIC data sheet for additional *
; information on the instruction set. *
; *
;**********************************************************************
; *
; Filename: xxx.asm *
; Date: *
; File Version: *
; *
; Author: *
; Company: *
; *
; *
;**********************************************************************
; *
; Files required: P16F690.INC *
; *
; *
; *
;**********************************************************************
; *
; Notes: *
; *
; *
; *
; *
;**********************************************************************
list p=16F690 ; list directive to define processor
#include <p16F690.inc> ; processor specific variable definitions
errorlevel -302 ; suppress message 302 from list file
__CONFIG _CP_OFF & _CPD_OFF & _BOR_OFF & _MCLRE_ON & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT & _FCMEN_OFF & _IESO_OFF
; '__CONFIG' directive is used to embed configuration word within .asm file.
; The lables following the directive are located in the respective .inc file.
; See data sheet for additional information on configuration word settings.
#define relayPort PORTA
#define relayBit 0
;***** VARIABLE DEFINITIONS (examples)
d1_value EQU .219 ;
d2_value EQU .250 ;
d3_value EQU .181 ;
; example of using Shared Uninitialized Data Section
INT_VAR UDATA_SHR
w_temp RES 1 ; variable used for context saving
status_temp RES 1 ; variable used for context saving
pclath_temp RES 1 ; variable used for context saving
udata 0x20 ;Minnesbanker som används i koden
d1 res 1 ;Tilläggs räknare till TMR0 för att öka tiden
d2 res 1 ;Råvärdet för sec, min hour dagar, 2 siffror
d3 res 1
setting res 1 ;För att ställa in vilket läge counten är min,hour eller dagar.
shadow res 1
t1 res 1
w2 res 1
debug res 1
;**********************************************************************
RESET_VECTOR CODE 0x0000 ; processor reset vector
goto start ; go to beginning of program
INT_VECTOR CODE 0x0004 ; interrupt vector location
INTERRUPT
movwf w_temp ; save off current W register contents
movf STATUS,w ; move status register into W register
movwf status_temp ; save off contents of STATUS register
movf PCLATH,w ; move pclath register into W register
movwf pclath_temp ; save off contents of PCLATH register
; isr code can go here or be located as a call subroutine elsewhere
BCF PIR1, TMR1IF ;Nolla TMR1s interrupt flagga
BTFSC setting,0 ;Kolla om vi ska gå till sista räknaren
goto slutraknare
DECFSZ d1 ;Räkna ner TMR1 tillägsräknare, kolla om den är noll
GOTO endIsr ;NEJ, fortsätt räkna
movlw d1_value ;JA, Återställ d1 Tillägsräknare
movwf d1
DECFSZ d2 ;Räkna ner TMR1 tillägsräknare, kolla om den är noll
GOTO endIsr ;NEJ, fortsätt räkna
movlw d2_value ;JA, Återställ d2 Tillägsräknare
movwf d2
BSF setting,0
slutraknare
DECFSZ d3
goto endIsr
movlw d3_value ;JA, Återställ d1 Tillägsräknare
movwf d3
CLRF setting
CLRF shadow
BSF shadow,relayBit
MOVFW shadow
XORWF relayPort, f
endIsr
movf pclath_temp,w ; retrieve copy of PCLATH register
movwf PCLATH ; restore pre-isr PCLATH register contents
movf status_temp,w ; retrieve copy of STATUS register
movwf STATUS ; restore pre-isr STATUS register contents
swapf w_temp,f
swapf w_temp,w ; restore pre-isr W register contents
retfie ; return from interrupt
MAIN_PROG CODE
start
; remaining code goes here
BANKSEL PORTA ;Init Port A & B & C
CLRF PORTA
BANKSEL PORTB
CLRF PORTB
BANKSEL PORTC
CLRF PORTC
BANKSEL ANSEL
CLRF ANSEL ;digital I/O
BANKSEL ANSELH
CLRF ANSELH ;digital I/O
BANKSEL TRISA
MOVLW b'00000000' ;Set RA<0-7> as Outputs
MOVWF TRISA
BANKSEL TRISB
MOVLW b'00000000' ;Set RB<0-7> as Outputs
MOVWF TRISB
BANKSEL TRISC
MOVLW b'00000000' ;Set RC Outputs and Inputs
MOVWF TRISC
BCF STATUS,RP0 ;Bank 0
CLRWDT ;Clear WDT and prescaler
MOVLW b'00110001' ;TMR1 on prescaler settings
MOVWF T1CON
BANKSEL PIE1
BSF PIE1,0 ;TMR1 interrupt enabled
BANKSEL INTCON
MOVLW b'11000000' ;Global interrupt and TMR0 interrupt enabled
MOVWF INTCON
movlw d1_value ;Ladda TMR0s extraräknare med förbestämt värde,
movwf d1 ;definieras i början av koden.
movlw d2_value ;Ladda TMR0s extraräknare med förbestämt värde,
movwf d2 ;definieras i början av koden.
movlw d3_value ;Ladda TMR0s extraräknare med förbestämt värde,
movwf d3 ;definieras i början av koden.
movlw .1
movwf debug
CLRF setting
BSF relayPort, relayBit
MainLoop
goto MainLoop ; loop forever
; initialize eeprom locations
EE CODE 0x2100
DE 0x00, 0x01, 0x02, 0x03
END ; directive 'end of program'
EDIT: Så här är allt uträknat.
Interrupt sker var 524.288MilliSec.
Jag har en Register som räknar från 219 ner till noll, ett steg varje interruppt. En sån här nedräkning tar alltså ca 114.82 sekunder.
Sedan har jag ett register som räknar ner från 250 till noll. Ett steg för varje 114.82sec
Detta innebär att när detta register är på noll har gått har det gått 28705sekunder (ca 7.973timmar).
För de resterande 95sekunderna har jag då en räknare som räknar ner 181 interrupt. Alltså ca 94,89sekunder.
Efter detta (8timmar) Växlas utgången på PORTA,0 från hög till låg eller vice versa.
Allt nollställs och börjar om från början.
Så, nu ska jag sluta spamma med mina egna övningar.
MVH Peter