sjors007
...
Hallo mensen,
ik zit even met een probleem waar ik niet uitkom
device 16F870
CONFIG WDT_OFF, PWRTE_ON, LVP_OFF, HS_OSC
ALL_DIGITAL TRUE
declare XTAL = 4
;Logische constanten
SYMBOL Off = 0
SYMBOL AAN = 0
SYMBOL UIT = 1
SYMBOL ON = 1
;Normale constanten
SYMBOL Convert = $44 ;DS1820 commando, de DS1820 moet de temperatuur gaan meten
SYMBOL Graad = 223 ;223 is de ASCII code voor het 'graad' karakter
SYMBOL RdScratchPad = $BE ;DS1820 commando, temperatuur van de DS1820 uitlezen
SYMBOL SkipROM = $CC ;DS1820 commando, geen gebruik maken van het unieke adres
SYMBOL DS1820 = PORTA.0 ;Sluit de DS1820 temperatuur sensor aan op deze poort
dim Seconden as byte
dim Minuten as byte
dim Uren as byte
DIM Sec1 AS BYTE
DIM Sec2 AS BYTE
DIM Min1 AS BYTE
DIM Min2 AS BYTE
DIM Uur1 AS BYTE
DIM Uur2 AS BYTE
DIM BD1 AS BYTE
DIM BD2 AS BYTE
DIM BD3 AS BYTE
DIM BD4 AS BYTE
dim SecondenOud as byte
DIM DisplayOutput AS BYTE
DIM DigitTeller AS BYTE
DIM Remain AS BYTE
DIM Slope AS BYTE
DIM Cijfer[14] AS BYTE
DIM PoortC[6] AS BYTE
DIM IntTeller AS WORD
DIM Temp AS WORD ;Bevat de temperatuur Celsius
seconden = 40
minuten = 59
uren = 9
PORTc = %11111111
PORTB = %11111111
TRISc = %00000000
TRISB = %00000000
;abcdefg.
;PoortB 76543210
Cijfer[0] = %00000011 ;0
Cijfer[1] = %10011111 ;1
Cijfer[2] = %00100101 ;2
Cijfer[3] = %00001101 ;3
Cijfer[4] = %10011001 ;4
Cijfer[5] = %01001001 ;5
Cijfer[6] = %01000001 ;6
Cijfer[7] = %00011111 ;7
Cijfer[8] = %00000001 ;8
Cijfer[9] = %00001001 ;9
Cijfer[10]= %11111111 ;Display uit
Cijfer[11]= %00111001 ;Graden Teken
cijfer[12]= %01100011 ;Celsius
;poortC 76543210
PoortC[0] = %01000000 ;sec1
PoortC[1] = %00100000 ;sec2
poortC[2] = %00010000 ;min1
PoortC[3] = %00001000 ;min2
PoortC[4] = %00000010 ;uur1
PoortC[5] = %00000001 ;uur2
gosub meten
Symbol GIE = INTCON.7
Symbol PEIE = INTCON.6
Symbol TMR2IF = PIR1.1
Symbol TMR2IE = PIE1.1
Symbol TMR2ON = T2CON.2
On_Hardware_Interrupt GoTo ISR
GoTo HoofdProgramma
ISR:
TMR2IF = 0
portb = 1
portc = 0
PORTB = Cijfer[displayoutput]
PORTc = poortc[digitteller]
INC DigitTeller
inc intteller
if intteller >= 500 then
inc seconden
intteller = 0
endif
if seconden >= 60 then
inc minuten
seconden = 0
endif
Context Restore
;***********Subroutines*****************
Meten:
OWRITE DS1820, 1, [SkipROM, Convert] ;Zend 'Convert' opdracht (temperatuur meten)
OWRITE DS1820, 1, [SkipROM, RdScratchPad] ;Zend 'Read ScratchPad' opdracht
OREAD DS1820, 2, [Temp.LOWBYTE, Temp.HIGHBYTE, BD1, BD1, BD1, BD1, Remain, Slope] ',CRC]
Temp = (((Temp >> 1) * 100) - 25) + (((Slope - Remain) * 100) / Slope)
bd4 = (temp / 1000)
bd3 = ((temp // 1000) / 100)
bd2 = ((temp // 100) / 10)
return
HoofdProgramma:
T2CON = %00000111 ; Postscaler 1:10, Prescaler 1:16
PR2 = 124 ; 250 ticks geeft 40 millisec / int.
; Dus 25 interrupts per seconde
TMR2IE = 1 : PEIE = 1 : GIE = 1 ; Enable interrupts
TMR2ON = 1
Klok:
while 1 = 1
if seconden = 50 then goto temperatuur
if digitteller >= 6 then digitteller = 0
select digitteller
case 0 : displayoutput = sec1
case 1 : displayoutput = sec2
case 2 : displayoutput = min1
case 3 : displayoutput = min2
case 4 : displayoutput = uur1
case 5 : displayoutput = uur2
end select
if minuten >= 60 then
inc uren
minuten = 0
endif
if uren >= 24 then uren = 0
sec2 = (seconden / 10)
sec1 = (seconden - (sec2 * 10))
min2 = (minuten / 10)
min1 = (minuten - (min2 * 10))
uur2 = (uren / 10)
uur1 = (uren - (uur2 * 10))
wend
Temperatuur:
gosub meten
secondenoud = (seconden + 5)
while 1 = 1
if seconden = secondenoud then goto klok
if digitteller >= 6 then digitteller = 0
select digitteller
case 0 : displayoutput = 12
case 1 : displayoutput = 11
case 2 : displayoutput = 10
case 3 : displayoutput = bd2
case 4 : displayoutput = bd3
case 5 : displayoutput = bd4
end select
wend
Endik heb nu deze code, dit werkt perfect maar wanneer ik nu Hpwm of Serin er bij wil voegen knipperen me getallen. ik heb alles geprobeert maar ik krijg het niet voor elkaar.
ik heb geprobeert ze in de ISR te zetten, dit werkt ook niet. het zelfde zit ik het met probleem wanneer ik me variabele Minuten wil verhogen (dit word gedaan door portb.0) knipperen me getallen. dit heb natuurlijk te maken met displayoutput en me ISR, maar ik weet niet hoe ik dit op kan lossen.
misschien kunnen jullie een setje in de juiste richting geven.
MVG Sjors
mischien moet je voor dergelijke zaken
een display driver gebruiken, zoiets als de
max7219 dan kun je het verhaal "display"
overlaten aan drie besturings lijnen hiervoor,
en kun je de rest van de tijd spenderen aan het programma
sk
sjors007
...
Misschien helpt het om even uit te zoeken welk deel van je code nu precies problemen vertoont, en een zo kort mogelijke code met jouw probleem te posten, zodat lezers zich niet eerst door 60 regels werkende code heen hoeven te worstelen op zoek naar een probleem.
sjors007
...
Het probleem zit hem in de hele code denk ik. ik wil namelijk Serin en Hpwm toevoegen in me project maar overal waar ik ze probeer te plaatsen gaat het fout. me cijfers die op de 7 segment display komen knipperen dan. dus nu is mijn vraag aan jullie of jullie misschien een idee hebben hoe ik dat het beste kan oplossen.
loopycoaster
Mijn youtube profiel: http://www.youtube.com/user/PicBasicMaster
ik denk dat het komt omdat multiplexing altijd ´aandacht´ vraagt. maar de vraag is natuurlijk hoe HPWM en Serin die ´aandacht´ kunnen verstoren, aangezien deze instructies zelf bijna geen ´aandacht´ vragen...
sjors007
...
ik snap wat je bedoelt, maar ik weet alleen neit hoe ik dat kan oplossen.
met Hpwm of Serin word het programma even verstoord waardoor het Multiplexen even fout gaat, maar ik weet niet hoe ik het moet oplossen weet jij misschien een idee
loopycoaster
Mijn youtube profiel: http://www.youtube.com/user/PicBasicMaster
nee helaas niet. zelf ben ik overigens ook wel benieuwd naar de oplossing omdat ik er waarschijnlijk ook mee te maken ga krijgen (nu niet maar misschien later in mn "cariëre"
lol)...
sjors007
...
ik wil je graag helpen (en mezelf natuurlijk) maar er zijn niet vee mensen die me topic zien denk ik:p
maar ik wacht gewoon nog even af
sjors007
...
ik heb de volgende oplossing gevonden:D
(misschien niet de mooiste maar het werkt;))
voor degenen die ook tegen dit probleem aanlopen hier mijn code:
DEVICE 16F870
CONFIG WDT_OFF, PWRTE_ON, LVP_OFF, HS_OSC
ALL_DIGITAL TRUE
DECLARE XTAL = 4
DECLARE SCL_PIN = PORTA.3 ;Serial Clock pin met PORTA.3 verbinden
DECLARE SDA_PIN = PORTA.4 ;Serial Data pin met PORTA.4 verbinden
hpwm 1, 250, 2000
;Logische constanten
SYMBOL Off = 0
SYMBOL AAN = 0
SYMBOL UIT = 1
SYMBOL ON = 1
;Normale constanten
SYMBOL Convert = $44 ;DS1820 commando, de DS1820 moet de temperatuur gaan meten
SYMBOL Graad = 223 ;223 is de ASCII code voor het 'graad' karakter
SYMBOL RdScratchPad = $BE ;DS1820 commando, temperatuur van de DS1820 uitlezen
SYMBOL SkipROM = $CC ;DS1820 commando, geen gebruik maken van het unieke adres
SYMBOL DS1820 = PORTc.7 ;Sluit de DS1820 temperatuur sensor aan op deze poort
Symbol SHpwm = porta.0
SYMBOL Suur = PORTA.1
symbol Smin = porta.2
symbol LDR = porta.5
symbol GradenPunt = portb.0
symbol ContactDender= 25
symbol MinWaarde = 50
symbol MaxWaarde = 250
symbol Schaal = 148
symbol Bovengrens = 200
symbol Ondergrens = 150
;Bit
DIM SchakStand AS bit
;Byte
dim Weerstand as byte
DIM Seconden AS BYTE
DIM Minuten AS BYTE
DIM Uren AS BYTE
DIM Sec1 AS BYTE
DIM Sec2 AS BYTE
DIM Min1 AS BYTE
DIM Min2 AS BYTE
DIM Uur1 AS BYTE
DIM Uur2 AS BYTE
DIM BD1 AS BYTE
DIM BD2 AS BYTE
dim BD3 as byte
dim BD4 as byte
DIM Menu AS BYTE
DIM DutyOud AS BYTE
DIM Duty AS BYTE
DIM SecondenOud AS word
DIM SlaapOvergang AS BYTE
DIM DisplayOutput AS BYTE
DIM DigitTeller AS BYTE
DIM Waarde AS BYTE
DIM Remain AS BYTE
DIM Slope AS BYTE
DIM Cijfer[14] AS BYTE
DIM PoortC[6] AS BYTE
;Word
DIM KlokTeller AS WORD
DIM IntTeller AS WORD
DIM Temp AS WORD
schakstand = 0
BUSOUT %10100010, $00, [$00, $00, $00, $00, $00]
PORTC = %11111111
PORTB = %11111111
TRISC = %00000000
TRISB = %00000000
;abcdefg.
;PoortB 76543210
Cijfer[0] = %00000011 ;0
Cijfer[1] = %10011111 ;1
Cijfer[2] = %00100101 ;2
Cijfer[3] = %00001101 ;3
Cijfer[4] = %10011001 ;4
Cijfer[5] = %01001001 ;5
Cijfer[6] = %01000001 ;6
Cijfer[7] = %00011111 ;7
Cijfer[8] = %00000001 ;8
Cijfer[9] = %00001001 ;9
Cijfer[10]= %11111111 ;Display uit
Cijfer[11]= %00111001 ;Graden Teken
Cijfer[12]= %01100011 ;Celsius
;poortC 76543210
PoortC[0] = %01000000 ;sec1
PoortC[1] = %00100000 ;sec2
PoortC[2] = %00010000 ;min1
PoortC[3] = %00001000 ;min2
PoortC[4] = %00000010 ;uur1
PoortC[5] = %00000001 ;uur2
Symbol GIE = INTCON.7
Symbol PEIE = INTCON.6
Symbol TMR2IF = PIR1.1
Symbol TMR2IE = PIE1.1
Symbol TMR2ON = T2CON.2
On_Hardware_Interrupt GoTo ISR
GoTo HoofdProgramma
ISR:
TMR2IF = 0
portb = 1
portc = 0
PORTB = Cijfer[displayoutput]
PORTc = poortc[digitteller]
INC DigitTeller
if menu = 1 then
gradenpunt = uit
if digitteller >= 6 then digitteller = 0
select digitteller
case 0 : displayoutput = sec1
case 1 : displayoutput = sec2
case 2 : displayoutput = min1
case 3 : displayoutput = min2
case 4 : displayoutput = uur1
case 5 : displayoutput = uur2
end select
endif
if menu = 2 then
gradenpunt = aan
if digitteller >= 6 then digitteller = 0
select digitteller
case 0 : displayoutput = 12
case 1 : displayoutput = 11
case 2 : displayoutput = 10
case 3 : displayoutput = bd2
case 4 : displayoutput = bd3
case 5 : displayoutput = bd4
end select
endif
Context Restore
;***********Subroutines*****************
Meten:
OWRITE DS1820, 1, [SkipROM, Convert] ;Zend 'Convert' opdracht (temperatuur meten)
OWRITE DS1820, 1, [SkipROM, RdScratchPad] ;Zend 'Read ScratchPad' opdracht
OREAD DS1820, 2, [Temp.LOWBYTE, Temp.HIGHBYTE, BD1, BD1, BD1, BD1, Remain, Slope] ',CRC]
Temp = (((Temp >> 1) * 100) - 25) + (((Slope - Remain) * 100) / Slope)
bd4 = (temp / 1000)
bd3 = ((temp // 1000) / 100)
bd2 = ((temp // 100) / 10)
return
UpdateHPWM1:
for duty = minWaarde to maxWaarde
hpwm 1, duty, 2000
delayms 2
next
return
UpdateHPWM2:
for duty = MaxWaarde to MinWaarde step -1
hpwm 1, duty, 2000
delayms 2
next
return
;**********Hoofdprogramma***************
HoofdProgramma:
T2CON = %00000111 ; Postscaler 1:10, Prescaler 1:16
PR2 = 124 ; 250 ticks geeft 40 millisec / int.
; Dus 25 interrupts per seconde
TMR2IE = 1 : PEIE = 1 : GIE = 1 ; Enable interrupts
TMR2ON = 1
;***************Tijd********************
Klok:
menu = 1
while 1 = 1
select seconden
case 10, 20, 30, 45 : gosub meten
case 50 : goto temperatuur
end select
BUSIN %10100011, $02, [Seconden, Minuten, Uren]
Seconden = ((Seconden >> 4) * 10) + (Seconden & 15)
Minuten = ((Minuten >> 4) * 10) + (Minuten & 15)
Uren = ((Uren >> 4) * 10) + (Uren & 15)
sec2 = (seconden / 10)
sec1 = (seconden - (sec2 * 10))
min2 = (minuten / 10)
min1 = (minuten - (min2 * 10))
uur2 = (uren / 10)
uur1 = (uren - (uur2 * 10))
if smin = aan then
inc minuten
delayms contactdender
if minuten = 60 then minuten = 0
while smin = aan : wend
minuten = ((minuten / 10 ) << 4 ) + (minuten // 10 )
BUSOUT %10100010,3, [minuten]
endif
if suur = aan then
inc uren
delayms contactdender
if uren = 24 then uren = 0
while suur = aan : wend
uren = ((uren / 10 ) << 4 ) + (uren // 10 )
BUSOUT %10100010,4, [uren]
endif
if shpwm = aan then
inc schakstand
delayms contactdender
while shpwm = aan : wend
select SchakStand
case 0 : gosub updatehpwm1
case 1 : gosub updatehpwm2
end select
endif
wend
;*************Temperatuur***************
Temperatuur:
menu = 2
secondenoud = (seconden + 5)
while 1 = 1
BUSIN %10100011,2, [Seconden]
Seconden = ((Seconden >> 4) * 10) + (Seconden & 15)
if seconden = secondenoud then goto klok
wend
End

