Buggfix Plus
Aktuellt datum och tid: 17.13 2019-03-18

Alla tidsangivelser är UTC + 1 timme




Svara på tråd  [ 20 inlägg ]  Gå till sida 1, 2  Nästa
Författare Meddelande
InläggPostat: 10.56 2018-12-07 
Tidigare Marta
Användarvisningsbild

Blev medlem: 00.19 2005-03-30
Inlägg: 4334
Ort: Sjukbädd i Helvetet
Skall använda Timer2 i en 18F56K42 till att ge interrupts för att scanna en display. Dessa nya PIC har fått femtioelva nya finesser med resultat att det blir inga interrupts från timern...

Har testat med Timer1, som är mindre lämplig till detta, och då fungerar det, så hanteringen av det nya interruptsystemet med vektortabell är i ordning. Givetvis använder jag rätt position i IVT, kollat femtioelva gånger. Samma sak med PIR/PIE.

Någon som har fungerande kod som initierar en av dessa timers i någon *K42 till att ge interrupts? Måste vara för *K42 eller ev, ännu nyare som har hela registerhärket. Annars ar det en bagatell att göra.

Här är testcoden jag använt i en 46K42 på labplatta med samma resultat. TMR1 funkar perfekt, TMR2 är tvärdöd. Samma med TMR4. Nog bara en bit i något obskyrt register som saknas, men har tappat skärpan och ser inte var.

Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)

        *                       START TMR 2, ALL REGS IN ABANK
        LOD A,#%_0000_0001      USE FOSC/4
        LOD T2CLK,A
        STZ T2RST               A KNOWN STATE TO THIS
        STZ T2TMR               CLEAR COUNTER
        LOD A,#128              TIMER PERIOD
        LOD T2PR,A
        LOD A,#%_0_011_0000     /8 PRESCALER, /1 POSTSCALER
        LOD T2CON,A
        LOD A,#%_101_0000
        LOD T2HLT,A
        SMB T2CON,7             START TIMER


        *                       START TMR 1, ALL REGS IN ABANK
        LOD A,#%_000_00001      USE FOSC/4
        LOD T1CLK,A
        LOD A,#%_0011_0010      /8 PRESCALER
        LOD T1CON,A
        STZ T1GCON              A KNOWN STATE TO THESE
        STZ T1GATE
        SMB T1CON,0             START TIMER

        .BC
        LOD BS,#63
        *                       START TMR 4, ALL REGS IN ABANK
        LOD A,#%_0000_0001      USE FOSC/4
        LOD T4CLK,A
        STZ T4RST               A KNOWN STATE TO THIS
        STZ T4TMR               CLEAR COUNTER
        LOD A,#128              TIMER PERIOD
        LOD T4PR,A
        LOD A,#%_0_011_0000     /8 PRESCALER, /1 POSTSCALER
        LOD T4CON,A
        LOD A,#%_101_0000
        LOD T4HLT,A
        *SMB T2CON,7             START TIMER
        LOD A,#%_1_011_0000     /8 PRESCALER, /1 POSTSCALER
        LOD T4CON,A
        .EC





        *                       START INTERRUPTS
        LOD BS,#PIR4/256
        CLF T2IF
        CLF T1IF
        CLF T4IF
        STZ PIR4
        STZ PIR7
        *SEF T2IE
        *SEF T1IE
        SEF T4IE

        SEF GIEL
        SEF GIE

        JMP @



        .BS 4-(@\4)\4           EVEN FOUR
******  TMR2 IRQ ROUTINE
*
TMR1IRQ
TMR2IRQ
TMR4IRQ

        LOD A,#$FF              DO SOMETHING VISIBLE
        EOR LATD,A

        LOD BS,#PIR4/256
        CLF T2IF                CLEAR INTFLAG
        STZ PIR4
        STZ PIR7
        RIQ                     DONE



Upp
 Profil  
 
InläggPostat: 11.43 2018-12-07 
Användarvisningsbild

Blev medlem: 14.52 2005-01-10
Inlägg: 23645
Ort: Kristinehamn
Saxat ur ett projekt, det fattas lite hårdvaradefinitioner men det fungerar för resten.
För PIC18F25K22.

Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
void interrupt high_priority HIGH_ISR(void)
  {
  static WORD Counter;
  if(TMR2IF) // Is it Timer2 interrupt?
    {
    TMR2IF = false; // Clear flag as it's being done now
    Counter++;      // Count up Counter by one
    if(Counter >= 125) // Every 250/125 second (0,5 sec)
      {
      Counter = 0; // Clear Counter
      if(LED_Green) LED_Green = false; // If it's on, turn it off
      else          LED_Green = true;  // else turn it on
      }
    }
  }


void interrupt low_priority ISR(void)
  {
  }


void main(void)
  {
  // First initiate ports and functions
  ANSELA  = 0x00;  // No analog function on pins
  ANSELB  = 0x00;  // No analog function on pins
  ANSELC  = 0x00;  // No analog function on pins
  PORTA   = 0x00;  // All low
  PORTB   = 0x00;  // All low
  PORTC   = 0x00;  // All low
  TRISA   = TRISA_DEFAULT; // Set to all out but RA0
  TRISB   = TRISB_DEFAULT; // All out
  TRISC   = TRISC_DEFAULT;
  OSCCON  = 0x70;  // Select Primary clock, 16MHz INTOSC
  OSCCON2 = 0x00;  // Nothing here
  PLLEN   = true;  // Turn on PLL
  IPEN    = true;  // Allow for interrupt priority
  PIE1    = 0x00;  // None of these interrupt enabled
  PIE2    = 0x00;  // None of these interrupt enabled
  // Start a Timer2 interrupt
  TMR2IP  = true;  // Set Timer2 interrupt to high priority
  TMR2IF  = false; // Clear any pending interrupt
  TMR2IE  = true;  // Allow for interrupts to come
  PR2     = 250;   // Set periode = SYSCLK / 16 / 16 / 250 = 250Hz
  T2CON   = 0x7E;  // 0111 1110, 1:16 prescaler, 1:16 postscaler, Timer2 on
  GIEH    = true;  // Allow high priority interrupt to be executed
  GIEL    = false; // Stop any low priority interrupts
  while(true)
    {
    }
  }


Upp
 Profil  
 
InläggPostat: 13.45 2018-12-07 
Tidigare Marta
Användarvisningsbild

Blev medlem: 00.19 2005-03-30
Inlägg: 4334
Ort: Sjukbädd i Helvetet
Tack för svar.

Är det verkligen för en *K42? Du har det gamla namnet PR2 för T2PR och sätter varken T2RST eller T2HLT. Din ISR ser inte hellre ut att vara för vektoriserad interrupt, men det senare är ju valfritt att använda. Det gäller tyvärr inte T2RST och T2HLT.

Enligt databladet finns det T2PR, T2TMR, T2CON, T2CLK, T2RST och T2HLT som rör Timer2. Hade behövt ett fungerande exempel att utgå ifrån där timern ger en stadig ström av interrupts.

Även om mer behöver göras i ISR än nolla T2IF (bit2 i PIR4) och om det finns någon mer magisk bit än T2IE (bit 2 i PIE4) som skall sättas för att få igång dess interrupts.


Senast redigerad av Invaliden 13.55 2018-12-07, redigerad totalt 1 gång.

Upp
 Profil  
 
InläggPostat: 13.54 2018-12-07 
Användarvisningsbild

Blev medlem: 14.52 2005-01-10
Inlägg: 23645
Ort: Kristinehamn
Inte en K42. Det står att det är en PIC18F25K22, antog att de hade gemensamma punkter.


Upp
 Profil  
 
InläggPostat: 13.58 2018-12-07 
Tidigare Marta
Användarvisningsbild

Blev medlem: 00.19 2005-03-30
Inlägg: 4334
Ort: Sjukbädd i Helvetet
Visst har de gemensamma punkter, men de har också stora olikheter. K22 har vad jag minns inte vektoriserad interrupt och inte hellre det nya registerhärket för timers.


Upp
 Profil  
 
InläggPostat: 14.10 2018-12-07 
Användarvisningsbild

Blev medlem: 14.52 2005-01-10
Inlägg: 23645
Ort: Kristinehamn
OK, my bad.


Upp
 Profil  
 
InläggPostat: 14.39 2018-12-07 
Tidigare Marta
Användarvisningsbild

Blev medlem: 00.19 2005-03-30
Inlägg: 4334
Ort: Sjukbädd i Helvetet
Inget fel i det. Kunde mycket väl ha gett svaret ändå eller på något sätt pekat vidare på något förbisett. Är motigt att fastna på en förmodat enkel detalj utan att se var det går att komma vidare.

Nåväl, nästa steg är att testa om timern räknar, eller det är interruptrelaterat. Bra med chipet på labplattan så den pålödda som skall användas skonas från allaf flashar för att ta sig förbi sådana här tvärstopp.


Upp
 Profil  
 
InläggPostat: 14.55 2018-12-07 
Användarvisningsbild

Blev medlem: 14.52 2005-01-10
Inlägg: 23645
Ort: Kristinehamn
Kollar i databladet för PIC18FxxK42 och det verkar inte vara helt enkelt.

Jag kanske har översett det men har du ställd IVT-register rätt? Om jag inte har fatta helt fel ska man bygga Interrupt Vector Tabellen själv och den MÅSTE starta på jämn adress.


Upp
 Profil  
 
InläggPostat: 14.57 2018-12-07 
Tidigare Marta
Användarvisningsbild

Blev medlem: 00.19 2005-03-30
Inlägg: 4334
Ort: Sjukbädd i Helvetet
Nu vet jag i varje fall att timern inte räknar, så det har inte med interrupt att göra.

Då återstår "bara" varför? Här är det tvärnit nu. Hur f*n skall den confas med de nya registren? Någon mer måste bara ha stött på samma problem.

Google ger ingenting. De som brukar fastna i skitproblem väljer knappast denna krets och de som fastnat och löst det skäms nog för mycket...


Angående IVT måste ISR ligga på jämnt fyrtal och det är byteaddress / 4 som skall in. Detta för att klara 47/57 versionerna med 64Kword. Den biten är rätt, om inte tryckfelsnisse har gett TMR2 fel position. TMR1 två positioner upp funkade perfekt.


Upp
 Profil  
 
InläggPostat: 15.15 2018-12-07 
Användarvisningsbild

Blev medlem: 14.52 2005-01-10
Inlägg: 23645
Ort: Kristinehamn
Som jag läser det ur databladet:
T2ON = start/stopp. Same as always.
T2MODE xxxx x000 = Software Gate. I ett exempel anger de MODE = 0b00000.
T2CLK ska såklart väljas rätt - men inte 0b0000. 0b0001 = Fosc/4


Upp
 Profil  
 
InläggPostat: 15.29 2018-12-07 
Användarvisningsbild

Blev medlem: 18.06 2010-05-17
Inlägg: 8794
Ort: Växjö/Alvesta
Såg att det finns en config-bit för att sätta interrupthanteringen i "legacy mode", det kanske vore en tråkig men fungerande lösning om du inte behöver de avancerade vektoriserade interrupten? :)

Kunde kanske vara intressant att testa för att se om det fungerar om inte annat.


Upp
 Profil  
 
InläggPostat: 15.42 2018-12-07 
Tidigare Marta
Användarvisningsbild

Blev medlem: 00.19 2005-03-30
Inlägg: 4334
Ort: Sjukbädd i Helvetet
Timern räknar inte det är konstaterat.

Felet är också hittat och interrupt funkar perfekt

Med denna tvärlåser timern, precis som den skall under aktuella förhållanden.
LOD A,#%_101_0000
LOD T2HLT,A

Med denna fungerar det perfekt.
LOD A,#%_101_00000
LOD T2HLT,A

Nu är det uppenbart som om det satt en 10mm LED och lyste intill, men det tog hela kvällen igår och halvadagen idag att hitta. Har verkligen tappat stinget. Skamvrån nästa. :evil: :oops: :oops: :oops: :oops: :oops: :oops: :oops: :oops: :oops: :oops: :oops:

Tack för Ert engagemang. Skäms verkligen.


Senast redigerad av Invaliden 15.45 2018-12-07, redigerad totalt 1 gång.

Upp
 Profil  
 
InläggPostat: 15.44 2018-12-07 

Blev medlem: 01.01 2006-03-02
Inlägg: 7334
Ort: Vänersborg
Jag hittade missen:
LOD A,#%_101_0000
Det ska nog bara vara en nolla till på slutet, så att mode blir 00000, nu är mode 10000 "Monostable"

EDIT: du hade visst hittat den själv också.


Senast redigerad av bearing 15.46 2018-12-07, redigerad totalt 1 gång.

Upp
 Profil  
 
InläggPostat: 15.45 2018-12-07 
Användarvisningsbild

Blev medlem: 18.06 2010-05-17
Inlägg: 8794
Ort: Växjö/Alvesta
Hoppla, jag läste att det var konstaterat att timern går. :roll:

Skönt att det löste sig i alla fall!

För övrigt, kanske vore bra att skaffa sig en debugger? Då är det väldigt enkelt att konstatera om en timer snurrar eller ej.
Så slipper man lägga dagar på såna skitfel.


Upp
 Profil  
 
InläggPostat: 19.42 2018-12-12 
Tidigare Marta
Användarvisningsbild

Blev medlem: 00.19 2005-03-30
Inlägg: 4334
Ort: Sjukbädd i Helvetet
Vill inte kräka trådar för mycket, så fortsätter på den här.

Hur fungerar egentligen interruptprioriteten i 46k42 när den nya hanteringen med vektortabell används?

Om en interrupt med hög prioritet exekveras och en annan interruptkälla som ligger högre upp i IVT begär service vad sker då? Kommer pågående ISR att avbrytas, eller får den avslutas innan den som väntar tar vid?

Om den avbryter, då blir ju hela systemetmed automatisk context save blaha, för det är ju fasta "shadow registers" och ingen riktig stack som kan hantera många nivåer.

Om det är på detta fullständigt idiotiska sätt, finns det någon bättre lösning än att ge varje ISR egna programmerade fasta adresser att spara till.


Upp
 Profil  
 
Visa inlägg nyare än:  Sortera efter  
Svara på tråd  [ 20 inlägg ]  Gå till sida 1, 2  Nästa

Alla tidsangivelser är UTC + 1 timme


Vilka är online

Användare som besöker denna kategori: Inga registrerade användare och 2 gäster


Du kan inte skapa nya trådar i denna kategori
Du kan inte svara på trådar i denna kategori
Du kan inte redigera dina inlägg i denna kategori
Du kan inte ta bort dina inlägg i denna kategori
Du kan inte bifoga filer i denna kategori

Sök efter:
Hoppa till:  
   
Drivs av phpBB® Forum Software © phpBB Group
Swedish translation by Peetra & phpBB Sweden © 2006-2010