Kul med PIC församling - Episode 2 (3 / 4 steg)
Steg 3: programvara
Programvaran länk nedan. Medan det är måltavlan för 12F683, är det lätt portas till större versioner av bilden. Det kräver oftast ändra namn som TRISIO till TRISA och GPIO att PORTA. Du måste också ändra raden som identifierar den PIC versionen (lista =) och INCLUDE-filen men de är
intuitiv förändringar. Den __CONFIG linjen kan också behöva tweaking bara för att en eller två av de etiketter som används är stavat fel i några av inkluderade filer. Se bara till att PIC du använder har en PIN-kod som gör att externa avbryta indata (vanligtvis märkt EXT).
Andra än LCD kontroll stiftet ändras, har detta program ett par grundläggande skillnader från den enkla i Episode 1. Framför allt använder en avbrottshanterare så de definierade minnesplatserna för program reset och början av avbrottshanterare har lagts till. Återställ vektorn (adress 0) har en enkel GOTO instruktion att hoppa till den riktiga starten av programmet. Det är nödvändigt eftersom avbrottshanterare börjar alltid på adress 4. En besynnerlighet jag hittat är att programmet MPE X IDE som sammanställer koden inte gillar en GOTO hoppa direkt till ett BANKSEL uttalande. Det är därför den första undervisningen i "MAIN" är en NOP. "Init" rutinen innehåller också instruktioner för att använda den interna 8 MHz klockan istället för standard 4 MHz klocka. Det innebär också att de dröjsmål rutinerna måste ha olika värden än de i Episode 1 rutiner.
Rutinen LCD_Init följer ganska mycket angivna initiering sekvensen för 1602 chip. Rutinen LCD_Line1 visar "Adress/kommando" på linje 1. Rutinen LCD_Line2 ställer in för att skriva de mottagna IR-koderna till linje 2 av LCD-skärmen. Linje 2 får skrivs över varje gång en ny IR-meddelande tas emot.
Hjärtat av IR meddelande fånga koden som finns av avbrottshanterare. Minns från kopplingsschema att vi har anslutna seriella produktionen av IR-mottagaren till den externa avbryta ingången på PIC. Detta ger oss möjlighet att synkronisera med meddelande starten och avkoda varje databit genom att helt enkelt mäta puls bredder. Externa avbryta inmatningen är inställd att avbryta på fallande kanten som alltid visar en bit start. Avbryta rutin kontroller Timer1 för att se hur länge den har varit sedan senaste avbrottet och sedan återställs timern. Vi kunde mäta olika pulserna exakt men tillvägagångssättet lazy fungerar ganska bra. Som vi såg i föregående avsnitt, start pulsen är lätt att identifiera men databitarna göras åtskillnad mellan av utrymme tiden efter data lite. Genom att mäta från fallande kant till fallande kant, vi inkluderar både lite och utrymme-tid. Så vi behöver inte vara alltför exakt när du testar puls bredder. Med tanke på att PIC klockfrekvens är satt till 8 MHz, Timer1 ökar värdet för varje 500ns. För att förenkla programvaran vi bortse från de lägre 8 bitarna av Timer1 (127us högsta) och bara testa de övre 8 bitarna. Varje räkning i de övre 8 bitarna är lika med 128us. Lite "0" data har ett antal större än 5 men mindre än 9 och lite "1" data kommer att ha dubbla intervallet. Det är därför räkningarna kontrolleras i programvaran är satt till 6 för lite data "0" och 12 för lite data "1". Start bit kontrollen är större än 24 räkna (över 3ms). Inte alltför exakta men mycket effektiv.
Rutinen Main_Lp1 är där databitarna avkodas av rutinen avbrott är packat in i de förväntade fyra byte. Anropet till Make_ASCII skickas en nibble i en tid då varje byte och konverterar det numeriska värdet som 0-15 till en läsbar karaktär från 0-F. Det använder en smart process som gör att en programmerare att skapa en uppslagstabell och sedan ställa räknaren Program att hoppa på lämplig plats i tabellen. Varje tabell läget är en speciell subrutin retursatsen (RETLW) som bär ett angivet värde i registret W tillbaka till den anropande rutinen. Efter alla fyra byte har mottagits och skickas till displayen finns det ett samtal till LCD_Line2 att återställa displayen pekaren i väntan på nästa IR meddelande. Det omfattar inte ett kommando för att rensa displayen eftersom nästa meddelande bara skriver över de aktuella display platserna.