News:

Let's find out together what makes a PIC Tick!

Main Menu

Comparing characters in an array

Started by david, Oct 09, 2022, 10:53 AM

Previous topic - Next topic

Dolci

got this code from net.. it is likely from Picbasic.

I will try to translate it to Positron hopefully i will get something ;D

DEVICE = 16F628A 'voor testen 16f648a. Def. versie gaat bij voorkeur in kleinere PIC (SMD en ander type).
CONFIG xt_osc, WDT_off, PWRTE_on, BODEN_On, LVP_off, CP_off, mclre_off
DECLARE XTAL = 4
DECLARE ALL_DIGITAL = 1
DECLARE HSERIAL_BAUD 4800 'zender schijnt geen 4800 aan te kunnen (max 2400). Minizender wel (zelfs 9600).

DIM ingelezen[70] AS BYTE 'groot genoeg hoop ik?
DIM manch_out AS WORD
DIM transmit_1 AS WORD
DIM transmit_2 AS WORD
DIM Byte_to_Transmit AS BYTE
DIM High_nible_to_Encode AS BYTE
DIM Low_nible_to_Encode AS BYTE
DIM nible_to_encode AS BYTE
DIM encoded_nible AS BYTE
DIM Manch_in AS BYTE
DIM index AS BYTE
CLEAR

SYMBOL ctrs = PORTB.3 ; clear to recieve/send
OUTPUT ctrs
GOTO main

encode:

'dit hieronder encoded de nibble hamming(7,4)
' (p1,p2,d1,p3,d2,d3,d4) zie wikipedia hamming(7,4)
encoded_nible = LOOKUP nible_to_encode, [%0000000, %1101001, %0101010, %1000011, %1001100, %0100101, %1100110, %0001111,_
%1110000, %0011001, %1011010, %0110011, %0111100, %1010101, %0010110, %1111111]
RETURN

manchester_encode:

manch_out.0 = Manch_in.0
manch_out.1 =~Manch_in.0 'zou dit werken? (edit: JA)
'~betekend inverteren, ofwel: als manch_in.0 een 1 was dan wordt manch_out.1 een 0 (en v.v
manch_out.2 = Manch_in.1
manch_out.3 = ~Manch_in.1
manch_out.4 = Manch_in.2
manch_out.5 = ~Manch_in.2
manch_out.6 = Manch_in.3
manch_out.7 = ~Manch_in.3
manch_out.8 = Manch_in.4
manch_out.9 = ~Manch_in.4
manch_out.10= Manch_in.5
manch_out.11= ~Manch_in.5
manch_out.12= Manch_in.6
manch_out.13= ~Manch_in.6
manch_out.14= Manch_in.7
manch_out.15= ~Manch_in.7
RETURN


main:

ctrs = 1        'ready for data       
HSERIN [WAIT ("$"), STR ingelezen]    'lees gegevens in (je moet eerst een $ sturen om 'm te laten lezen
' , dit omdat ik test met een GPS die dat doet)
ctrs = 0        'please wait
ingelezen[68] = 10 'CR en LF toevoegen aan de data
ingelezen[69] = 13
    FOR index = 0 TO 69
    Byte_to_Transmit = ingelezen[index]
    High_nible_to_Encode = Byte_to_Transmit      'eerst het high nible coderen
    High_nible_to_Encode.7 = 0
    High_nible_to_Encode.6 = 0
    High_nible_to_Encode.5 = 0
    High_nible_to_Encode.4 = 0
    nible_to_encode = High_nible_to_Encode
    GOSUB encode

    Manch_in = encoded_nible
    GOSUB manchester_encode
    transmit_1 = manch_out
    Low_nible_to_Encode = 0 'eerst alles op 0
    Low_nible_to_Encode.3 = Byte_to_Transmit.7 'daarna bit voor bit kopieren
    Low_nible_to_Encode.2 = Byte_to_Transmit.6
    Low_nible_to_Encode.1 = Byte_to_Transmit.5
    Low_nible_to_Encode.0 = Byte_to_Transmit.4
    nible_to_encode=Low_nible_to_Encode
    GOSUB encode

    Manch_in = encoded_nible
    GOSUB manchester_encode
    transmit_2 = manch_out
    HSEROUT [%01010101, %10101010, %11001100, transmit_1, transmit_2] '1e 2 waarden zijn "zenderstarters"

    'de %11001100 is waar de ontvanger op locked
    NEXT

GOTO main


DEVICE = 16F628A 'voor testen 16f628a. Def. versie mogelijk ook, maar liefst kleiner type.
CONFIG xt_osc, WDT_off, PWRTE_on, BODEN_On, LVP_off, CP_off, mclre_off
DECLARE XTAL = 4
DECLARE ALL_DIGITAL = 1
DECLARE HSERIAL_BAUD 4800  'zender kan niet hoger dan 2400 officieel

DIM recieve_1 AS WORD
DIM recieve_2 AS WORD
DIM manch_out AS WORD
DIM manch_in AS BYTE
DIM highnible AS BYTE
DIM lownibble AS BYTE
DIM bitflipped AS BYTE
DIM inputbyte AS BYTE
DIM decoded_nible AS BYTE
DIM byte_to_decode AS BYTE
DIM recieved AS BYTE

GOTO main

manchester_decode: 'er word niet echt gedecodeerd in de zin dat er word gekeken of het klopt dat het volgende bit de inverse is
'wel in de zin van dat de originele data weer terug wordt gehaald...
manch_in.0 = manch_out.0 'deze decodeersubroutine werkt met dezelfde vars als de codeersub, misschien verwarrend, maar coderen
manch_in.1 = manch_out.2 'is het omgekeerde van decoderen en de vars werken ook omgekeerd. in=out
manch_in.2 = manch_out.4
manch_in.3 = manch_out.6
manch_in.4 = manch_out.8
manch_in.5 = manch_out.10
manch_in.6 = manch_out.12
manch_in.7 = manch_out.14
RETURN

errcorrect:

bitflipped = LOOKUP inputbyte, [0,7,3,4,5,2,6,1,1,6,2,5,4,3,7,0,6,1,5,2,3,4,0,7,7,0,4,3,2,5,1,6,2,5,1,6,7,0,4,3,3,4,0,7,6,1,5,_
2,1,3,7,0,1,6,2,5,5,2,6,1,0,7,3,4,4,3,7,0,1,6,2,5,5,2,6,1,0,7,3,4,2,5,1,6,7,0,4,3,3,4,0,7,6,1,5,2,6,1,5,2,3,4,0,7,7,0,4,3,2,5,1,_
6,0,7,3,4,5,2,6,1,1,6,2,5,4,3,7,0]

    SELECT bitflipped  'die is vreselijk omslachtig... waarom kan het bitnummer geen var zijn?
    CASE 0                        'case 0 hoeft niets geflipped te worden, want 0 betekend: geen errors. Punt 2 is: gaathet wel goed
    'met het extra paritybit? -extra paritybit verwijderd en nog wat gewijzigd. werkt nu
    CASE 1
        inputbyte.6 = ~inputbyte.6 'inverteer bit. (dit bit is omgevallen, inverteren zet het weer recht)
    CASE 2
        inputbyte.5 = ~inputbyte.5
    CASE 3
        inputbyte.4 = ~inputbyte.4
    CASE 4
        inputbyte.3 = ~inputbyte.3
    CASE 5
        inputbyte.2 = ~inputbyte.2
    CASE 6
        inputbyte.1 = ~inputbyte.1
    CASE 7
        inputbyte.0 = ~inputbyte.0
    ENDSELECT
RETURN


decode:

'met deze lookdownlist kun je de originele waarde terugrekenen na foutcorrectie.
decoded_nible = LOOKDOWN byte_to_decode, [%0000000, %1101001, %0101010, %1000011, %1001100, %0100101, %1100110, %0001111,_
%1110000, %0011001, %1011010, %0110011, %0111100, %1010101, %0010110, %1111111]     
RETURN

main:

HRSIN WAIT (%11001100), recieve_1, recieve_2
manch_out = recieve_1
GOSUB manchester_decode
highnible = manch_in
manch_out = recieve_2
GOSUB manchester_decode
lownibble = manch_in
inputbyte = highnible
GOSUB errcorrect
highnible = inputbyte
inputbyte = lownibble
GOSUB errcorrect
lownibble = inputbyte
byte_to_decode = highnible
GOSUB decode
highnible = decoded_nible
byte_to_decode = lownibble
GOSUB decode
lownibble = decoded_nible
recieved.4 = lownibble.0
recieved.5 = lownibble.1
recieved.6 = lownibble.2
recieved.7 = lownibble.3
recieved.0 = highnible.0
recieved.1 = highnible.1
recieved.2 = highnible.2
recieved.3 = highnible.3
HSEROUT [recieved]
GOTO main
END

The  Author  : Lucas Volwater