Serial hw int cts
Det grundlæggende omkring seriel kommunikation er beskrevet under seriel port.
serial_hw_int_cts.jal
Som de fleste generelle moduler, der er med i jalpack, så bygger det på at man sætter nogle ting op inden man includer filen, og så kan man anvende de procedurer der er i modulet
Softwaren kan noget mere end de andre moduler til seriel kommunikation, specielt fordi modulet implementerer buffere til både sending og modtagelse, og anvender interrupt til at sende og modtage med, så det fungerer mere fleksibelt i anvendelsen end de andre moduler, men det er til gengæld også lidt sværere at sætte op.
Ud over det, så anvender modulet hardware handshake til at styre at der ikke modtages for meget, så der er mulighed for at bremse afsenderen ind til PIC'en, men det kræver så også at hardwaren implementeres og at afsenderen reagerer på det.
Softwaren ligger i jalpack/lib.
Ting der skal sættes op inden include
Her definerer man hvordan der skal kommunikeres.
pin_b5_direction = input -- Define input and output for RX and TX pins
pin_b7_direction = output
alias serial_ctsinv is pin_B4 -- incoming data flow control
pin_B4_direction = output -- data flow control pin is output
var bit serial_overflow_discard = false -- set up transmitter to wait, if transmitbuffer is full
const serial_hw_baudrate = 9600
Pin definitionerne angive hvilken pin der skal modtages på, og hvilken pin der skal sendes på. Dette er processor-afhængigt, så man skal lige forbi databladet for at se hvordan man gør det. Dette eksempel er for en PIC16F690.
CTS benet kan man vælge frit, men man skal huske at sætte det rigtige ben til output.
Overflow_discard kan man sætte til true, hvis programmet ikke må vente i rutinen der sender en byte, men så skal man sikre sig, at man enten ikke sender mere end hvad der kan være i bufferen, eller at man kan tillade sig at miste karakterer, hvis man sender for meget.
Baud-rate (eller bits pr. sekund) kan ikke vælges helt frit. Hvis det sættes for hurtigt, så kan baud-rate registrene ikke sættes præcist nok (afhænger også af clock-hastigheden), og dermed virker modulet ikke. Det kan også blive et problem at nå at hente alle karakterer.
Valgfrie ting i modulet
Der er også ting som modulet selv styrer, hvis man ikke sætter det op, nemlig det der styrer buffer størrelserne
const SERIAL_XMTBUFSIZE = 32 -- size of transmit buffer
const SERIAL_RCVBUFSIZE = 64 -- size of receive buffer
const SERIAL_DELTA = 17 -- spare space receive buffer
De viste værdier er det der sættes op, hvis man ikke gør noget. Man kan vælge at formindske størrelserne hvis man har problemer med at man bruger for meget RAM, eller man kan vælge at forøge størrelserne, hvis man skal kunne håndtere større datamængder.
SERIAL_DELTA er den restplads man ønsker der skal være, når man melder at bufferen ikke kan modtage mere. Det giver lidt ekstra reaktionstid for sendren, så der kan sendes lidt mere, uden der går noget tabt.
Man kan også fravælge at anvende hardware-feedback til senderen om at man ikke kan modtage yderligere. Det gøres ved at man sætter serial_ctsinv op til at være en intern bit, i stedet og at det er en udgang der melder tilbage. Den vil så også miste sin effekt, så den ikke bremser transmissionen fra senderen.
var bit serial_ctsinv -- dummy flow control
Anvendelse af modulet
Når man har sat benene op og defineret baudrate, så skrives blot
-- Opsæning som beskrevet i andet afsnit
include serial_hw_int_cts
serial_hw_init() -- gennemfør opsætningen af UART'en
Dette sætter op, så man kan sende og modtage med den korrekte hastighed.
Herefter kan der sendes og modtages karakterer.
Modtagelse af karakterer
I main-loopet (forever-loopet) kan man modtage karakterer som følger:
if serial_hw_read(temp) then
-- Anvend den modtagne byte temp til noget fornuftigt
end if
Her henter man en byte ud af bufferen, hvis interruptet har lagt noget i den.
Med interruptet og bufferen er der gjort meget for ikke at miste noget i modtagelsen, hvis der kommer flere karakterer i træk. Hvis man f.x. kommunikerer med 1200 Baud vil man kunne vente bufferstørrelsen * 8 ms med at tjekke (ca. ½ sekund ved 64 byte buffer), før man mister bytes. Man skal dog stadig kunne nå at tømme det med samme hastighed som der fyldes i.
Sending af karakterer
Det at sende en karakter er meget simpelt, da man blot skriver
serial_send_byte(char)
Sendingen placerer blot byten i bufferen, og returnerer. Det er så interruptet der sørger for afsendelsen, når der bliver plads til det. Hvis hele bufferen er fyldt, så afhænger det af hvad serial_overflow_discard er sat til. Er den true, så dumpes karakteren, ellers ventes der på at der bliver plads i bufferen.
Begrænset handshake
Den handshake der er etableret i modulet laver kun handshake i den ene retning (den melder tilbage når den ikke kan modtage mere). Hvis den skulle etablere fuld handshake, så skulle den også tage højde for om den enhed der sendes til er klar til at modtage (den anden endes RTS). Det gør modulet som det er i dag ikke - det sender bare.
Sending og modtagelse som Pseudovariable
Der ligger også rutiner der implementerer sending og modtagelse, så det ligner variabler. Det anvendes på følgende måde:
serial_hw_data = Temp -- Sender variablen Temp
Temp = serial_hw_data -- Modtager en byte og placerer den i Temp
-- Gør noget fornuftigt med det modtagne
Temp = serial_hw_data -- Modtager en ny byte og placerer den i Temp
Man skal være opmærksom på at det ikke er normale variabler. Hver gang man læser i variablen, så læses der faktisk en ny byte fra den serielle indgang.
ADVARSEL - programmet standser afviklingen indtil der er modtaget en byte, fordi programmet stiller sig til at vente på der kommer en byte, og den LÅSER hvis der ikke kommer en byte.
Moduler på Holstebro HTX | |||||||
---|---|---|---|---|---|---|---|
Tastaturer | Displays | AD-konvertering | I/O-ekspander | Serielt | Interface | Færdige | Andre |
RC-tast - AD-tast - M_tast | ALCD - LCD | ADC_holst - ADC mcp3201 - mcp3208 |
input - output | Seriel_holst - Serial hardware Serial hw int cts - Serial software |
Stepmotor - RFID RGB - RF-link - Afstand |
Humidity - Analog temp - Dig temp Accelerometer |
Rotary Encoder |
Oversigt over Hardware Moduler på Holstebro HTX