Seriel holst

Fra Holstebro HTX Wiki
Skift til: navigering, søgning

Det grundlæggende omkring seriel kommunikation er beskrevet under seriel port.

serial_holst.jal og resten af modulet

Som alle andre moduler lavet på Holstebro HTX, så består softwaren af 3 filer:

  • Selve softwaren der udfører det hårde arbejde. Den skal der ikke rettes i - placeres i /jalpack/lib/.
  • Pin definitioner m.v. Her defineres hvilke pins og hvilken Baudrate modulet skal anvende - redigeres til det enkelte projekt, og placeres derfor i projektmappen.
  • En demofil der anvender modulet, og kort illustrerer funktionerne i det

Softwaren til modulet kan hentes i denne fil.

serial_pin.jal

Dette er filen der definerer hvordan der skal kommunikeres.

alias     ser_rx_pin    is pin_a5      -- Serial Receive pin
alias     ser_tx_pin    is pin_a4      -- Serial Transmit pin
--  Remember to set up the direction pins as well - MUST correspond to rx and tx pins
alias     ser_rx_dir    is pin_a5_direction
alias     ser_tx_dir    is pin_a4_direction

const BAUD_RATE = 2400

Pin definitionerne angive hvilken pin der skal modtages på, og hvilken pin der skal sendes på. Dette kan vælges helt frit. Man skal blot huske også at rette direction benene til, så de afspejler de valgte pins. Ellers virker den automatiske opsætning ikke.

Baud-rate (eller bits pr. sekund) kan ikke vælges helt frit. Hvis det sættes for hurtigt, så kan processoren ikke følge med til alle de interrupts der skal serviceres, og dermed virker modulet ikke (og det vil sløve resten af softwaren ned).

Baudrate 4 MHz Clock 8 MHz Clock
300 Fungerer Fungerer
600 Fungerer Fungerer
1200 Virker bedst hvis det der sendes til den sendes med 2 stop-bit Fungerer
2400 Kan modtage enkeltkaraktere, og kan transmittere ubegrænset Virker bedst hvis det der sendes til den sendes med 2 stop-bit
4800 ikke implementeret Kan modtage enkeltkaraktere, og kan transmittere ubegrænset

Anvendelse af modulet

For at anvende modulet placerer man serial_pin.jal sammen med sin kode, og laver de fornødne rettelser i den.

Herefter skrives blot

include serial_holst

Dette sætter de to pins op til input og putput, og TRM0 klagøres så interruptet kører med den korrekte hastighed.

Herefter kan der sendes og modtages karakterer.

Modtagelse af karakterer

I mail-loopet (forever-loopet) kan man undersøge om der er modtaget en karakter, og hvis karakteren er modtaget, så kan den hentes. Det kan i koden se ud som følger:

   if ser_get_byte(temp) then
      -- temp indeholder det modtagne, hvis der returneres med true
      -- Anvend den modtagne byte til noget fornuftigt
   end if

Det er vigtigt at der tjekkes ofte i koden og få hentet den karakter der er modtaget, hvis der kan komme flere karakterer i træk. Hvis man f.x. kommunikerer med 1200 Baud vil en karakter være ca. 8 ms lang. og hvis den foregående karakter ikke er hentet, så vil den næste karakter overskrive den, så der mistes en karakter.

Hvis ser_get_byte(char) returnerer false, altså når der ikke er kommet en karakter, så vil den returnere 0 i parameteren

Sending af karakterer

Det at sende en karakter er meget simpelt, da man blot skriver

   ser_send_byte(char)

Hvis interruptet er i gang med at sende en karakter, så venter proceduren blot på at den bliver færdig, inden den næste karakter sendes, så man skal være opmærksom på i sin kode, at proceduren kan tage noget tid.

Princippet bag modtagelse og sending

Princippet bag modtagelsen bygger på et tids-interrupt, der kommer 4 gange så hurtigt som bit-raten.

Når man modtager en startbit, så synkroniseres således at man ved hvor man burde være i et bit-forløb (state 0 til 3). I startbitten registrerer man om der stadig er startbit i 1 og 2, og hvis der er det, så fortsætter modtagelsen.

I resten af modtagelsen ser man ikke på hvad man modtager i state 0 og 3, da en lille variation vil kunne få disse tidspunkter ind i den foregående bit eller den næste bit.

Man registrerer derimod hvad man modtager i state 1, og læser det ind, og i state 2 ser man på om det er det samme som man modtog i state 1. Hvis det man modtager er forskelligt, så forkastes modtagelsen. Dette princip er ikke 100% vandtæt, men det sikrer at det man modtager kan tolkes med den ønskede bit-rate.

Sendingen er mere simpel, da man ved hvad man skal sende. Det eneste specielle der er at bemærke, er at sendingen foretages i state 0, så den tidsmæssige belastning i interruptet fordeles mellem modtagelse og sending.

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:

   ser_holst_data = Temp  -- Sender variablen Temp
   Temp = ser_holst_data  -- Modtager en byte og placerer den i Temp
   -- Gør noget fornuftigt med det modtagne
   Temp = ser_holst_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, for 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