De PIC Microcontroller

advertisement
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/
Download