1 De PIC Microcontroller Wat is het en wat kun je er mee? Lex Peters - PE1CVJ November 2010, v0.9 Lex Peters PE1CVJ Ben Emons PB2BN Dick Bronsdijk PA3HBS 2 Inhoud presentatie • Waarom starten met een PIC Microcontroller? • hoe werkt het ding • wat kun je er nu mee • wat heb je nodig om te starten • Uitwerking van een PIC project • Werkende voorbeelden uit de praktijk VERON afdeling Amstelveen, 25 November 2010 Lex Peters - PE1CVJ 3 Lex Peters - PE1CVJ “Peripheral Interface Controller” Achtergrond en basale werking 4 Waarom een microcontroller? Lex Peters - PE1CVJ • Wat is er mis met de conventionele manier van electronische schakelingen ontwerpen en bouwen? ▫ Helemaal niets! • Waarom dan toch starten met microcontrolers? ▫ Je kunt bijna alles maken met een handvol componenten en een goed idee ▫ Je hebt nauwelijks ruimte nodig om te ontwikkelen (alleen een PC, wat software, een programmer en een experimenteer (bread) board ▫ Je kunt dingen veel simpeler ontwerpen ▫ Het werkt vaak sneller ▫ Het is te integreren met andere componenten (I2C bus, serieel, USB, CAN bus, 1wire etc.) ▫ Er is ontzettend veel gratis beschikbaar!! ▫ Er zijn al veel gebruikers forums waar je via internet veel mee kunt delen ▫ En het is gewoon ontzettend leuk om het zelf te kunnen ontwerpen !!!! 5 Waarom de PIC van Microchip? Lex Peters - PE1CVJ (er zijn nog zoveel andere typen) Eigenlijk geen speciale reden, ATMEL en TI maken ook hele goede chips met wellicht een betere architectuur, alleen: • • • • • • • • • • Vanuit de historie zijn er al veel ontwerpen beschikbaar voor de PIC PIC modellen zijn upwards compatible Binnen de VERON A02 was er al de nodige kennis van PIC Microcontrollers Er zijn al een groot aantal 16F88’s PICs en LCD displays verzameld door VERON A02 voor nog op te starten projecten (SWR/Power meter was een idee) Er zijn al projecten mee gedaan (denk aan de LC-meter) Bijna alle PICs kun je in-circuit programmeren (dus zonder ze uit de schakeling te halen) Er zijn een paar hele leuke boeken beschikbaar om mee te starten van Bert van Dam JAL (Just Another Language), een gratis open source compiler die via een wereldwijd platform van gebruikers dat steeds meer functionaliteit biedt Onderdelen zijn goed verkrijgbaar via VOTI.NL welke is opgezet door Wouter van Ooijen, initiator van JAL en de leverancier van de bekende WISP programmers Dus eigenlijk niet echt een heel speciale reden……….;-) 6 Architectuur & funkties I Wat zit er zoal in een PIC Microcontroller aan functies: • Input/output poorten digitaal/analoog • AD en DA omzetters • Timer / Clock / Oscillator • Pulse Wide Modulation (PWM) • Communicatie bussen (Serial port, USB, I2C, etc.) • Comparator • Memory Lex Peters - PE1CVJ Voorbeeld: PIC16F887 Block Diagram Een microcontroller bevat dus veel meer dan alleen een processor!! Schema uit webcursus van MikroElektronika 7 Architectuur & funkties II Lex Peters - PE1CVJ Von Neuman architectuur (zoals in de PC) • • • Voordeel: 1 soort memory, makkelijk uitbreidbaar Nadeel: zelfde bus voor data en instructies (dus langzamer) Focus: data processing Harvard architectuur (zoals in de PIC) • • • Voordeel: verschillende bussen voor data en instructies dus snelheidsonafhankelijk Nadeel: verschillende soorten memory, niet zo makkelijk uit te breiden Focus: besturing Een microcontroller is eigenlijk een complete computer voor maar een paar Euro ;-) Schema uit webcursus van MikroElektronika 8 Instructies en registers Lex Peters - PE1CVJ Een PIC Microcontroller is dus eigenlijk een complete computer, inclusief geheugen en connectie mogelijkheden naar de buitenwereld. Dus ook een eigen, heel simpel operating system. Als we een functie iets willen laten doen moeten we dus dat operating system vertellen wat, hoe, wanneer; kortom via instructies (programma). De aansturing van de beschikbare functies vindt plaats via z.g. registers. De meest basale manier om een programma te schrijven is via Assembler. Via deze taal kan via een beperkte set van instructies alles worden aangestuurd en afgetest. Microchip levert gratis de programma suite MPLAB die naast een editor om het programma te schrijven ook een assembler heeft om het programma om te zetten in hexadecimale codes: de enige taal die een PIC begrijpt. Schema uit webcursus van MikroElektronika 9 Assembler vs high level taal Lex Peters - PE1CVJ Voordelen assembler: • Je kunt alles aansturen en afvangen • Het is specifiek voor de PIC en wordt gratis door de fabrikant geleverd (MPLAB) • Het zal daarom altijd worden ondersteund Nadelen assembler: • Je hebt meer basale kennis nodig van de diepere werking van de controller • Het leest minder makkelijk • Veel instructies voor simpele handelingen Oplossing: high level programmeer taal als C, Basic of JAL • Makkelijker leesbaar en programmeerbaar door preset functies (maar: uiteindelijke PIC code blijft gelijk) Schema uit webcursus van MikroElektronika 10 Nodig om te starten…. Lex Peters - PE1CVJ 9-16 V …………………………………….of ……………………………..5 V apart PC + Software internet Serieel / USB Software (MPLAB of JAL editor): 1. Een editor om het programma in te schrijven 2. Een Compiler om het geschreven programma om te zetten in machine code 3. Een programma om de machinecode in de PIC Microcontroller te zetten 4. Handig: een VT52 terminal emulatie programma om met de PIC te communiceren In-circuit Prog + Serieel Interface I/O via Display of VT52 Bread board LCD Display 11 Basale PIC aansluitingen Lex Peters - PE1CVJ + + : Vdd - : Vss Spanning • Meestal 5 V • Sommige 3,3 V Int/ext Oscillator • Interne oscillator • Of extern kristal 4-20Mc • Of extern keramisch filter I/O poorten • Analoog/Digitaal • Opletten of er pull-up weerstanden nodig zijn + - + - - ADC • Let goed op de spannningsrange Voorbeeld van een schakeling met reset en voeding 12 Een simpel project in assembler Lex Peters - PE1CVJ Bij het begin van een nieuw project zal er een keuze gemaakt worden met welke PIC er begonnen wordt. Ben’s eerste keus is de PIC 16F88. Bevat : • Twee I/O registers voor analoge input en digitale input en output. • In- en externe oscillator opties. • Diverse timer opties. • Geschikt voor ICSP. Goed verkrijgbaar en goedkoop. Veel kant en klare software op internet. Ondersteuning in diverse programmeertalen. Later kan altijd nog naar een grotere of kleinere PIC overgestapt worden omdat de code compatibel is. Vraagt wel enige kleine aanpassingen in de broncode en vervolgens draait het programma weer. - + 13 De 16F88 nader bekeken Lex Peters - PE1CVJ Aansluitingen Per pin meerdere opties mogelijk die in het programma aan of uitgezet moeten worden. Aansluitspanning 5V (Vdd = + en Vss = -) Externe oscillator op OSC1 en OSC2 RAx en RBx indicatie voor poorten A en B met poortnummer x - + INT = interrupt PGD en PGC nodig voor seriele communicatie met de programmer Ook PGM en MCLR nodig voor programmeren ANx geeft verwijzing naar analoge ingang met poortnummer x Kortom: datasheet is onmisbaar 14 Voorbeeldproject Assembler I Bepaal of S1 wordt gesloten (poort RA0 – input) en laat dan LED D1 branden (poort RB0 output) ; ; ; ; ; ; ; ; ; + Lex Peters - PE1CVJ Name: SWITCH.ASM Test for switch connected between RA0 and ground and resistor of 1000 Ohm between RA0 and + 5 V. LED, connected to RB0 via 470 Ohm resistor, shows result. Ben Emons, PB2BN, Amstelveen, 21 nov. 2010 Instructions for assembler LIST P=16F88 ERRORLEVEL -302 ;Suppress bank selection msgs #INCLUDE "p16F88.inc" __CONFIG _CONFIG1, _CPD_OFF & _CP_OFF & _DEBUG_OFF & _LVP_OFF & _MCLR_ON & _PWRTE_ON & _WDT_OFF & _WRT_PROTECT_OFF & _HS_OSC & _BODEN_OFF 1K ;================= Start of Code ================= org 100 ;Prevent conflicts with first 20H! goto Start ; Enable B0 for dig output / A0 for dig input Start - + S1 470 clrf banksel clrf banksel movlw movwf movlw movwf clrf movlw movwf STATUS PORTA PORTA ANSEL 0x00 ANSEL b'00000001' TRISA PORTB b'11111110' TRISB ;Initialize ports A and B BCF STATUS,RP0 ;Select REGISTER BANK 0 PORTA,0 RESET PORTB,0 RESULT PORTB,0 TEST ;Test switch for ON/OFF ;Set port A0 as digital input. ;Set port B0 as digital output. ; Program TEST D1 - RESET RESULT BTFSS GOTO BSF GOTO BCF GOTO ;Set LED 1 ON ;Set LED 1 OFF END Oscillator etc. even weggelaten in dit voorbeeld ; Instructionset for PIC 16F88 can be found in : ; ; "8-bit CMOS Flash/EEPROM Microcontrollers PIC 16F88" 15 Voorbeeldproject Assembler II ; ; ; ; ; ; ; ; ; Lex Peters - PE1CVJ Name: SWITCH.ASM Test for switch connected between RA0 and ground and resistor of 1000 Ohm between RA0 and + 5 V. LED, connected to RB0 via 470 Ohm resistor, shows result. Ben Emons, PB2BN, Amstelveen, 21 nov. 2010 Instructions for assembler LIST P=16F88 ERRORLEVEL -302 ;Suppress bank selection msgs #INCLUDE "p16F88.inc" __CONFIG _CONFIG1, _CPD_OFF & _CP_OFF & _DEBUG_OFF & _LVP_OFF & _MCLR_ON & _PWRTE_ON & _WDT_OFF & _WRT_PROTECT_OFF & _HS_OSC & _BODEN_OFF ;================= Start of Code ================= org 100 ;Prevent conflicts with first 20H! goto Start ; Enable B0 for dig output / A0 for dig input 16 Voorbeeldproject Assembler III Start Lex Peters - PE1CVJ clrf banksel clrf banksel movlw movwf movlw movwf clrf movlw movwf STATUS PORTA PORTA ANSEL 0x00 ANSEL b'00000001' TRISA PORTB b'11111110' TRISB ;Initialize ports A and B BCF STATUS,RP0 ;Select REGISTER BANK 0 PORTA,0 RESET PORTB,0 RESULT PORTB,0 TEST ;Test switch for ON/OFF ;Set port A0 as digital input. ;Set port B0 as digital output. ; Program TEST RESET RESULT BTFSS GOTO BSF GOTO BCF GOTO END ;Set LED 1 ON ;Set LED 1 OFF 17 PIC programmers Lex Peters - PE1CVJ De JDM-programmer is een eenvoudige schakeling om te gebruiken om uw programma in de PIC te schrijven. De software hiervoor is ICPROG van Bonny Gijzen. Kijk bij www.ic-prog.com Voor een printje zie www.pi4zlb.nl • Vereist een echte RS232C poort die meestal afwezig is. • Werkt niet met USB → serieel kabeltje! • Geen ondersteuning voor modernere PIC's zoals 16F88. • Advies: kies in zulke gevallen een USB-programmer want die poort is er altijd. Canakit UK1301 met 20-pens ZIF-voet, zie www.canakit.com/usb-pic-programmer.html • Prijs ongeveer € 39.- . • Werkt uitstekend op basis van PICkit2 software van Microchip. • Updates voor nieuwe PIC's is dus geen probleem. • Er is een duurdere versie met 40 pens ZIF-voet. Niet nodig, want de UK1301 kan die via ICSP programmeren. WISP648: is verkrijgbaar bij www.voti.nl als bouwpakket en volledig gebouwd • Is volledig compatible met zowel de MPLAB software en hardware van Microchip alsook met de JAL software. Ondersteuning alle PICs (updateble PIC), • gaat uit van in-line programming (dus geen ZIF-voet) • Goede ervaringen Lex en Dick. • Prijs bouwpakket 29 Euro, • Rs232 naar USB kabel (16 Euro) is nodig voor USB gebruik maar werkt wel goed 18 Overige hulpmiddelen Lex Peters - PE1CVJ Een ontwikkelbordje is erg handig en zelf te maken (gaatjesprint). Bread boards zijn handig voor de het hele experimentele stadium. Aantal exemplaren aanwezig in het clubhuis voor experimenten op de technische avonden. Zijn ook in de handel te koop. Voor een idee, zie bij www.voti.nl onder o.a. DWARF-board. Daar vindt men ook printjes voor LCD display of analoge aansluitingen. Op internet is voor PIC's veel software te vinden. Vaak met broncode die met kleine aanpassingen goed te gebruiken is. Selectief kijken en u vindt zeker wat u zoekt! Dat bespaart veel werk! Leuke en leerzame projecten zijn vaak compleet te downloaden van internet zoals de Frequentiemeter, zie www.qsl.net/om3cph/counter/counter.html of www.pi4zlb.nl. Vaak is alleen de gecompileerde code beschikbaar en niet de z.g. ‘source code’ die u nog aan kunt passen. Het voordeel is dat u, met een eigen programmer en software wel uw eigen PICs hiermee kunt programmeren. Werken met PIC's vereist wel ervaring met PC, internet, downloaden en installeren van software. Heeft u die kennis (nog) niet denk dan even na voordat er in een impuls met iets begonnen wordt om teleurstellingen te voorkomen. 19 Lex Peters - PE1CVJ Zelf een morse decoder ontwerpen o.b.v. de PIC 16F88 met de high level programmeertaal JAL (Just Another Language) 20 Project ontwerp Lex Peters - PE1CVJ Wensenlijstje • Ingangsignaal schakelbaar • • • • • • • Signaal hoorbaar (aan/uit schakelbaar) In-Circuit Programmeren mogelijk Seriëele communicatie mogelijk LCD display • • • • • • Lijn signaal Microfoon ingebouwd Keyer Principe schema Micr LCD 4x20 44780 compatible Audio-in Line-in Max. 200 mV Tone Decoder Gedecodeerde tekst Woorden per minuut (WPM) Iets over kwaliteit Ingangssignaal level? Signaal indicatie (Led) Liefst met reeds aanwezige componenten OpAmp NE 567 Signal Input select TTL PIC 16F88 On/offl Key ICP Serial 21 Schema PIC schakeling Lex Peters - PE1CVJ Schema is getekend met ExpressPCB CAD software die gratis gebruikt kan worden om schema’s te tekenen maar ook om printen te ontwerpen en deze ontwerpen electronisch te laten vervaardigen: http://www.expresspcb.com/ 22 Toondecoder met NE567 Lex Peters - PE1CVJ Uit datasheet LM567 Maar eerst het gebied analyseren dat we willen gaan automatiseren…..…. 23 Analyse van het morse signaal Lex Peters - PE1CVJ De puzzel…. • • • • • Een letter in morse bestaat uit maximaal 6 tekens in de vorm van signalen ‘kort’ en ‘lang’ De tijdsduur van ‘lang’ is 3 maal die van ‘kort’ De tijdsduur tussen de tekens is gelijk aan de tijdsduur van ‘kort’ Het einde van een letter wordt aangegeven doordat de tijdsduur tussen 2 signalen (tekens) niet 1 maal maar 3 maar de lengte van ‘kort’ is Het einde van een woord wordt aangegeven met een tijdsduur tussen 2 tekens van 7 maal de duur van ‘kort’ Kort samengevat voor de techneuten…. F .. - . t t t t 3t t t Einde letter 3t Einde woord 7t 24 Bepalen woorden per minuut Definitie en berekening: • • • • • • De norm voor het aantal woorden per minuut is bepaald aan de hand van het aantal keer dat het woord ‘PARIS’ in 1 minuut kan worden geseind (1 maal = 50t) Het gaat er dus om om de waarde van t te bepalen (= de tijdseenheid van ‘kort’) Een snelheid van 12 WPM betekent dus dat PARIS 12 maal in 60 sec. (1 minuut) wordt geseind Dus 1 maal PARIS seinen duurt dus 5 sec. Dat is gelijk aan 50t dus: t = 5/50, is 0,1 sec = 100 mSec Vanuit de gemeten duur van een ‘punt’ (t in sec) kun je dus berekenen dat: WPM = 60/(t*50) • WPM = 60000/(t*50) = 1200/t (in mSec) P .- -. ..-. .. ... Lex Peters - PE1CVJ t A t 3t 3t t 3t 3t t 3t =14t =8t t t 3t =10t Einde letter t t t S t Einde letter t I 3t Einde letter t t R t Einde letter 3t =6t Einde woord t t t t t 7t =12t =50t 25 Programma opzet Lex Peters - PE1CVJ Start nee Signaal hoog Display letter Ja Meet signaaltijd hoog Einde woord? Meet signaaltijd laag Einde letter? nee nee Ja Ja Display spatie 26 Opbouw van een JAL programma Lex Peters - PE1CVJ Programma commentaar inclusief, auteur, versie, datum, compiler etc. (-- of ‘) Specifieke opdrachten voor de compiler om speciale features aan of uit te zetten bv Pragma …. Aangeven welke libraries gebruikt gaan worden: INCLUDE [librarynaam] Declareren van variabelen: VAR [variabele naam] [type] = [waarde] Declareren van constanten: CONST [Constante naam] [type] = [waarde] Definieren van de pin setting: normaal door register setting, met goede library met naam Initieren van gebruikte periferie zoals: • LCD display • Communicatie bus (serieel, USB, I2C etc.) • Etc. Het programme zelf als 1 herhalende lus (loop): Forever Loop • Opdracht 1 • Opdracht 2 • Opdracht 2 • Opdracht n End loop Binnen hoofdprogramma kunnen ook weer loops worden gebruikt: de end loop opdracht heeft altijd betrekking op de laatst gestart loop (LiFo) 27 Documentatie & bibliotheken Het begin van een programma…… Altijd programma documenteren Versie beheer Compiler indicatie Bibliotheken: alle functies die je kunt bedenken kun je in een bibliotheek opslaan en steeds weer gebruiken. Veel is er al!!! De 16F88_bert library is een standaard JAL bibliotheek waarin alle basale zaken voor een specifieke PIC worden ingesteld. De lcd_44780_Lex_4x20_16F88 library bevat Bv aangepaste functies voor een 4*20 LCD display. Commentaar in JAL begint met een quote (‘) of twee streepjes (--) en kan overal geplaatst worden Lex Peters - PE1CVJ --Morse code decoder --- October 2010 -- Version 0.12 -- Author: Lex Peters (PE1CVJ) --- PIC Processor 16F88 -- and 4*20 display -- JAL 2.4 --include 16F88_bert include lcd_44780_Lex_4x20_16F88 28 Constanten en pin settings Constanten: Variabelen die gedurende de loop van het programma niet meer veranderen Lex Peters - PE1CVJ -- Constants Const volatile byte txt_disp10[] ="PE1CVJ CW Decoder " Const volatile byte txt_disp11[] ="Initialising ......." Const volatile byte txt_disp12[] ="Version 0.12 ......." Const volatile byte txt_disp2[] ="WPM: " Const volatile byte txt_disp3[] ="mSec: " Aparte constante: gebruikt als tabel: Morse tekens worden omgezet in byte Waarde byte is gelijk positie tabel Met deze positie kan de bijbehorende letter worden opgehaald Volatile (zeker stellen van een vaste plek) Const volatile byte LtrDisp[] = “ *TEMNAIOGKDWRUS**QZYCXBJP*L*FVH09*8***7*(;**/=61*******2***3*45*******:****,*****)***********-**'***@****.********?************“ 0....5....1....5....2....5....3....5....4....5....5....5....6....5....7....5....8....5....9....5....1....5....1....5....2....5.7 Pin setting: LEDje aansturen met poort b1 Lezen hoog/laag op poort b4 -- pin setting -- B1 for switching the LED (pin 7) -- B4 to read the morse signal (pin 10) pin_b1_direction = output pin_b4_direction = input 29 Variabelen I Type variabelen: Bit (0 of 1) Byte (8 bits) Word (16 bits) Logisch (0 of 1) Array (tabel met plaatsindex) Posities (bit) van een variabele van het type Byte Let op bij rekenen met variabelen: het type moet de uitkomst of tussenwaarde wel kunnen bevatten! Lex Peters - PE1CVJ -- variables var byte H_Pointer var byte Teller_t var byte Teller_q var byte FouteMeting = 0 -- Unit time op 100 standaard bij start uitgaande van 1 punt 100 mSec -- bij 12 WPM -- Standaard 80 msec is ingeveer 15 WPM var word AvgUnitTime = 80 var volatile byte LetterCode var byte LetterPos var volatile byte HLetterCode -- wordt 1 als einde letter wordt geconstateerd var byte EoL -- wordt 1 als einde woord wordt geconstateerd var byte EoW -- var byte CWspeed -- In de even plekken van "InputBuffer" worden de tijden hoog gemeten -- in de oneven de tijden laag var volatile word InputBuffer[12] var volatile bit DashDot at LetterCode:0 Variabelen eerst var byte TimeRatio definieren voor je ze var byte TxtLine[20] kunt gebruiken! var byte WPM 30 Variabelen II Soms wil je maar 1 bit bekijken van een byte (8bits) Als je zeker hebt gesteld dat de byte variable op een vaste plek staat kun je ook iedere bit ervan een naam geven (alias) Doordat het programma nog in een experimenteel stadium verkeert, zijn er veel extra variabelen gedefinieerd om allerlei zaken te meten, vast te leggen of te displayen. Als alles uiteindelijk werkt kunnen deze weer worden verwijderd. Lex Peters - PE1CVJ -- mechaniek voor HighByte en LowByte splitsing Word var volatile word WordValue var volatile byte FW[2] at WordValue var volatile byte HB = FW[1] var volatile byte LB = FW[0] -var byte bbx var byte NrDashDots var word NrTimeUnits Var word SumHighTimes var volatile bit hbb0 at hlettercode:0 var volatile bit bb0 at lettercode:0 var volatile bit bb1 at lettercode:1 var volatile bit bb2 at lettercode:2 var volatile bit bb3 at lettercode:3 var volatile bit bb4 at lettercode:4 var volatile bit bb5 at lettercode:5 var volatile bit bb6 at lettercode:6 var volatile bit bb7 at lettercode:7 Volatile (zeker stellen van een vaste plek) 31 Meten van kort en lang Binnen doorlopende loop (loop forever): Wachten op hoog signaal, Meet de tijdsduur per mSec In “Inputbuffer” op de positie van het ontvangen teken (even) Daarna tijdsduur laag signaal (oneven) meten. Bepaal of het gaat om: • End of Letter (E0L) en/of • End of Word (EoW) zo niet wachten op volgende teken Voor het visuele aspect wordt het Ledje uit en aan gezet bij hoog/laag signaal. Als het hoog signaal korter is dan realistische tijd dan stoorpuls! Let op: wordt alleen uitgevoerd indien meting correct is (IF statement) Lex Peters - PE1CVJ -- measure high time (CW key pushed) LED gaat uit FouteMeting = 0 while pin_b4 == 1 loop pin_b1=0 InputBuffer[H_pointer] = InputBuffer[H_Pointer] + 1 delay_1ms(1) end loop if InputBuffer[H_Pointer] < 50 then FouteMeting = 1 end if pin_b1=0 If FouteMeting == 0 then -- measure low time: LED gaat aan while ((pin_b4 == 0) & (word(InputBuffer[H_Pointer+1]) <= 1400)) loop pin_b1=1 InputBuffer[H_Pointer+1] = InputBuffer[H_Pointer+1] + 1 delay_1ms(1) end loop -- End of Word? (EOW) indien laag meer dan 5 maal de unit time If InputBuffer[H_Pointer + 1] >= (7 * word(AvgUnitTime)) then EoW = 1 EoL = 1 end if -- End of Letter? (EoL) indien laagtijd meer dan 3 maal de unit time if inputbuffer[H_Pointer + 1] >= (3 * word(AvgUnitTime)) then EoL = 1 end if 32 LetterCode opbouwen In de byte (8 bits) “LetterCode” worden de morsetekens omgezet in 1 (kort) en 0 (lang). Om nu duidelijk te maken dat het om lang gaat en niet om voorloop nullen, begint de waarde altijd met een 1. Na elk teken wordt dat teken (bit) links “in de byte geschoven” waardoor de 1 altijd het begin aangeeft. Een letter of leesteken kan maar maximaal 6 morse tekens bevatten dus de byte zal meer dan 7 relevante bits bevatten dus maximaal waarde 127 krijgen. Als de letter geheel ontvangen is kan de letter representatie uit de tabel worden opgehaalden weergegeven via de procedure ‘ShowLetter’ Lex Peters - PE1CVJ -- Al 6 morse tekens bereikt? H_pointer begint bij 0 en loopt per 2 op if H_Pointer == 10 then EoL = 1 end if LetterCode = LetterCode << 1 TimeRatio = word(InputBuffer[H_pointer]) / word(AvgUnitTime) If TimeRatio < 2 then DashDot = 1 NrTimeUnits = NrTimeUnits + 1 Else DashDot = 0 NrTimeUnits = NrTimeUnits + 3 end if SumHighTimes = Word(SumHighTimes) + word(InputBuffer[H_Pointer]) -- increment inputbuffer pointer (= 2 maal morse teken counter) -- on forehand H_Pointer = H_pointer + 2 if EoL == 1 then Showletter 33 Bepalen WPM Lex Peters - PE1CVJ -- Bepalen WPM, schonen en display WPM ----------------------- De gemiddelde tijdseenheid kort (t) in mSec is bepaald en daarmee kan worden bepaald wat de woordsnelheid per minuut is (WPM, zie formule voorgaande sheets) Deze wordt vervolgens op positie 5 van eerste regel (aangeduid als 0) op het display weergegeven. Als extra wordt de gedecodeerde morse letter ook als byte binair weergeven om te kunnen controleren of e.e.a. goed werkt. Deze routine wordt nog omgebouwd om de gedecodeerde letter grafisch weer te geven in punten en strepen. Omdat we met een nieuwe letter gaan beginnen wordt de InputBuffer weer leeg gemaakt. WPM = word(60000 / (50 * word(WordValue))) for 3 using Teller_t loop lcd_char_Line_pos(" ",0,(5 + Teller_t)) end loop lcd_num_line_pos(wpm,0,5) -- Display binary the morse lettercode found --------------------BBx = 48 + bb7 lcd_char_line_pos(BBx,1,0) BBx = 48 + BB6 lcd_char_line_pos(BBx,1,1) BBx = 48 + BB5 lcd_char_line_pos(BBx,1,2) BBx = 48 + BB4 lcd_char_line_pos(BBx,1,3) BBx = 48 + BB3 lcd_char_line_pos(BBx,1,4) BBx = 48 + BB2 lcd_char_line_pos(BBx,1,5) BBx = 48 + BB1 lcd_char_line_pos(BBx,1,6) BBx = 48 + BB0 lcd_char_line_pos(BBx,1,7) ClearInputBuffer 34 Procedures Instructies die vaak herhaald worden kun je in een z.g. procedure zetten die je willekeurig kunt aanroepen. Procedure ShowLetter plaatst de letter op het display en in de line buffer. De letter zelf wordt op basis van de waarde van de variable LetterCode opgehaald uit de Constante tabel LtrDispl Als de Linebuffer vol is wordt de hele regel 4 naar regel 3 geplaatst en wordt weer verder gegaan op een lege regel 4 (4*20 display) Regels 1 en 2 (0 en 1 in het programma) worden gebruikt voor meet informatie gedurende de ontwikkeling. Procedure ClearInputBuffer maakt de collectie tabel InputBuffer leeg die de gemeten tijdwaarden vastlegt (hoog en laag) per morse teken. Lex Peters - PE1CVJ procedure ShowLetter is if LetterPos < 20 then lcd_char_line_pos(LtrDisp[LetterCode],3,LetterPos) TxtLine[LetterPos] = LtrDisp[LetterCode] LetterPos = LetterPos + 1 Else lcd_clear_line(2) Teller_q = 0 for 20 using Teller_q loop lcd_char_line_pos(TxtLine[Teller_q],2,Teller_q) end loop Teller_q = 0 for 20 using Teller_q loop TxtLine[Teller_q] = " " end loop lcd_clear_line(3) LetterPos = 0 lcd_char_line_pos(LtrDisp[LetterCode],3,LetterPos) TxtLine[LetterPos] = LtrDisp[LetterCode] LetterPos = LetterPos + 1 end if end procedure procedure ClearInputBuffer is Teller_q = 0 for 12 using Teller_q loop InputBuffer[Teller_q] = 0 end loop end procedure 35 Lex Peters - PE1CVJ Een overzicht van relevante PIC info 36 PIC Leveranciers / gebruikersgroep Lex Peters - PE1CVJ Microchip is de fabrikant van de PIC Microprocessor. Je kunt op deze site alle datasheets vinden. Pas wel op de grootte voor je gaat printen: sommigens zijn enkel honderden bladzijden. Vanaf deze site kan ook de complete gratis assembler suite worden gedownload van Microchip: MPLAB. http://www.microchip.com/ Van Ooijen Technische Informatica Wouter van Ooijen is de initiator van JAL. Hij heeft een eigen web winkel opgezet en verkoopt daar o.a. PIC processoren maar ook de de bekende WISP 648 PIC programmer, gebouwd en als bouwpakket. http://www.voti.nl/ http://www.voti.nl/wisp648/ De JAL gebruikersgroep is eigenlijk de belangrijkste bron van informatie en vernieuwing (http://code.google.com/p/jallib/). Er is een manual beschikbaar en op deze site zijn ook veel bibliotheken gepubliseerd. Het manual kan ook worden gedownload via deze site evenals een grote hoeveelheid voorbeeld prograamma’s. JAL valt onder de open source agreement waarvan de voorwaarden ook via deze site zijn te bekijken. Iedereen kan lid worden van de community en een account aanvragen. De firma MikroElektronika heeft een erg leuke website met online een zeer overzichtelijke beschouwing over de werking van microprocessors in het algemeen en de PIC in het byzonder. http://www.mikroe.com/eng/chapters/view/12/appendix-b-examples/ 37 JAL Boeken en software Lex Peters - PE1CVJ Absoluut 2 erg leuke en duidelijk geschreven boeken over het gebruik van PIC Microprocessoren in de praktijk. Er worden een 50-tal schakelingen / projectjes beschreven die tot een inzicht leiden in de werking van zowel de PIC maar vooral ook in hoe je deze moet programmeren in JAL. Het boek gaat hierbij m.n. uit van de: • 16F877A • 18F4455 Alsmede het gebruik van de gratis JAL compiler en libraries. Er zijn onderdelen pakketten bij VOTI.NL te koop die de benodigde onderdelen voor de experimenten bevatten. Boeken zijn bij o.a. Elektor te bestellen (klik op de links of op de boeken) http://www.elektor.nl/products/books/microcontrollers/pic-microcontrollers.92178.lynkx http://www.elektor.nl/products/books/microcontrollers/50-pic-microcontroller-projecten.1320803.lynkx Op de Elektor site staat een link naar de gratis JAL software die weliswaar bij het boek wordt aangeboden maar vrij kan worden gedownload. Naast een Editor, een compiler en een programmer bevat het een zeer uitgebreide bibliotheek, alle programmaatjes in JAL die in projecten van het boek worden gebruikt en een groot aantal andere handige hulpmiddelen. http://www.elektor.nl/extra/b-50-pic-microcontroller-projecten-voor-beginners.1329852.lynkx JAL Klik voor een directe download van de complete JAL suite van Bert van Dam op het JAL logo. http://www.elektor.nl/Uploads/2010/7/PICdev2.zip 38 Andere handige links Lex Peters - PE1CVJ voor experimenteerboard DEV-08265 en een hoop ander informatie. www.sparkfun.com IC-PROG voor seriële programmer software en een hoop ander informatie. www.ic-prog.com De site van PI4ZLB voor serieele programmer hardware en een hoop leuke zelfbouw projecten met PICs. Kijk bij de projecten sectie. www.pi4zlb.nl Veel documentatie en projecten op de site van Peter Halickey. www.qsl.net/om3cph/counter/counter.html Breadout Heeft opsteekprintje voor 18 pens PIC'S met ICSP www.breadout.nl Canakit, voor USB programmerkit. www.canakit.com/usb-pic-programmer.html David Tait’s PIC archief: www.nomad.ee/PIC/