Seriel holst
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