Nu fick jag fyr på det!
Det var ett ganska pinsamt fel...
'TRISB = 1;' är inte samma sak som 'TRISB = 0xFF;', till skillnad mot mBasic där 'TRISB = 1' är samma sak som 'TRISB = $FF' (eller, man får samma resultat). Detta medförde ju att enbart bit 0 blev ingång. Klantigt värre. Men nu kommer jag aldrig missa en sådan sak.
När jag petar min sladd mot något av benen, så märks studsandet ganska rejält, men det kvittar ju nu: bara ett test.
Postar det fungerande programmet:
Kod: Markera allt
// PIC16F877A @ 20MHz
char a;
void interrupt () {
a = ~a;
asm { MOVF PORTB, F } /* läs PORTB, så mismatch clearas */
INTCON.RBIF = 0; /* nolla interrupt-flaggan */
}
void main () {
TRISD = 0x00;
TRISB = 0xF0;
OPTION_REG = 0x7F; /* internal pull-ups enable */
INTCON = 0x88; /* slå på förändringsinterrupt på <RB7:RB4> & GIE = 1 */
a = 0xFF;
while (1) {
PORTD = a;
}
}
Det där med mismatch condition, det verkar ju fungera fint utan att cleara den. Det kanske fixas automatiskt av kompilatorn, eller något?
Tack för all hjälp! Pluspoäng till sodjan.
EDIT: Känns dumt att säga att ett program fungerar, när det inte gör det, så jag ändrade till det fungerade.