PIC18F25K22 interrupt problem *LÖST* Nytt strul

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Icecap
Inlägg: 26650
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

PIC18F25K22 interrupt problem *LÖST* Nytt strul

Inlägg av Icecap »

OK, jag har helt säkert översett något - men vad?

PIC18F25K22, PICkit3, MPLAB-X 1.95 med XC8 V:1.21

Jag initierar systemet i vanlig ordning, portars riktning och startvärden, inget konstigt.
Sedan kör jag:

Kod: Markera allt

RCON    = 0x8F; // Använd hög & låg interruptnivå
INTCON  = 0x00; // Ingen interrupt nu
INTCON2 = 0x80; // Ingen interrupt här heller - och ingen pull-up på PORTB
INTCON3 = 0x00; // Ingen interrupt här heller
INTCON  = 0xC0; // Tillåt hög- & lågprioritets interrupt
Sedan initierar jag Timer 1 till att bara räkna upp med Tosc/4 och ge interrupt vid overflow:

Kod: Markera allt

TMR1IF = false; // Rensa evt. interrupt
TMR1IP = true; // Ställ till hög interrruptprioritet
TMR1IE = true; // Tillåt Timer 1 overflow interrupt
T1CON = 0x02; // Tosc/4, 1:1, 16-bit R/W-mode, stoppad
TMR1 = 0;
T1CON = 0x03; // Tosc/4, 1:1, 16-bit R/W-mode, startad
Nu borde jag få interrupt med ung. 61Hz (16MHz/4/65536 = 61,035Hz) - men ingen exekveras!
Låter jag main-loop kolla TMR1IF kommer det i den takt - men jag kan tydligen inte slå på TMR1IE!
Min utläsning av TMR1IE ger att den är nollställd och då undrar jag: har jag missat något?

Man ska ju för böveln kunde sätta TMR1IE med det kommando. Jag har såklart testat att även OR in värdet i PIE1 (PIE1 |= 0x01;) också men med samma resultat.

Jag har nu stångad mig nära nog blodig över detta men jag har ganska klart översett något så om någon har tips är jag tacksam för dom.
Senast redigerad av Icecap 17 januari 2014, 11:57:24, redigerad totalt 2 gånger.
janno
Inlägg: 434
Blev medlem: 11 oktober 2009, 07:34:45
Ort: Västerås

Re: PIC18F25K22 interrupt problem

Inlägg av janno »

Så här ser min enable interrupt ut, detta är en PIC18F46K22 men de är väl likvärdiga (förutom antal ben o minne) så den borde väl fungera nästan rakt av, jag kör MPLABX o C18. Jag använder alltid (nästan) de register definitionerna som finns för det känns tydligare.

Kod: Markera allt


void initInterrupts()
{
    tmr_t t;



 /* Enable interrupt priority */
  RCONbits.IPEN = 1;

   /* Make receive interrupt high priority */
  IPR1bits.RCIP = 1;


  T1CONbits.T1CKPS=0;	//Prescaler 1:1
  IPR1bits.TMR1IP = 1;	//Enable timer 1 interrupt
  T1CONbits.TMR1ON = 1;
  PIE1bits.TMR1IE = 1;

  t.value ==0xF000;
  TMR1H = t.tmrh;
  TMR1L = t.tmrl;


 /* Enable all high priority interrupts */
   INTCONbits.GIEH = 1;
  // INTCONbits.GIEL = 1;
}
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: PIC18F25K22 interrupt problem

Inlägg av sodjan »

> TMR1IE = true;

Nu så *ska* i och för sig "true" vara "1" enligt stdbool.h, men har
du i alla fall provat med "TMR1IE = 1;" ?

Har du kollat den ASM som XC8 spottar ur sig?
Användarvisningsbild
Icecap
Inlägg: 26650
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: PIC18F25K22 interrupt problem

Inlägg av Icecap »

janno: har testat att skriva båda RCONbits.IPEN (osv) och IPEN (osv) och jämföra hexfilerna i de två olika fall. De var identiska, alltså är det samma definition. Sedan anges dessa bits inte som RCONbits.IPEN (osv) i databladet men som IPEN (osv). Då är det för mig mest logisk att använda den definition.

Sodjan: har en definition i starten:
#define true 1
#define false 0
I XC8 är dessa värden inte pre-definierat, alltså måste man göra det själv. Men ja, jag har testat med 1 och 0 istället, ingen ändring.

Det som är själva kärnan i problemet är ju hur tusan jag ska aktivera den förbånkade TMR1IE. Får väl dekoda HEX-filen o se på resultatet.

TMR1IE = true; utlöser
bsf 3997, 0, c

så det verkar ju helt OK.
janno
Inlägg: 434
Blev medlem: 11 oktober 2009, 07:34:45
Ort: Västerås

Re: PIC18F25K22 interrupt problem

Inlägg av janno »

Hittade en bugg i min egen kod. Tänk vad man ser när man väl har klistrat in den.

Kod: Markera allt

  t.value ==0xF000;
  TMR1H = t.tmrh;
  TMR1L = t.tmrl;
Ska förstås vara

Kod: Markera allt

  t.value = 0xF000;
  TMR1H = t.tmrh;
  TMR1L = t.tmrl;
Nu sätter jag om tiden efter varje interrupt så det är bara första gången som det tar slumpmässig tid.

Men till ditt problem. Hur definerar du interrupt funktionen?

i C18 XC8 så der det ut så här:

Kod: Markera allt

void interrupt high_isr(void)
{
	if(PIR1bits.TMR1IF && PIE1bits.TMR1IE)
	{
	}
}
Edit: Jag talar i nattmössan ovan kod är inte C18 utan just XC8, hade helt säkert för mig att det var den gammla kompilatorn men syntaxen stämde inte riktigt så när jag kollade i insällningarna från projektet så var det klart o tydligt XC8.
Användarvisningsbild
Icecap
Inlägg: 26650
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: PIC18F25K22 interrupt problem

Inlägg av Icecap »

ISR'n ser ut som följer:

Kod: Markera allt

void Interrupt(void)
  {
  if(TMR1IF)
    {
    TMR1IF = false; // Kill interrupt flag
    LED_Red ^= true; // Toggle LED
    }
  }
Och nej, jag kollar inte om IE är aktiv, jag har nämligen bara bara enablad dom som ska enablas och jag ändrar inte på vägen. Men problemet är ju just att jag inte kan starta skiten, TMR1IE kan jag inte aktivera fastän koden är rätt.

EDIT: Har just testat med Timer3 istället - samma sak. Det är alltså något gemensamt som knasar. De exempel jag hittar på nätet gör samma sak som jag.
Senast redigerad av Icecap 9 januari 2014, 20:38:54, redigerad totalt 1 gång.
janno
Inlägg: 434
Blev medlem: 11 oktober 2009, 07:34:45
Ort: Västerås

Re: PIC18F25K22 interrupt problem

Inlägg av janno »

Om jag inte misstar mig så saknar du nyckelordet interrupt
Vilket gör att det blir en vanlig funktion.
Detta borde fungera:

Kod: Markera allt

void interrupt Interrupt(void)
  {
  if(TMR1IF)
    {
    TMR1IF = false; // Kill interrupt flag
    LED_Red ^= true; // Toggle LED
    }
  }
janno
Inlägg: 434
Blev medlem: 11 oktober 2009, 07:34:45
Ort: Västerås

Re: PIC18F25K22 interrupt problem

Inlägg av janno »

för lågprioritets avbrott så prefixas funktionen med
interrupt low_priority

Kod: Markera allt

void interrupt low_priority nnn()
{
}
Vad funktionerna heter spelar ingen roll alls, de bör kanske heta något som är unikt.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: PIC18F25K22 interrupt problem

Inlägg av sodjan »

Oavsett hur själva ISR'en ska kodas så ska det ju gå att "sätta" ...IE flaggan i alla fall!

Icecap, du säger att du kan "läsa tillbaka" IE flaggan och den är alltid 0, hur menar du då?
Har du testat med något i stil med att först sätta IE och sedan med en BTFSS/BTFSC
(eller motsvarande i C) göra en koll? Kan du göra ett kort ASM prog som gör samma sak?

> Sodjan: har en definition i starten:
> #define true 1
> #define false 0
> I XC8 är dessa värden inte pre-definierat,

De finns i stdbool.h.
Användarvisningsbild
Icecap
Inlägg: 26650
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: PIC18F25K22 interrupt problem

Inlägg av Icecap »

janno: BINGO! TACK! :happy:
Bugar djupt och tacksamt. Det var mitt fel (har ju inte påstådd annat) och de definitioner du skrev löste det hela.

Nu ska jag lägga mig!

EDIT: jag kollade igenom LST-filen, specifikt efter interrupt-adressorna (0x0008 & 0x0018) men de fanns inte med i den som specifika interrupts. Detta har sannolikt givit intressanta effekter som har ställt till det lite varstans.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: PIC18F25K22 interrupt problem

Inlägg av sodjan »

Så, p.g.a *namnet* på ISR'en så kunde du inte sätta TMR1IE till "1" !?
Du skrev att du hade kollat att TMR1IE faktiskt inte sattes till "1"...
Användarvisningsbild
Icecap
Inlägg: 26650
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: PIC18F25K22 interrupt problem

Inlägg av Icecap »

De utskrifter jag hade gjort innan gav att den inte blev ställd till 1. Tydligen har interrupt-hoppet förstörd utskriften, ska kanske återställa och se resultatet i list-filen. Hur som helst fungerar det nu och då kan jag komma vidare.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: PIC18F25K22 interrupt problem

Inlägg av sodjan »

Jo, det är ju det viktiga... :-)
janno
Inlägg: 434
Blev medlem: 11 oktober 2009, 07:34:45
Ort: Västerås

Re: PIC18F25K22 interrupt problem

Inlägg av janno »

Vad skönt att det löste sig.
Man kan stirra sig helblind på koden ibland.
Användarvisningsbild
Icecap
Inlägg: 26650
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: PIC18F25K22 interrupt problem

Inlägg av Icecap »

janno & sodjan: det var ju en typisk "jag har gjort detta så himla ofta att jag inte ens tänker över det - så vadfan gick snett?" fel från min sida. Sedan kan jag påstå att det är ganska mycket just nu, det är inte fel men ingen egentlig ursäkta heller.

Men just nu är jag bara glad över att det fungerar - och sedan får jag jobba med en massa annat innan jag kan komma vidare med projektet.
Skriv svar