Sida 1 av 1

Hjälp med C18/Interrupts

Postat: 21 mars 2013, 09:56:08
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!

Re: Hjälp med C18/Interrupts

Postat: 21 mars 2013, 10:41:58
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 ?

Re: Hjälp med C18/Interrupts

Postat: 21 mars 2013, 11:02:16
av kingrobin
Du... rockar! TACK!

Re: Hjälp med C18/Interrupts

Postat: 21 mars 2013, 12:47:10
av sodjan
Jasså? Och vad var det då ??

Re: Hjälp med C18/Interrupts

Postat: 21 mars 2013, 14:31:51
av kingrobin
Jag deklarade variablerna global istället då funkade allt =D