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);
}
}