MikroBasic en interrupt

Bavelt

Golden Member

Ik kijk ergens overheen:

Ik wilde met MikroBasic onder gebruik making van interrupt een ledje laten dimmen. (dus niet de ingebouwde PWM module gebruiken omdat die maar beperkt is tot 1 of 2 poorten).

De 'duty cycle' regel ik dan zelf.

Toch gaat er iets niet goed. Het ledje knippert wel, maar de fading niet.

pic basic code:

Program KleurLed
Dim i1 As Byte
    j1 As Byte                         '
'----------------------------------------------------------------------------------------
sub procedure Interrupt() iv 0x0004 ics ICS_AUTO
'----------------------------------------------------------------------------------------
  If TMR2IF_bit Then 
  latb.4 = not latb.4
    inc(i1)
    if (i1 > 127) then i1 = 0 end if
    TMR2IF_bit = 0
  End If
end sub
  
main:

  OSCCON  = %01110000                '8Mhz internal
  ANSELB  = 0                        'Port B Digital
  TRISB   = %00000000                'PORT B as output

  T2CON      = %00100101             'Post:5 - Pre:16
  PR2        = 2                     'Timer load value
  GIE_bit    = 1                     'Enable timer2 irq
  PEIE_bit   = 1                                                    '
  TMR2IE_bit = 1

  While True
  'latb.3 = not latb.3
    for j1 = 0 to 127
    
      if i1 < j1 then
       latb.3 = 1
      else
       latb.3 = 0
      end if
    
    delay_ms(200)
    next j1
  Wend

end.
Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Type processor en klokfrequentie is altijd wel handig... ;)
Aan en uitzetten kun je niet in main doen, dat moet in de interrupt...
(als je dat in main doet, wordt 't een soort loterij...)

pic basic code:


Program KleurLed
Dim i1 As Byte
    j1 As Byte                         '
'----------------------------------------------------------------------------------------
sub procedure Interrupt() iv 0x0004 ics ICS_AUTO
'----------------------------------------------------------------------------------------
  If TMR2IF_bit Then 
  latb.4 = not latb.4
    inc(i1)
    if (i1 > 127) then i1 = 0 end if
    if i1 < j1 then latb.3 = 1 else latb.3 = 0 end if
    TMR2IF_bit = 0
  End If
end sub
  
main:

  OSCCON  = %01110000                '8Mhz internal
  ANSELB  = 0                        'Port B Digital
  TRISB   = %00000000                'PORT B as output

  T2CON      = %00100101             'Post:5 - Pre:16
  PR2        = 2                     'Timer load value
  GIE_bit    = 1                     'Enable timer2 irq
  PEIE_bit   = 1                                                    '
  TMR2IE_bit = 1

  While True
    for j1 = 0 to 127
      delay_ms(200)
    next j1
  Wend
end.
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Bavelt

Golden Member

Type processor en klokfrequentie is altijd wel handig... ;)

Is een Pic16F1847 die op 8 Mhz intern draait.

Aan en uitzetten kun je niet in main doen, dat moet in de interrupt...

Maar waarom moet het dan persé in de interrupt? Mijn redenatie was: De interrupt wordt steeds aangeroepen (freq 32 Khz) en keert dan steeds terug in de Main, waar de led wordt aan-of uitgezet.
Ik mis iets.. :?

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

De interrupt en main draaien onafhankelijk van elkaar. In main test je maar 1x in de 200mS welke waarde i1 heeft en set/reset dan het i/o bit.
Welke waarde i1 dan heeft is totaal willekeurig dus de led zal willewkeurig aan of uit gaan.

(je moet iedere keer als i1 wordt ogehoogd kijken of de led aan of uit moet zijn, dus veeeel vaker als 1x per 200mS)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Bavelt

Golden Member

Ah, Dank Arco!
Daar keek ik idd overheen. ;)

Is dit (via interrupts) trouwens de geijke manier om PWM te gebruiken?
Bij de 1847 kan ik twee ingebouwde PWM-modules gebruiken (ik dacht vier, omdat er CCP1. CCP2, CCP3 en CCP4 wordt genoemd in de datasheet. Maar ergens verderop las ik weer dat er een relatie met ECCP1 en ECCP2 zit met 'full and half bridge'.
Is mij wat ontduidelijk. Ik kan toch maar twee PWM's gebruiken van de 1847? (MikroBasic geeft ook een foutmelding op hoger dan PWM2 bij de 1847.

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Inderdaad maar 2 PWM's, andere zijn voor full/half bridge.

Is dit (via interrupts) trouwens de geijke manier om PWM te gebruiken?

De PWM modules doen niets anders...
(alleen gebeurt 't daar in hardware, dus veel minder overhead)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com