
Nu kommer det en kluring tror jag.
När jag testade mitt första program så kopplade jag skopet på RC4, 5, 6 och 7. Gjorde detta för att försäkra mig om att någon av dessa aldrig ställdes hög innan jag själv ville det.
Lite brydd blev jag när RC6 och 7 gjorde det precis vid uppstart. Pulsen varade 1,5µs och var bara en ensam puls som sedan gick låg.
Som ni förstår misstänkte jag direkt min runskrift så jag kommenterade bort alla interrupts och övrig kod så det enda som var kvar var init();. Detta är alltså det enda som fanns inom main och while-loopen, men pulsen kvarstod.
Jaha, då händer det alltså något inom init() som gör detta. Nedan ser ni hur den ser ut. Först stänger jag alltså av dom analoga funktionerna i PORTA och C. Sedan ställer jag dessa portar till utgångar. Slutligen ställs vissa I/O:s som ingångar.
Jag misstänkte att pulsen kommer när jag ställer TRISC som utgång och mycket riktigt, efter att kommenterat bort detta så försvann pulsen.
Frågan är: Finns det ett speciellt flöde man brukar följa för att "lösa" sånt här? Jag har någonstans i bakhuvet att jag fått rådet innan att det är lättare att först ställa hela registret till 0 och sedan enabla de utgångar jag önskar separat.
Finns det just i det här fallet något jag kan göra för att just RC6 och 7 inte ska gå hög?
Måste tyvärr iväg men det som står på min lista, som jag inte provat än, är att innan TRIS-registren sätts till utgångar så skriver jag 0 till alla relevanta LATx-register. Tror ni det kommer hjälpa?
Kod: Markera allt
void init()
{
PIE1.TMR2IE = 1; // Enable TMR2 overflow interrupt
PIE2.TMR3IE = 1; // Enable TMR3 overflow interrupt
PIE1.TMR1IE = 1; // Enable TMR1 overflow interrupt
RCON.IPEN = 1; // Enable interrupt priority
INTCON.GIE = 1; // Enable global and high prio interrupts
INTCON.PEIE = 1; // Enable peripheral and low prio interrupts
IPR1.TMR2IP = 0; // TMR2 overflow interrupt has low prio
IPR2.TMR3IP = 1; // TMR3 overflow interrupt has high prio
IPR1.TMR1IP = 0; // TMR1 overflow interrupt has low prio
OSCCON = 0b01111000; // 16 MHz, HFINTOSC
OSCTUNE.PLLEN = 1; // 4 x PLL = 64 MHz
T1CON = 0b00010011; // TMR1 enabled and use instruction clock, 1:2 prescaler, 16-bit timer
T3CON = 0b01000100; // TMR3 disabled and use system clock, 1:1 prescaler, 2 x 8-bit timer
TMR1H = 255; // preset for timer1 MSB register
TMR1L = 241; // preset for timer1 LSB register
T2CON = 0b00000001; // TMR2 disabled (B2), 1:4 prescaler, 1:1 postscaler
PR2 = 60; // TMR2 match value. Interrupt at 15us and 66'666,67Hz
ANSELA = 0; // Disable analog function for port A
ANSELC = 0; // Disable analog function for port C
TRISA = 0;
TRISC = 0;
TRISA.B2 = 1;
TRISA.B3 = 1;
TRISC.B4 = 1;
TRISC.B5 = 1;
TRISC.B6 = 1;
TRISC.B7 = 1;
}