8 kanal programmerbar Timer (4 / 13 steg)
Steg 4: Knappsats avbryter
Jag ville använda sig av PORTB avbrottet på förändring avbrott på någon trycker på en tangent. För detta, en anpassad avbryta hade skapas i Flowcode, att se till den PORTB riktningen och data har ställts in korrekt före och efter varje knappsats avbrott. Ett avbrott genereras varje gång en knapp trycks ned, och släpptes. Avbryta rutinen svarar endast när en tangent är nedtryckt.
ANPASSADE AVBROTT
Aktivera koden
portb = 0b00001110;
trisb = 0b11110001;
intcon. RBIE = 1;
intcon2. RBIP = 1;
intcon2. RBPU = 1;
rcon. IPEN = 0;
Handler kod
om (intcon & (1 << RBIF))
{FCM_%n();
portb = 0b00001110;
trisb = 0b11110001;
wreg = portb;
clear_bit (intcon, RBIF);
}
Problem som påträffas
Under ett avbrott, avbrottstjänstens rutin skall under inga förhållanden, anropa andra makro som kan användas någonstans i resten av programmet. Detta leder så småningom till stack overflow problem, som avbrottet kan förekomma samtidigt som huvudprogrammet är också i samma subrutinen. Detta är också identifierad som ett allvarligt fel av Flowcode när koden kompileras.
I anpassad kod knappsatsen under GetKeyPadNumber finns det ett samtal till makrot Delay_us, som kommer att orsaka dataspill. För att övervinna detta, jag har bort kommandot Delay_us(10), och ersatt det med 25 rader "wreg = porta;" kommandon. Detta kommando läser PORTA och placerar dess värde i W registret, bara för att få viss försening. Detta kommando kommer att sammanställas till en enda instruktion som liknar assembler movf porta, 0. Varje instruktion kommer att 400ns för 10MHz klockan används i projektet, och för att få en 10us fördröjning, jag behövde 25 i dessa instruktioner.
Notera på den andra raden i figur 3: GetKeypadNumber anpassad kod, som kommandot ursprungliga delay_us(10) har inaktiverats med "/ /". Under detta, jag har lagt min 25 "wreg = porta;" kommandon för att få en ny 10us fördröjning. Ingen kräver alla makron inuti Keypad_ReadKeypadNumber anpassad kod, med kan knappsatsen makrot nu användas inuti en avbrottstjänstens rutin.
Det bör noteras att Flowcode knappsats och eBlocks komponenter inte använder standard pull-up motstånd på ingående linjer. Det används i stället 100K nedrullningsbara motstånd. 100 K motstånden ersattes med 10 K på grund av vissa störningar finns på knappsatsen under utveckling, och alla 10 K motstånd ersättas med 1 K 5. Knappsatsen har testats för att fungera korrekt med leads på 200mm.