Ik heb een probleempje. Ik heb een programmaatje geschreven in JAL. Het is een timer die aftelt en bij 00:00 moet stoppen. In principe doet het dat ook als ik handmatig pulsjes aan de ingangen van de pic voor up en down geef. Als ik nu de rotary encoder via een D-flipflop aansluit om deze taak van up of down pulsjes over te nemen gaat het mis, het programma stopt soms netjes bij 00:00 en soms (meestal) wordt doorgeteld 99:59 etc....

Nu worden de poorten A1 en A2 die ik gebruik voor het instellen van de tijd (up/down) tijdens de aftel routine niet gebruikt en ik heb zelfs al geprobeerd om ze in deze routine uit te schakelen.(dus output maken) maar het wil niet baten. Kan het zijn dat de D-Flipflop (SN74LS74) die ik gebruik dusdanig op de PIC stoort dat deze rare sprongen gaat maken ?? Hoe kan ik het beste de verbindingen tussen de PIC en de D-Flipflop ontstoren om te proberen of het hier aan ligt ??

Lijkt me sterk dat het door de flipflop komt.
Heeft de flipflop geen last van de contact dender van de rotary encoder?

Heb je misschien een schema en (een gedeelte van ) de code?

Ik de code nu niet bij de hand, zal deze morgen even posten. Maar ik vindt het vreemd dat het probleem zich alleen voordoet als ik de flipflop aansluit.

ok, hier en stukje van de code


-- main

initialiseren
hd44780_clear
intflagT0 = false
tick = 16
port_a = all_input
initmr0
forever loop
pin_a1_direction = output
pin_a2_direction = output 
if pin_a3 == true then
   hd44780_clear
   klep_open
 end if

  hd44780_position2 (6)
  uvaan
  tijd_op_display
   while intflagT0 == false loop  -- wait to TMR0 Int
    if pin_a0 == true then -- scan set button
      delay_50ms  -- antidender routine
      if pin_a0 == true then
        mode_set -- goes to set mode
      end if
    end if
  end loop
  if binseconden == 00 then
     binseconden = 100
     if binminuten == 00 then
     uit
    end if
  end if
  binseconden = binseconden - 1
  if binseconden == 99 then
     binseconden = 59
     binminuten = binminuten - 1
  end if
  intflagT0 = false
end loop

procedure uit is
  hd44780_line2
     hd44780 = "o"
     hd44780 = "k"
forever loop
end loop
end procedure

Misschien dat dit er ook iets mee te maken heeft:


procedure initmr0 is
  status_rp0 = true
  status_rp1 = false
  intcon = 0b_1010_0000
  tmr0 = 0b_1000_0111 -- option_reg
  status_rp0 = false
  -- aprox. values
  tmr0 = 12 -- 4Mhz ... 4 x 250ns x (256-12) x 256 .... x 16
  delay_1us(12)
  -- ******************
end procedure

procedure interrupt_handler is pragma interrupt
  if tick == 0 then
    intflagT0 = true
    tick = 16
  end if
  tick = tick - 1
  initmr0
end procedure

Ik hoop dat het in de code zit, is het tenminste "makkelijk" op te lossen. Wie helpt ??

De code ziet er wel ok uit.
Misschien dat er nog iets raars staat in de procedure mode_set?

Wat gebeurt er als je de rotary encoder loskoppelt van de flipflop?

Op 6 juni 2003 11:24:17 schreef Confusion:
De code ziet er wel ok uit.
Misschien dat er nog iets raars staat in de procedure mode_set?

Wat gebeurt er als je de rotary encoder loskoppelt van de flipflop?

Het loskoppelen van de rotary encoder zal ik dit weekend eens proberen.

de procedure mode_set:


procedure mode_set is
    pin_a1_direction = input
    pin_a2_direction = input
  intcon_gie = false -- deactivate interrupts
  positie = false
setmin
hd44780_position2 (5)
  tijd_op_display
  hd44780_instruction( 0b_0000_1111 ) -- display on, cursor on, blink on
hd44780_position2 (6)
  while pin_a0 == true loop -- wait while button is pushed
  end loop
  espera = true
  while espera == true loop -- button scan
    if pin_a1 == true then
      delay_1ms  -- antidender routine
      if pin_a1 == true then
        set_hm
      end if
      while pin_a1 == true loop  -- wait while button is pushed
      checkokknop
      end loop
    end if
    if pin_a2 == true then
      delay_1ms  -- antidender routine
      if pin_a2 == true then
        set_hmaf
      end if
      while pin_a2 == true loop  -- wait while button is pushed
      checkokknop
      end loop
    end if
checkokknop
end loop
  hd44780_clear
delay_10ms
  initmr0
  intcon_gie = true -- activate interrupts
end procedure