Hjälp med C18/Interrupts

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
kingrobin
Inlägg: 11
Blev medlem: 21 mars 2013, 09:49:23

Hjälp med C18/Interrupts

Inlägg av kingrobin »

Jag behöver lite ljus i detta. Problemet är jag försöker ändra TRISB registert under en interrupt funktion men det verka inte fungera. För kompilator säger att den här raden: "char temp_1 = PORTB & 0xF0;" har syntax error. Sen vill jag också ha en delay funktion innan jag läser av PORTB (det är en tangetbord uppgift jag jobbar med) för eventuella studsar. Jag har försökt att skriva TRISB ändringen i assembler men det ger samma error.

Detta error får jag:

Make: The target "C:\Users\iMighty\Documents\Mikrodata\inl51\inl51.o" is out of date.
Executing: "C:\Program Files (x86)\Microchip\mplabc18\v3.40\bin\mcc18.exe" -p=18F458 "inl51.c" -fo="inl51.o" -D__DEBUG -Ou- -Ot- -Ob- -Op- -Or- -Od- -Opa-
C:\Users\iMighty\Documents\Mikrodata\inl51\inl51.c:25:Error: syntax error
Halting build on first failure as requested.

Här är min kod

Kod: Markera allt

#include <p18cxxx.h>
#include <delays.h>
#include <portb.h>

#pragma config OSC = HS
#pragma config WDT = OFF
#pragma config LVP = OFF
#pragma config DEBUG = ON

unsigned char sjuseg[] = {0b00111111,0b00000110,0b01011011,0b01001111,0b01100110 ,0b01101101,0b01111101,0b00000111,0b01111111,0b01101111};
unsigned char combo[] = {0b01111101,0b11101110,0b11101101,0b11101011,0b11011110,0b11011101,0b11011011,0b10111110,0b10111101,0b10111011};

void interrupt (void);
#pragma code HIGH_INTERRUPT_VECTOR = 0x8
void high_ISR (void){
	_asm
	goto interrupt
	_endasm
}

#pragma code
#pragma interrupt interrupt
void interrupt (void){
	Delay10TCYx(1);					//DEN HÄR RADEN ÄR DUM VARFÖR FUNKAR DU INTE?!
	char temp_1 = PORTB & 0xF0;					//Maskar raden
	TRISB = 0b00000111;				//VARFÖR KAN JAG INTE ÄNDRA DIG UNDER INTERRUPT!
	char temp_2 = PORTB & 0x0F;					//Maskar kolumn
	unsigned char temp = ~(temp_1 | temp_2);	//Lägger ihop dem
	unsigned char nummer = 0;
	for(nummer = 0; nummer < 9; nummer++){		//Kolla vilket nummer det är
		if(temp == combo[nummer]){			
			PORTC = sjuseg[nummer];				//Visa detta på sjuseg.
			break;
		}
		else
			PORTC = 0x00;
	}					
	INTCONbits.RBIF = 0;
}


void EnableHighInterrupts (void)
{
RCONbits.IPEN = 1; /* enable interrupt priority levels */
INTCONbits.GIEH = 1; /* enable all high priority interrupts */
}

void main (void){
	TRISA = 0x00;
	TRISB = 0b11111111;
	PORTA = 0b00001110;
	PORTB = 0x00;
	TRISC = 0x00;
	PORTC = 0x00;
	OpenPORTB(PORTB_CHANGE_INT_ON & PORTB_PULLUPS_ON);
	EnableHighInterrupts();
	while(1);;
}
Tack för hjälpen!
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Hjälp med C18/Interrupts

Inlägg av sodjan »

För mig ser det lite underligt ut med en *goto* från en funktion (high_ISR)
till en annan (interrupt), men är du säker på den delen, så OK...

Sen så, är det inte vanligare att man (typ) deklararer sina variabler
först i inledningen av koden och sedan bara använder dom utan
typdeklaration i själva koden ?
kingrobin
Inlägg: 11
Blev medlem: 21 mars 2013, 09:49:23

Re: Hjälp med C18/Interrupts

Inlägg av kingrobin »

Du... rockar! TACK!
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Hjälp med C18/Interrupts

Inlägg av sodjan »

Jasså? Och vad var det då ??
kingrobin
Inlägg: 11
Blev medlem: 21 mars 2013, 09:49:23

Re: Hjälp med C18/Interrupts

Inlägg av kingrobin »

Jag deklarade variablerna global istället då funkade allt =D
Skriv svar