JAL

Fra Kommunikation-IT Holstebro HTX
(Omdirigeret fra Kategori:JAL)
Skift til: navigering, søgning

JAL er et sprog til PIC Microcontrollers, og som det er beskrevet her på siden, så er det ud fra cascadeyork.com, der er en side der forsøger at holde styr på udviklingen af open source JAL.

Hvordan defineres Input / Output i JAL?

Output og input defineres i JAL på denne måde

 portb_direction = all_output 
 pin_a0_direction = input 
 pin_a1_direction = input 
 pin_a2_direction = output

Dette er blot et grundlæggende eksempel på hvordan man skriver det.

Mere grundlæggende om definition af Input/Output

PIC16F684 som vi arbejder med har 12 input/output (I/O). Man kan gennem JAL bestemme hvilken funktion de skal tildeles. Dette gælder generelt for alle PIC-typer, bortset fra at der er forskelligt antal programmerbare ben, og de kan have forskellige egenskaber.

Som standard er all pin input, men dette kan man ændre på tre forskellige måder:

  • pin_a0_direction, pin_a4_direction, pin_c0_direction, pin_c7_direction (bits)
  • porta_direction, portc_direction (bytes)
  • porta_low_direction, porta_high_direction, portc_low_direction, portc_high_direction

(nibbles, hvilket er 4 bit)

Dette er igen for en PIC16F684. Andre PIC-typer har andre antal ben i portene og andre navne i portene. Det skal man finde ud af i databladet.

De følgende konstaner skal bruges efterfølgende til at ændre input/output:

  • input, output (for bits)
  • all_input, all_output (for nibbles and bytes)

Eks. man ønsker kun at en pin skal fungere som et input:

 pin_c4_direction = input

Eks. man ønsker at alle pin på en side af PIC’en skal være output:

 porta_direction = all_output

Hvordan arbejder man med Input / Output i JAL?

Dette er et eksempel på hvordan man kan bruge input og output i JAL

 if ! pin_a0 then
  pin_a2 = on
 end if
 if ! pin_a1 then
  pin_a2 = off
 end if

Fejlmuligheder ved arbejde med input/output i JAL

Disse definitioner får betydning for, hvad man rent praktisk kan lave. Man kan ikke vha. programmet styre om et ben, der er defineret til input, skal være high eller low. Her et eksempel som ikke går (pin a4 er defineret til input):

 porta_direction = all_input
 portc_direction = all_output
 
 if pin_a3 then
   pin_a4 = high
 end if

Det ovenstående siger at hvis a3 er high så skal a4 også være high. Dette går ikke da a4 er et input og derfor ikke styres af PIC’en. Dette kan til gengæld gøres, hvis man brugte c4 der er defineret til output. For så styrer PIC’en hvilken tilstand c4 er i.

Ved output skal man til gengæld være opmærksom på, at man nok ikke skal prøve at styre dem udefra. Fx er det nok en dum ide at stelle et output, for hvad så hvis outputtet skal være højt på et tidspunkt? Til gengæld vil man godt kunne styre et andet ben på PIC’en ved hjælp af et output. Fx vil det ovenstående godt kunne fungere, hvis både a3 og a4 er output, lige bortset fra at a3 ikke kan være output på en PIC16F684.

Program-strukturer i JAL

Som de fleste andre sprog har JAL de gængse programstrukturer, samt nogle enkelte der er specielle for JAL.

Sprog-strukturen i JAL er ikke så kompliceret som i andre sprog. JAL er “free-format” (undtagen kommentarer) er sproget er ikke ”case-sensitive”. Det betyder at følgende eksempler er ens:

 if a > b then
   ; Her lægger vi sammen
   a = b + 1
 else
   -- Her trækker vi fra
   a = b - 1
 end if

er det samme som

 IF A > b then a = b + 1 ELSE a = B - 1 END if

Men hvis man skriver kommentarer fortsætter kommentarerne altid linjen ud. Kommentarerne startes desuden med enten ” ; ” eller ” -- ”.

JAL er også bygget op af forskellige blok strukturer. Hvis man for eksempel laver en ”if” statement slutter den ikke inden man har sluttet den ved ”end if”, det samme gælder ved en ”forever loop” er heller ikke slutter inden ”end loop”.

JAL kan håndterer IF, hvor den også har ELSE og en lidt speciel konstruktion med ELSIF, men det giver faktisk sig selv.

I mange tilfælde er det en fordel at kunne bruge en CASE, det er mere elegant i sprogstrukturen og den er også mere effektiv, hvis den bruges rigtigt.

Der er 4 forskellige loops. Den traditionelle FOR kører et specificeret antal gange, en WHILE fortsætter så længe en betingelse er opfyldt, og det gør en REPEAT også, bare med den forskel, at den altid kommer igennem første gang. Endelig er der en lidt speciel struktur der hedder FOREVER, som vel siger sig selv, men som er ret nødvendig, når et program skal fortsætte så længe der er strøm til PIC-en.

En lidt overflødig struktur er en BLOCK der blot angiver at en kodedel hører sammen.

For at opdele og optimere sin kode kan man også anvende PROCEDURE og FUNCTION der gør at man kan kalde et stykke kode fra forskellige steder og få udført det man ønsker, evt. i forhold til en parameter man sender med, en i en FUNCTION kan man også få en returværdi tilbage fra funktionen.

Hvorfor bruger man forever-loop?

Et forever-loop sørger for, at en række definerede procedurer eller funktioner bliver ved med at køre i en unendelighed. I denne opgave indgår der også et forever-loop, der kører så længe boardet er tilsluttet en strømforsyning eller computer.

Hvad er en variabel?

En variabel kan betegnes som en ”kasse” man kan lægge en værdi i. Man kan lægge en værdi i ”kassen”, altså tildele variablen en værdi. Derudover kan man også ”tage” en ting fra ”kassen”, altså trække en værdi ud af en variabel.

Man kan erklære en byte-variabel for volatile og derved beskytte dens indhold mod compileren som godt kan ændre på indholdet af variabler for at slette unødig kode.

Hvilke typer variabler har man i JAL?

Når man opbygger et program i JAL er det vigtigt at have styr på hvilke variabel-typer man anvender, da programmets opførsel kan afhænge kraftigt af hvilke variabler man vælger at anvende.

Bit. Kan være høj eller lav (1 eller 0).
Byte. Indeholder 8 bit binært nummer, hvorved den kan indeholde numre fra 0 til 255.
SByte. Indeholder 8 bit binært nummer med fortegn, hvorved den kan indeholde numre fra -128 til 127.
Word Indeholder 16 bit binært nummer, hvorved den kan indeholde numre fra 0 til 65.535
SWord Indeholder 16 bit binært nummer med fortegn, hvorved den kan indeholde numre fra -32.768 til 32.767
DWord Indeholder 32 bit binært nummer, hvorved den kan indeholde numre fra 0 til 4.294.967.295
SDWord Indeholder 32 bit binært nummer med fortegn, hvorved den kan indeholde numre fra -2.147.483.648 til 2.147.483.647

Ud over det kan man arrangere bytes og words i arrays som f.x.

 var byte arr [5] = {1, 2, 4, 8, 16}

Man skal dog være opmærksom på at man i en PIC16F684 kun har 128 byte RAM at bruge af.

Hvordan fungerer procedurer og funktioner i JAL?

Et eksempel på en procedure, kunne være følgende kode:

delay_100ms(5)

Koden stammer fra PIC-start.hex. Koden laver en forsinkelse (delay) på 100ms. Tallet i parentesen, i dette tilfælde 5, bestemmer hvor mange gange 100ms forsinkelse der skal være. I dette tilfælde bliver forsinkelsen derfor 500ms, eller et ½ sekund.

En procedure er en handling man har lagt en kode for. Vi kan sende en eller flere værdi(er) til proceduren, og så gør proceduren med værdien/værdierne, som man har programmeret den til. Så gør den sådan set ikke mere med værdien.

En funktion er sådan set det samme som en procedure, men der er bare en retur værdi i den. Værdien den har behandlet sender den så tilbage igen. Det betyder at der er en variabel-type på en funktion.

Hvordan kan man regne i JAL?

I JAL kan man regne med +, -, x og /, samt mange andre funktioner. Eksempler herunder.

 var byte g
 var byte X = 20
 
 g = X + 5     -- g bliver til 25
 g = X - 5     -- g bliver til 15
 g = X * 5     -- g bliver til 100
 g = X / 5     -- g bliver til 4

Der er flere forskellige regnearter i JAL

Hvilke begrænsninger er der når man skal regne noget i JAL?

JAL kan ikke regne med kommatal. Den runder altid ned til nærmest heltal. Så hvis man siger 5/2 som giver 2,5, så vil JAL regne det som 2.

En anden begrænsning er at man kun har 8 bit i en byte. Dvs. at vi kun kan have 255 numre. Dvs at hvis du ligger 200 sammen med 200, så smider den 256 numre væk.

Begrænsningen hænger meget sammen med de variabel-typer der er i JAL

Hvordan håndterer man konstanter i JAL?

Der findes 4 forskellige konstanter i JAL. Den ene type er dem der følger byte.

 const byte maximum = 99

Den anden kaldes en bit konstant,

 const bit ppp = false

Den tredje har egentlig ikke et navn men det er en definition. Det er en compile timet definition. Den sidstnævnte forsvinder under omskrivningen til maskinkode (compiling).

 const Baud_Rate = 9600

Det sidste eksempel på en konstant er nogle der hænger sammen med selve compileringen. Sidst nævnte type herunder:

 pragma target clock 4_000_000

Hvordan håndteres include-filer – hvad er formålet?

Include håndteres på den måde at man kan bruge det til at få komponenter og moduler ind i sit dokument/programmering. Et eksempel kan være hvor man includer modulet delay.

 include delay

Tid i JAL

Man kan blandt andet inkludere delay-funktionerne. Herunder ses de forskellige funktioner.

 delay_1us()
 delay_2us()
 delay_3us()
 delay_4us()
 delay_5us()
 delay_6us()
 delay_7us()
 delay_8us()
 delay_9us()
 delay_10us(x)
 delay_1ms(x)
 delay_100ms(x)
 delay_1s(x)

Man skal dog være opmærksom på at alt andet kode også tager tid i JAL, og at det endda kan tage forskellig tid, alt efter hvad koden laver (if-delen og else-delen kan tage meget forskellig tid).

Vil man arbejde mere præcist med tid, så skal man anvende interrupt til at angive tiden, og så skrive koden ud fra det - det er dog lidt mere kompliceret end bare at smække en delay ind.

Hvad er maskinkode i forhold til JAL?

Maskinkode består af tallene 0 og 1, binær kode, hvorimod JAL er et sprog som man kan skrive i en form vi kan forstå og nemmere arbejde med en binær kode. For at kunne bruge det vi skriver i JAL i vores kredse, skal vi bruge en compiler, som laver det om til maskinkode.

Man kan faktisk skrive assembler, der er det tætteste man kommer på maskinkode, når man laver et JAL-program. Maskinkode kan f.x. være følgende:

 asm   bsf   11, 1
 asm   bcf   12, 0

Eller hvis man har et længere stykke assemblerkode:

 var byte opt at 0x01
 assembler
   bsf    status, 5
   movfw  opt
   bcf    status, 5
   andlw  0b_1101_0000
   addwf  prescale, w
   bsf    status, 5
   movwf  opt
   bcf    status, 5
 end assembler

Links

Nettet er fuldt af gode resourcer til JAL

Referencer