Koden ser ut såhär:
Kod: Markera allt
#define WHEEL_LEFT LATA0
#define WHEEL_RIGHT LATA1
int cnt = 0;
char pulse = 15;
void interrupt highInterrupt() {
if(TMR0IF) {
if (cnt < pulse) {
WHEEL_LEFT = 1;
} else {
WHEEL_LEFT = 0;
}
if (cnt > 200) {
cnt = 0;
}
cnt++;
TMR0 = 56; // Initial Value for 0.1ms Interrupt
TMR0IF = 0; // Clear TIMER0 interrupt flag
}
}
/*
*
*/
void main() {
// Use 8MHz int osc
OSCCON = 0b01111111;
// Enable priority interrupts
IPEN = 1;
// Enable TMR0 and INT0 interrupts
INTCON = 0b10110000;
// TMR0 high priority
INTCON2 = 0b10000100;
// Disable other interrupts
INTCON3 = 0b00000000;
// Enable TMR0 8Bit 1:1
T0CON = 0b11001000;
// Start TMR0 at 25
TMR0 = 56;
// Enable TMR2
T2CON = 0b00000100;
// Disable USB
UCON = 0;
UTRDIS = 1;
//Init pins
LATA = 0;
ADCON1 = 0x0F;
CMCON = 0x07;
TRISA = 0;
LATB = 0;
TRISB = 0b00100000;
LATA2 = 1;
for (;;) {
if (RB5) {
pulse = 10;
} else {
pulse = 20;
}
}
}
Det som händer:
Om jag har RB5 hög när jag ger ström till kretsen kommer pulser som gör att servot snurrar CW. Drar jag den låg börjar servot snurra CCW. Så långt är allt rätt.
Men om jag drar RB5 hög igen kommer inga pulser och spänningen över RA2 (som jag drar hög i början) blir ~2.5V vilket jag antar betyder att kretsen startar om hela tiden. Drar jag RB5 låg igen kommer pulser och servot snurrar CCW.
Jag har testat utan servot med endast en lysdiod men får samma resultat (för att utesluta att servot drar för mycket ström).
Det sitter en konding på 100nF nära kretsen. Vid matningen sitter en 100nF, en 1µF och en 3300µF. Matningen består av en 7805. På andra sidan 7805 sitter en 10µF och ett 9V batteri. Jag har mätt att spänningen håller sig på 5V så det bör inte vara problemet.
Mclr har ett pullupmotstånd på 12k