Problem med interrupt-on-change (PIC16F887)
Postat: 8 augusti 2010, 11:52:50
Hej. Jag försöker att programmera en robot som jag har byggt.

Jag programmerar i MikroC 8.2. Nu har jag en PIC16F887 men jag har även försökt och fått samma felsymptom med en PIC18F4550. Tanken är att roboten ska undvika hinder med hjälp av en ultraljudssensor som sitter på ett servo och fyra trycksensorer, som ska kännas av med hjälp av interrupt-on-change. Mellan servot/motorstyrningen och den här mikrokontrollen sitter andra små mikrokontrollrar, det gör att jag kan styra hela roboten genom att bara lägga ut ett värde mellan 0-15 på respektive port.
Så här är det kopplat:
För att testa interrupt-funktionen har jag har gjort ett program där jag ”tittar” med servot åt höger och vänster i huvudprogrammet, och när det blir interrupt (när någon av trycksensorerna blir intryckta) ska den titta fortare med servot åt höger och vänster några gånger. Det fungerar, men ibland, inte varje gång, så ”fastnar” programmet i ca 10 sekunder vid slutet av interrupt-rutinen precis efter att den har centrerat servot. Är det någon som vet vad jag gör för fel?
Här är mitt program:

Jag programmerar i MikroC 8.2. Nu har jag en PIC16F887 men jag har även försökt och fått samma felsymptom med en PIC18F4550. Tanken är att roboten ska undvika hinder med hjälp av en ultraljudssensor som sitter på ett servo och fyra trycksensorer, som ska kännas av med hjälp av interrupt-on-change. Mellan servot/motorstyrningen och den här mikrokontrollen sitter andra små mikrokontrollrar, det gör att jag kan styra hela roboten genom att bara lägga ut ett värde mellan 0-15 på respektive port.
Så här är det kopplat:
Kod: Markera allt
// Inputs:
// PORTA.F0 = Rangefinder Data bit (1)
// PORTA.F1 = Rangefinder Data bit (2)
// PORTA.F2 = Rangefinder Data bit (4)
// PORTB.F0 = Rangefinder Data bit (8)
// PORTB.F4 = LF Bumper
// PORTB.F5 = RF Bumper
// PORTB.F6 = LB Bumper
// PORTB.F7 = RB Bumper
// Outputs:
// PORTC.F0 = Servo Data bit (1)
// PORTC.F1 = Servo Data bit (2)
// PORTC.F2 = Servo Data bit (4)
// PORTC.F3 = Servo Data bit (8)
// PORTD.F0 = RM Data bit (1)
// PORTD.F1 = RM Data bit (2)
// PORTD.F2 = RM Data bit (4)
// PORTD.F3 = RM Data bit (8)
// PORTD.F4 = LM Data bit (1)
// PORTD.F5 = LM Data bit (2)
// PORTD.F6 = LM Data bit (4)
// PORTD.F7 = LM Data bit (8)
Här är mitt program:
Kod: Markera allt
void interrupt()
{
INTCON = 0b00000000; // stäng av interrupt
PORTC = 7; // "titta vänster"
PORTB.F0 = 0;
Delay_ms (100);
PORTC = 9; // "titta höger"
PORTB.F0 = 1;
Delay_ms (100);
PORTC = 7; // "titta vänster"
PORTB.F0 = 0;
Delay_ms (100);
PORTC = 9; // "titta höger"
PORTB.F0 = 1;
Delay_ms (100);
PORTC = 7; // "titta vänster"
PORTB.F0 = 0;
Delay_ms (100);
PORTC = 9; // "titta höger"
PORTB.F0 = 1;
Delay_ms (100);
PORTC = 7; // "titta vänster"
PORTB.F0 = 0;
Delay_ms (100);
PORTC = 9; // "titta höger"
PORTB.F0 = 1;
Delay_ms (100);
PORTC = 8; // "centrera servot"
PORTB.F0 = 1;
INTCON = 0b10001000; // interrupt on change (PORTB)
IOCB = 0b11110000; // (bit 4-7)
}
//************************************************************
void main()
{
Delay_ms(20);
OSCCON = 0b00000000; // extern ochilator
ANSEL = 0b00000000; //inga analoga ingångar
ANSELH = 0b00000000; //inga analoga ingångar
PORTA = 0b00000000; // cleara portarna
PORTB = 0b00000000;
PORTC = 0b00000000;
PORTD = 0b00000000;
PORTE = 0b00000000;
TRISA = 0b00001111; // 0 = output, 1 = input
TRISB = 0b11110000;
TRISC = 0b00000000;
TRISD = 0b00000000;
TRISE = 0b00000000;
INTCON = 0b10001000; // interrupt on change (PORTB)
IOCB = 0b11110000; // (bit 4-7)
WPUB = 0b00000000; // inga pull upp
while(1)
{
PORTC = 5; // "titta vänster"
PORTB.F0 = 0;
Delay_ms (1500);
PORTC = 11; // "titta höger"
PORTB.F0 = 1;
Delay_ms (1500);
}
}