De PIC Microcontroller Wat is het en wat kun je er mee?
November 2010, v0.9
1
Lex Peters - PE1CVJ
Dick Bronsdijk PA3HBS
Lex Peters PE1CVJ
Ben Emons PB2BN
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
2
“Peripheral Interface Controller”
Achtergrond en basale werking
3
Lex Peters - PE1CVJ
Waarom een microcontroller? Lex Peters - PE1CVJ
4
• 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, 1-wire 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 !!!!
Waarom de PIC van Microchip? (er zijn nog zoveel andere typen)
Lex Peters - PE1CVJ
5
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……….;-)
Architectuur & funkties I Lex Peters - PE1CVJ
6
Voorbeeld: PIC16F887 Block Diagram 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
Schema uit webcursus van MikroElektronika
Een microcontroller bevat dus veel meer dan alleen een processor!!
Architectuur & funkties II Lex Peters - PE1CVJ
7
Schema uit webcursus van MikroElektronika
Von Neuman architectuur (zoals in de PC)
Harvard architectuur (zoals in de PIC)
• Voordeel: 1 soort memory, makkelijk uitbreidbaar
• Nadeel: zelfde bus voor data en instructies (dus langzamer)
• Focus: data processing
• 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 ;-)
Instructies en registers Lex Peters - PE1CVJ
8
Schema uit webcursus van MikroElektronika
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.
Assembler vs high level taal Lex Peters - PE1CVJ
9
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
Nodig om te starten…. Lex Peters - PE1CVJ
10
9-16 V …………………………………….of ……………………………..5 V apart
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
I/O via Display of VT52
In-circuit Prog + Serieel
PC + Software
Interface Bread board
LCD Display
Basale PIC aansluitingen Lex Peters - PE1CVJ
11
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
+
+ -
-
- : Vss
-
+ : Vdd +
Een simpel project in assembler Lex Peters - PE1CVJ
12
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.
+ -
De 16F88 nader bekeken Lex Peters - PE1CVJ
13
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
+ -
Voorbeeldproject Assembler I Lex Peters - PE1CVJ
14
; 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
Start clrf STATUS ;Initialize ports A and B
banksel PORTA
clrf PORTA ;Set port A0 as digital input.
banksel ANSEL
movlw 0x00
movwf ANSEL
movlw b'00000001'
movwf TRISA
clrf PORTB ;Set port B0 as digital output.
movlw b'11111110'
movwf TRISB
BCF STATUS,RP0 ;Select REGISTER BANK 0
; Program
TEST BTFSS PORTA,0 ;Test switch for ON/OFF
GOTO RESET
BSF PORTB,0 ;Set LED 1 ON
GOTO RESULT
RESET BCF PORTB,0 ;Set LED 1 OFF
RESULT GOTO TEST
END
; Instructionset for PIC 16F88 can be found in :
;
; "8-bit CMOS Flash/EEPROM Microcontrollers PIC 16F88"
+
+
-
-
470
1K
S1
Bepaal of S1 wordt gesloten (poort RA0 – input) en laat dan LED D1 branden (poort RB0 - output)
D1
Oscillator etc. even weggelaten in dit voorbeeld
Voorbeeldproject Assembler II Lex Peters - PE1CVJ
15
; 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
Voorbeeldproject Assembler III Lex Peters - PE1CVJ
16
Start clrf STATUS ;Initialize ports A and B
banksel PORTA
clrf PORTA ;Set port A0 as digital input.
banksel ANSEL
movlw 0x00
movwf ANSEL
movlw b'00000001'
movwf TRISA
clrf PORTB ;Set port B0 as digital output.
movlw b'11111110'
movwf TRISB
BCF STATUS,RP0 ;Select REGISTER BANK 0
; Program
TEST BTFSS PORTA,0 ;Test switch for ON/OFF
GOTO RESET
BSF PORTB,0 ;Set LED 1 ON
GOTO RESULT
RESET BCF PORTB,0 ;Set LED 1 OFF
RESULT GOTO TEST
END
PIC programmers Lex Peters - PE1CVJ
17
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
Overige hulpmiddelen Lex Peters - PE1CVJ
18
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.
Zelf een morse decoder ontwerpen o.b.v. de PIC 16F88 met
de high level programmeertaal JAL (Just Another Language)
19
Lex Peters - PE1CVJ
Project ontwerp
20
Wensenlijstje • Ingangsignaal schakelbaar
• Lijn signaal • Microfoon ingebouwd • Keyer
• Signaal hoorbaar (aan/uit schakelbaar)
• In-Circuit Programmeren mogelijk • Seriëele communicatie mogelijk • LCD display
• Gedecodeerde tekst • Woorden per minuut (WPM) • Iets over kwaliteit • Ingangssignaal level?
• Signaal indicatie (Led) • Liefst met reeds aanwezige
componenten
PIC 16F88
NE 567
Micr
Line-in
Tone Decoder
Key
Input select
OpAmp
Max. 200 mV
TTL
LCD 4x20 44780 compatible
ICP Serial
Signal
On/offl
Principe schema
Lex Peters - PE1CVJ
Audio-in
Schema PIC schakeling
21
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/
Toondecoder met NE567
22
Lex Peters - PE1CVJ
Maar eerst het gebied analyseren dat we willen gaan automatiseren…..….
Uit datasheet LM567
Analyse van het morse signaal
. . - . t t 3t 3t
F Einde letter
7t
Einde woord
23
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….
Lex Peters - PE1CVJ
t t t t
Bepalen woorden per minuut . - - . t t t 3t
P Einde letter
7t
Einde woord
24
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)
Lex Peters - PE1CVJ
3t 3t t t =14t
3t
A Einde letter
3t t =8t t
3t
R Einde letter
3t =10t t t t t
3t
I Einde letter
t t =6t t
S t t =12t t t t
=50t
. -
. - .
. .
. . .
Programma opzet
Meet signaaltijd hoog
Signaalhoog
Meet signaaltijd laag
Einde letter?
Ja
nee
nee
Display letter
Einde woord?
Display spatie
Start
Ja
Ja
nee
25
Lex Peters - PE1CVJ
Opbouw van een JAL programma
26
Lex Peters - PE1CVJ
Programma commentaar inclusief, auteur, versie, datum, compiler etc. (-- of ‘)
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)
Specifieke opdrachten voor de compiler om speciale features aan of uit te zetten bv Pragma ….
Documentatie & bibliotheken
27
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
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
Het begin van een programma……
Constanten en pin settings
28
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
-- 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
Pin setting: LEDje aansturen met poort b1 Lezen hoog/laag op poort b4
Constanten: Variabelen die gedurende de loop van het programma niet meer veranderen
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
Volatile (zeker stellen van een vaste plek)
Variabelen I
29
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 var byte TimeRatio var byte TxtLine[20] var byte WPM
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!
Variabelen eerst definieren voor je ze kunt gebruiken!
Variabelen II
30
Lex Peters - PE1CVJ
Soms wil je maar 1 bit bekijken van een byte (8-bits) 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.
-- 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)
Meten van kort en lang
31
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
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)
LetterCode opbouwen
32
Lex Peters - PE1CVJ
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’
-- 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
Bepalen WPM
33
Lex Peters - PE1CVJ
-- Bepalen WPM, schonen en display WPM ----------------------- 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
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.
Procedures
34
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
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.
Een overzicht van relevante PIC info
35
Lex Peters - PE1CVJ
PIC Leveranciers / gebruikersgroep Lex Peters - PE1CVJ
36
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/
JAL Boeken en software Lex Peters - PE1CVJ
37
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
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
JAL
Andere handige links Lex Peters - PE1CVJ
38
David Tait’s PIC archief: www.nomad.ee/PIC/
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
Top Related