Interrupt-problem (PIC18LF2320) *Löst* *Fungerar*

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
JimmyAndersson
Inlägg: 26578
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

Tack för att du fyllde i min kunskapslucka! Jag har mest erfarenhet av analoga mätinstrument.
Då ska jag inte skylla alldeles för mycket på mitt mätinstrument alltså. :)

edit: *Framgång*
Jag har lyckats trigga knapparna! Justerade ADCON2 och nu fungerar den biten.

Kod: Markera allt

sub procedure interrupt

  if TestBit(PIR1, ADIF) = 1 then
     knapp_nr_lo = ADRESL ' Läser av ADC's låga byte
     knapp_nr_hi = ADRESH ' Läser av ADC's höga byte
     knapp_nr = (word(knapp_nr_hi << 8)) OR knapp_nr_lo ' Slår ihop.

    PORTA.2 = 1 ' *STATUS-LED 2*   <---- TÄNDS

  end if

    ' Skickar till USART
    TXREG = 123
    while TestBit(PIR1, TXIF) = 0
    wend
    TXREG = knapp_nr_hi
    while TestBit(PIR1, TXIF) = 0
    wend
    TXREG = 123
    while TestBit(PIR1, TXIF) = 0
    wend
    TXREG = knapp_nr_lo
    while TestBit(PIR1, TXIF) = 0
    wend
    TXREG = 123
    while TestBit(PIR1, TXIF) = 0
    wend

     'RUN
      if (knapp_nr >= 500) and (knapp_nr <= 520) then ' 512
                       run = 1
                       PORTA.3 = 1 ' *STATUS-LED 3*  <--KAN TÄNDA MED RUN-knappen.
      end if

      'STOP
      if (knapp_nr >= 460) and (knapp_nr <= 480) then  ' 470
                       run = 0
                       PORTA.3 = 0 ' *STATUS-LED 3* <---SLÄCKS MED STOP-KNAPPEN.
      end if

     ClearBit(PIR1, ADIF)
     SetBit(ADCON0, ADON) ' A/D-omvandlare enable (On)
     SetBit(ADCON0, GO/DONE) ' A/D-omvandling
end sub

Än så länge reagerar inte DAC'en. Ska jobba vidare på det. Ville bara berätta att ADC-delen fungerar. :)
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> 9.29 - 9.30v, 5.15 - 5.16v

Fullständigt normalt att det växlar i sista siffran !
Brus, brum och slumpen ligger bakom.
Hade du haft ett bättre instrument kanske det hade växlat mellan
9.295 - 9.296 istället, vilket precis lika "normalt".

> Tangentbordslösningen är bra lödd, har fräscha knappar och nya sladdar.

Det var inte så jag menade. :-)
Jag menade hela ideen med knappar, motstånd och ADC...

> if (knapp_nr >= 511) and (knapp_nr <= 513)

Jag tror detta är ett alldeles för "snävt" intervall, oberoende om
det även finns andra problem. Det behövs bara att rums-tempen
ändras med ett par grader, så har värdet åkt iväg på grund av
temp koefficienter i de olika komponenterna (främst motstånden).
Du kan ju prova själv att värma motstånden med
fingrarna (eller lödkolven i närheten) så får du se.

Annars är det bara helt vanlig debuggning... :-)

Vilket värde har "knapp_nr" före din test ?
Kan du göra något annat direkt i ISRen som tända en LED ?

EDIT : OK, du han före... Vad ändrade du i ADCON2 ?

EDIT_2 : Du bör flytta "ClearBit(PIR1, ADIF)" så att det ligger innanför
"if TestBit(PIR1, ADIF) = 1 then ..... end if ". Varför får du fundera på själv... :-)
Användarvisningsbild
Icecap
Inlägg: 26647
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Den bör faktisk ligga såhär:

Kod: Markera allt

sub procedure interrupt

  if TestBit(PIR1, ADIF) = 1 then
     ClearBit(PIR1, ADIF) ' OK, jag har den...
     knapp_nr_lo = ADRESL ' Läser av ADC's låga byte
     knapp_nr_hi = ADRESH ' Läser av ADC's höga byte
     knapp_nr = (word(knapp_nr_hi << 8)) OR knapp_nr_lo ' Slår ihop.
     PORTA.2 = 1 ' *STATUS-LED 2*   <---- TÄNDS
  end if
  ...... ' Resten av grejset (som i övrigt är för mycket, man väntar inte i en ISR!)
end sub
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Alltså mellan "if" och "end if", som jag skrev. Eller var det något
speciellt med just den rad du la det på ?

Återstår för Jimmy att fundera på varför... :-)

Du har i princip rätt när det gäller resten av ISR'en, men
nu var det ju tillagt för debugging, och så fungerar det helt OK...
Användarvisningsbild
JimmyAndersson
Inlägg: 26578
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

Måste bara säga att jag verkligen gillar era tips Icecap och Sodjan!
Mycket värdefullt! 8)


Icecap:
Jo, det är för mycket kod där just nu. USART-delen och "StatusLED" använde jag bara att se så ADC-delen fungerade.


sodjan:
>Jag menade hela ideen med knappar, motstånd och ADC...

Aha! Jo, det håller jag med om. Egentligen lite "skumt" att använda ADC'n för knappar...

>Du bör flytta "ClearBit(PIR1, ADIF)" så att det ligger innanför
>"if TestBit(PIR1, ADIF) = 1 then ..... end if ".
>Varför får du fundera på själv...

Det var därför den inte gick vidare! Nu fungerar det! Alltihop tillochmed! 8)

Mycket smidigt att använda interrupt! Det känns nästan lite som multitasking om man jämför... :D

Nu har jag fått grepp om hur jag använder interrupt (iallafall grunderna). Ska putsa vidare på koden nu.


Tack för hjälpen!
Skriv svar