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
End

ik 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

ik wil het liever eerst op een simpele manier oplossen, maar weet alleen even niet hoe..:S

Sjors

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.

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.

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

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

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" :Plol)...

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

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