Serial hw int cts

Fra HTX Arduino
Spring til navigation Spring til søgning

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.

Logik Begreber
Gates AND-gate - OR-gate - NOT-gate - NAND-gate - NOR-gate - XOR-gate - XNOR-gate - Inverter-gate - Schmitt-trigger
Flip-flop RS-flip-flop - D-flip-flop - JK-flip-flop - Latch - Toggle-flip-flop
Sekventiel logik Flip-flop - Multivibrator - Astabil Multivibrator - Monostabil Multivibrator - Digital tæller - Binær counter - BCD-counter - Skifteregister - Bistabil Multivibrator
Logiske grundbegreber Kombinatorisk logik - Binære tal - Hexadecimal - BCD - Talsystemer - Sandhedstabel - Pull-down - Pull-up - 7-segment-display - Binær Adder - Binær comperator - Logisk Dekoder - HEX-fil
Logisk Reduktion Boolesk Algebra - De Morgan - Karnaughkort - Karnaughkort udlæsning - Automatisk reduktion
Hukommelse RAM - ROM - PROM - EPROM - EEPROM
Logik-familier CMOS-logik - TTL-logik
Seriel Kommunikation Arduino Bluetooth - Baud - Handshake - I2C - I2C Adresser - I2C Bus - I2C Generelt - RS-232 - Serial hardware - Serial hw int cts - Serial software - Seriel port - UART
Generelt Digital-bogen - Digitale Input - Konverter - PWM - Schmitt-trigger - Simulering - Pulsplaner


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