A hned si odpovím, jistě, kdo by tuto krásnou rybku neznal. Takže klasická řečnická otázka, ale druhá otázka hned následuje: Znáte Swordfish compiler? Že ne! No tak to pokračujte ve čtení. Poč? Nu protože se Vám možná zalíbí stejně jako mně.

Wo co go?
Jedná se o kompilátor Basic-u pro mikrokontroléry PIC18xxx. Tedy žádný převratný zázrak. Ale příjemná hračka pro začátky programování. Nenechte se zmýlit. Ta hračka je velmi dobrá a žívá. A umí toho opravdu celkem dost. Dokonce je i ve verzi SE volně k použití (limitována je pouze na velikost paměti RAM). A není to Basic jen tak ledajaký, ale jedná se o moderní strukturovaný a modulární jazyk. Milovníci objektů si zde sice moc neužijí, ale ostatní se jeho použití vůbec nemusí stydět.

Úvod
Swordfish je vysoce modulární a strukturovaný PIC® BASIC kompilátor pro rodinu mikrokontrolerů PIC18. Swordfish je skutečný kompilátor generující optimalizovaný kód, který může být přímo napálen do mikrokontroléru. Rozšiřující knihovny jsou dodávány se zdrojovým kódem, například pro LCD, GLCD, EEPROM, ADC, softwarový a hardwarový SPI, softwarový a hardwarový I2C, softwarový UART, USART, manipulaci s řetězci, USB, matematická knihovna. Podporovány jsou řetězce, pole, struktury, logické, bitové, bez znaménkové i znaménkové 8b, 16b a 32b int typy a 32b plovoucí čárka. Swordfish je dodáván s výkoným a flexibilním IDE, který obsahuje code explorer, zvýraznění syntaxe, možnost integrace programátoru třetích stran, sériový terminál a integrovaný bootloader. Jedním klikem či stiskem tlačítka klávesnice je možné zkompilovat, sestavit a naprogramovat Váš projekt do cílového mikrokontroleru.

Podpora ICD (In-Circuit Debug) a simulace
Swordfish podporuje In-Circuit Debugging (ICD) v MPLABu, umožňuje krokovat na úrovni zdrojového kódu a zobrazovat hodnoty proměnných v reálné HW! Nebo je možné simulovat běh programu v MPLABu, nebo v Labcenter Electronics Proteus VSM (ISIS).

Struktůrovanost
Swordfish Vám umožňuje strukturovat program použitím procedur a funkcí. Každá procedura může mít vlastní sadu lokálních deklarací obsahující konstanty, struktury a proměnné. Procedurální programování je lepší volba než jednoduché sekvenční nebo nestrukturované programování, zejména v situacích, které vyžadují komplexnost přístupu a zároveň snadnou údržbu.

Modularita
Pro rozsáhlé a komplexní programy je modularita základem. Swordfish Vám umožní seskupit podprogramy, funkce, konstanty, struktury a proměnné do takzvaných modulů. Viditelnost (Scoping) je základní prostředek při udržení programu modulárním. Swordfish dovoluje veškeré deklarace v modulu definovat buď jako privátní, nebo veřejné. Rozdělení privátních a veřejných částí modulu je často označované jako skrývání informací, a umožní vám vytvořit jednotky, které mohou být robustní a opakovaně použitelné.

Download
Asi nejjednodušší cesta k otestování kompilátoru a zjištění, zda je pro Váše účely vhodný, je stáhnou si speciální edici (SE) Swordfishe, která je volně dostupná, není časově omezena . SwordfishSE obsahuje vše jako komerční verze, včetně kompletní sady podporovaných mikrokotrolerů. Kompilátor je však omezen v rozsahu paměti RAM.

Podporované mikrokontrolery
18F1220, 18F1320, 18F2220, 18F2221, 18F2320, 18F2321, 18F2331, 18F2410, 18F242, 18F2420, 18F2431, 18F2439, 18F2450, 18F2455, 18F248, 18F2480, 18F24J10, 18F2510, 18F2515, 18F252, 18F2520, 18F2525, 18F2539, 18F2550, 18F258, 18F2580, 18F2585, 18F25J10, 18F2610, 18F2620, 18F2680, 18F2682, 18F4220, 18F4221, 18F4320, 18F4321, 18F4331, 18F4410, 18F442, 18F4420, 18F4431, 18F4439, 18F4450, 18F4455, 18F448, 18F4480, 18F44J10, 18F4510, 18F4515, 18F452, 18F4520, 18F4525, 18F4539, 18F4550, 18F458, 18F4580, 18F4585, 18F45J10, 18F4610, 18F4620, 18F4680, 18F4685, 18F6310, 18F6390, 18F6410, 18F6490, 18F6520, 18F6525, 18F6527, 18F6585, 18F65J10, 18F65J15, 18F6620, 18F6621, 18F6622, 18F6627, 18F6680, 18F66J10, 18F66J15, 18F6720, 18F6722, 18F67J10, 18F8310, 18F8390, 18F8410, 18F8490, 18F8520, 18F8525, 18F8527, 18F8585, 18F85J10, 18F85J15, 18F8620, 18F8621, 18F8622, 18F8627, 18F8680, 18F86J10, 18F86J15, 18F8720, 18F8722, 18F87J10, 18F1230, 18F1330, 18F2423, 18F2458, 18F2523, 18F2553, 18F2685, 18F4423, 18F4458, 18F4523, 18F4553, 18F4682, 18F63J11, 18F63J90, 18F64J11, 18F64J90, 18F65J11, 18F65J50, 18F65J90, 18F66J11, 18F66J16, 18F66J50, 18F66J55, 18F66J60, 18F66J65, 18F67J11, 18F67J50, 18F67J60, 18F83J11, 18F83J90, 18F84J11, 18F84J90, 18F85J11, 18F85J50, 18F85J90, 18F86J11, 18F86J16, 18F86J50, 18F86J55, 18F86J60, 18F86J65, 18F87J11, 18F87J50, 18F87J60, 18F96J60, 18F96J65 and 18F97J60

Na následujících obrázcích je vlastní IDE Swordfish-e



Další obrázky ukazují ladění pomoci ICD v MPLABu a simulaci v Labcenter Electronics Proteus VSM (ISIS)




Ukázka programu
// LCD proton development board
    #option LCD_DATA = PORTD.4
    #option LCD_RS = PORTE.0
    #option LCD_EN = PORTE.1

    Include "LCD.bas"
    Include "math.bas"
    Include "ADC.bas"
    Include "convert.bas"

{
 Thermistor linearization using a Stein-Hart equation
 based on a program written for the Proton compiler By
 Les Johnston

 The Program below is based On a 10K Ohm resistor As part of the thermistor's circuit: -

  +5 Volts
 --------
    |
    \
    /  10k Ohm 1% (Or better) Resistor
    \
    /
    |
    o-------------O To PORTA.0 of the PICmicro
    |
    \
   o/
    \  Thermistor
    /
    |
    |
  -----
   ---
    -

 The Stein-Hart linearising equation below is only suitable For describing a restricted range around
 the rated TEMPERATURE Or RESISTANCE with sufficient accuracy.

 1
 Tt = ------------------------
 1/B * LN(Rt/R25) + 1/T25

 The B values For common NTC thermistors range from 2000K through To 5000K.
 For this application, the popular, And more complicated, Stein-Hart equation is more accurate.

 The thermistor used did Not provide the B value within its datasheet, but did give the T25 value.
 i.e. RESISTANCE At 25 degrees Centigrade.
 To calculate the B value use the equation below.

 Tt * T25 R25
 B = ---------- * LN ------
 Tt - T25 R100

 Or: -

 (25 + 273.13) * (100 + 273.15) R25
 B = -------------------------------- * LN ------
 75 R100

 giving: -

 R25
 B = 1483.4 * LN ------
 R100

 Thus, knowing the RESISTANCE At 25 degrees Centigrade And also At 100 degrees Centigrade
 we can use the above calculation To find the value of B For a given thermistor.

---------------------------------------------------------------------------------------
}

    // sort a word array...
    Sub BubbleSort(ByRef pArray() As Word)
       Dim SwapOccured As Boolean
       Dim index As Byte
       Dim SwapTemp As Word
       Repeat
          SwapOccured = false
          index = 0
          Repeat
             If pArray(index) > pArray(index + 1) Then
                SwapTemp = pArray(index)
                pArray(index) = pArray(index + 1)
                pArray(index + 1) = SwapTemp
                SwapOccured = true
             EndIf
             Inc(index)
           Until index = Bound(pArray)
       Until Not SwapOccured
    End Sub

    // Get the median of an array
    Function GetMedian(ByRef pSamples() As Word) As Word
       Dim index As Byte
       BubbleSort(pSamples)
       result = pSamples(Bound(pSamples) / 2)
    End Function

    // Perform the Stein Hart linearization taking into account the thermistors characteristics
    Function SteinHart(pValue As Float) As Float
        Const T25Val = 0.0033540                    // Thermistor's t25 value
        Const ThermistorBVal = 1.0 / 3489.0         // Thermistor's B value
        Dim  LogValue As Float

        LogValue = log(pValue / 10000)              // Calculate the log
        Result = ThermistorBVal * LogValue + T25Val  // linearize using the stein-hart algorithm
    End Function

//-----------------------------------------------------------------

    Const SymDegree(8) As Byte = ($06,$09,$09,$06,0,0,0,0) // Data for deg symbol in cgram char 0


    Dim SampleArray(20) As Word
    Dim TempF As Float
    Dim Temperature As Float
    Dim index As Byte
    Dim Resistance As Float
    Dim ThermistorValue As Word
    Const Quanta = 5000.0 / 1024.0                 // Quantizing constant for ADC reading to Voltage calculation

    ADCON1 = $07                                   // PORTE as digital (LCD)
    TRISA.0 = 1                                    // configure AN0 as an input
    ADCON1.7 = 1                                   // set analogue input on PORTA.0

    DelayMS(200)

    LCD.WriteItem(SymDegree)                       // Write the custom char data to the LCD

    While 1 = 1

        For index = 0 To Bound(SampleArray)
            SampleArray(index) = ADC.Read(0)       // Take 20 samples and store them in the array
        Next
        ThermistorValue = GetMedian(SampleArray)   // Then get the median of the array

        Temperature = ThermistorValue * Quanta     // Work out the voltage
        TempF = 5000 - Temperature                 // Find the resistance across the thermistor

        Resistance = (Temperature * 10000) / TempF
        Temperature = SteinHart(Resistance)        // linearize with the Stein Hart calculation

        Temperature = (1 / Temperature) - 273.15   // Convert from Kelvin To Centigrade

        LCD.Cls

        LCD.WriteAt(1,1, FloatToStr(Temperature),0,"C ")

        DelayMS(500)                               // Delay 500ms

    Wend

    End