SlideShare a Scribd company logo
ΑΡΙΣΤΟΤΕΛΕΙΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΟΝΙΚΗΣ
ΣΧΟΛΗ ΘΕΤΙΚ Ν ΕΠΙΣΤΗΜ Ν ΤΜΗΜΑ ΦΥΣΙΚΗΣ
ΤΟΜΕΑΣ ΗΛΕΚΤΡΟΝΙΚΗΣ
∆ιπλωµατική εργασία
ΑΥΤΟΜΑΤΟΠΟΙΗΜΕΝΗ ΛΗΨΗ ΑΣΥΡΜΑΤΟΥ ΣΗΜΑΤΟΣ
ΚΑΙ ΕΠΕΞΕΡΓΑΣΙΑ ΤΟΥ
Επιβλέπων καθηγητής : Κ. Κοσµατόπουλος
Αποστόλης Σταυρακούδης
Θεσσαλονίκη 2000
Περιεχόµενα - 1 -
ΕΙΣΑΓ ΓΗ...................................................................................................................................2
ΘΕ ΡΗΤΙΚΗ ΕΞΗΓΗΣΗ ΤΗΣ ΚΑΤΑΣΚΕΥΗΣ ......................................................................3
Επεξήγηση της τοπολογίας των σταθµών του προγράµµατος REMOS..........................................6
Κ ∆ΙΚΑΣ ASSEMBLY Τ Ν ΜΙΚΡΟΕΛΕΓΚΤ Ν ..................................................................9
Λίστα assembly 1ου
µικροελεγκτή ..............................................................................................9
1ο
αρχείο : REGISTER.H...............................................................................................................................9
2ο
αρχείο : RECEIVE.H.............................................................................................................................. 10
3ο
αρχείο : TRANSMIT.H .......................................................................................................................... 12
4ο
αρχείο : ALLBASE.H............................................................................................................................. 13
Λίστα assembly 2ου
µικροελεγκτή ............................................................................................31
5ο
αρχείο : MINILCD.H.............................................................................................................................. 31
6ο
αρχείο : MAINLCD.H............................................................................................................................ 37
ΑΝΑΛΥΤΙΚΗ ΠΑΡΟΥΣΙΑΣΗ Τ Ν ΡΟΥΤΙΝ Ν ΤΟΥ ΠΡΟΓΡΑΜΜΑΤΟΣ..........................68
Η διαδικασία Εqualize.............................................................................................................71
Η διαδικασία ComputeVals......................................................................................................73
Η διαδικασία Bin2BCD32 .......................................................................................................74
∆Ε∆ΟΜΕΝΑ ΚΑΙ ΣΤΑΘΕΡΕΣ Τ Ν ΣΤΑΘΜ Ν ...................................................................76
ΠΛΑΚΕΤΕΣ PCB ΣΥΣΚΕΥ Ν ...............................................................................................79
DATA SHEETS.........................................................................................................................83
ΒΙΒΛΙΟΓΡΑΦΙΑ.......................................................................................................................84
Εισαγωγή - 2 -
Εισαγωγή
Η εργασία αυτή πραγµατοποιήθηκε για να βοηθήσει στην δοκιµή και βαθµονόµηση των
σταθµών του συστήµατος REMOS το οποίο έχει αναπτυχθεί από τον τοµέα ηλεκτρονικής. Το
σύστηµα REMOS µετρά κάποια φυσικά δεδοµένα και φροντίζει για τη αποστολή τους µέσω
FFSK διαµόρφωσης σε υπολογιστές που λαµβάνουν τα σήµατα αυτά και τα επεξεργάζονται.
Σκοπός της εργασίας αυτής ήταν η κατασκευή συσκευών, ώστε η λήψη αυτών των δεδοµέ-
νων να γίνεται κοντά στο σταθµό αποστολής, βοηθώντας µε αυτό τον τρόπο την διεκπεραίω-
ση των µετρήσεων εύκολα και γρήγορα, χωρίς να απαιτείται η επικοινωνία µε τον κεντρικό
υπολογιστή που συχνά είναι δύσκολη, λόγω της θέσης των σταθµών αποστολής σε δυσπρόσι-
τα σηµεία.
Η εργασία χωρίζεται σε έξι µέρη. Το πρώτο µέρος περιλαµβάνει τη λειτουργία των συ-
σκευών και τα σχηµατικά διαγράµµατά τους. Το δεύτερο περιέχει τον κώδικα assembly των
δύο µικροελεγκτών που χρησιµοποιήθηκαν και το τρίτο αναλύει τις ρουτίνες διεξοδικά. Στο
τέταρτο τµήµα περιέχονται κάποιες σταθερές που είναι απαραίτητες για την ανάλυση των δε-
δοµένων αποστολής και το λογισµικό µε το οποίο γίνεται η µεταγλώττιση των σταθερών αυ-
τών σε µορφή κατάλληλη για εγγραφή τους στην µνήµη EPROM του µικροελεγκτή. Το πέ-
µπτο µέρος περιλαµβάνει τα σχέδια των πλακετών των δύο συσκευών και το έκτο και τελευ-
ταίο περιέχει τα φυλλάδια πληροφοριών των υλικών που χρησιµοποιήθηκαν.
Στο σηµείο αυτό θα ήθελα να ευχαριστήσω τους Κώστα Κοσµατόπουλο και Χρήστο Πα-
παγεωργίου για τη βοήθειά τους.
Θεωρητική επεξήγηση της κατασκευής - 3 -
Θεωρητική εξήγηση της κατασκευής
Στο κοµµάτι αυτό περιλαµβάνονται τα σχηµατικά διαγράµµατα των συσκευών και τα λο-
γικά διαγράµµατα των προγραµµάτων των µικροελεγκτών.
Στα πλαίσια της διπλωµατικής κατασκευάστηκαν δύο συσκευές, µία µε µικρή οθόνη υγρών
κρυστάλλων (LCD) δύο γραµµών και µία µε µεγάλη οθόνη των τεσσάρων γραµµών. Στην
εργασία αυτή παρουσιάζεται η συσκευή µε τη µεγάλη οθόνη, η οποία εµπεριέχει όλες τις
ρουτίνες της µικρής. Από εδώ και στο εξής οποιαδήποτε αναφορά γίνεται θεωρείται ότι γίνε-
ται για τη µεγάλη οθόνη εκτός αν αναφέρεται ρητά το αντίθετο. Παρακάτω δίνεται το γενικό
διάγραµµα ροής της συσκευής.
Έναρξη
Έναρξη
διαδικασίας ;
No
Yes
Αποστολή και λήψη
δεδοµένων
Επεξεργασία
δεδοµένων
Απεικόνιση
δεδοµένων
Σχήµα 1. ∆ιάγραµµα ροής της συνολικής διεργασίας
Στις επόµενες δύο σελίδες δίνονται τα σχηµατικά διαγράµµατα της συσκευής.
A
A
B
B
C
C
D
D
E
E
4 4
3 3
2 2
1 1
Station
selection
(binary)
Microcontroller 1 Microcontroller 2
Start operation ( 2 > 1)
Receive next byte ( 1 > 2)
PortB0
PortB1
PortB3
PortB2
ReceiveNet
StartOpNet
PortA1
PortA3
PortA5
PortA7
PortA6
PortA4
PortA2
PortA0
UHFIn
UHFOut
-9 Volt
VSS
VDD
+9 Volt
UHF Start signal
VDD
VDD
VDD
VDD
VDD
VDD
VDD
VDD
VDD
U2
68HC805C4
39
38
1
2
29
34
36
37
3
11
10
9
8
7
6
5
4
12
13
14
15
16
17
18
19
28
27
26
25
24
23
22
21
30
31
32
33
35
OSC1
OSC2
RESET
IRQ
PD0
PD5
PD7
TCAP
VPP
PA0
PA1
PA2
PA3
PA4
PA5
PA6
PA7
PB0
PB1
PB2
PB3
PB4
PB5
PB6
PB7
PC0
PC1
PC2
PC3
PC4
PC5
PC6
PC7
PD1
PD2
PD3
PD4
TCMP
S2
START
S1
SW DIP-4
1
2
3
4
8
7
6
5
U1
68HC805C4
39
38
1
2
29
34
36
37
3
11
10
9
8
7
6
5
4
12
13
14
15
16
17
18
19
28
27
26
25
24
23
22
21
30
31
32
33
35
OSC1
OSC2
RESET
IRQ
PD0
PD5
PD7
TCAP
VPP
PA0
PA1
PA2
PA3
PA4
PA5
PA6
PA7
PB0
PB1
PB2
PB3
PB4
PB5
PB6
PB7
PC0
PC1
PC2
PC3
PC4
PC5
PC6
PC7
PD1
PD2
PD3
PD4
TCMP
U4
MC34064
1
2
3
Reset
In
GND
U3MC34064
1
2
3
Reset
In
GND
C1
18p R10
10MC2
18p
C3
18p
R11
10M
C4
18p
C6
100n
C5
100n
Y2
4 MHz
Y1
4 MHz
JP1
Voltages
1
2
3
4
U5
UA78L05AQ/TO3
1
2
3
OUT
COM
IN
R1
10k
S5
Down line
S4
Up line
R4
10k
R2
10k
R3
10k
R6
10k
R8
10k
R7
10k
C7
1u
C8
100n
R12
4.7k
R13
4.7k
J1ResPack1
1
2
3
4
5
6
7
8
9
R25
10k
J2
LCD Connector
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
S3
RESET
R14
4.7k
R15
4.7k
R922k
E2
RW
RS
E1
E2
E1RW
RS
Reset
Reset
Reset
Reset
-9 Volt
+9 Volt
Reset
A
A
B
B
C
C
D
D
E
E
4 4
3 3
2 2
1 1
Page 2 (Microcontroller wireless system) - Analog part
A
2 2Sunday, February 20, 2000
Title
Size Document Number Rev
Date: Sheet of
+9 Volt
-9 Volt
VDD
VSS
UHFOut
UHFIn
UHF Start signal
VDD
C10
10n
C9
100n
Q2
2N3904
3
2
1
Q1
2N3904
3
2
1
R16
18k
R17
2.2k
R1847k
R19
10k R20
100k
R21
10k
R22
1k
R23
22k
+
-
U6
LF356
3
2
6
7
1
4
5
R24
22k
+9 Volt
-9 Volt
VDD
VSS
UHF mic out
UHF Out
+9 Volt
-9 Volt
Θεωρητική επεξήγηση της κατασκευής - 6 -
Η εργασία στηρίχθηκε στον µικροελεγκτή MC68HC805C8 της Motorola ο οποίος διαθέτει
τρεις θύρες εισόδου – εξόδου και µία για σειριακή επικοινωνία. Σε αυτό το σηµείο πρέπει να
τονιστεί ότι το κοµµάτι του προγράµµατος του πρώτου µικροελεγκτή που αφορά την αποστο-
λή και λήψη των δεδοµένων στο φάσµα των UHF συχνοτήτων αποτελεί εργασία του Χρή-
στου Παπαγεωργίου. Η δική µου επέµβαση στο πρόγραµµα του πρώτου µικροελεγκτή ήταν η
δηµιουργία της ρουτίνας που είναι υπεύθυνη για την επικοινωνία των δύο µικροελεγκτών.
Η λειτουργία της συσκευής έχει ως εξής : Αρχικά πιέζουµε το διακόπτη S2 (Start). Ο
δεύτερος µικροελεγκτής στέλνει ένα σήµα έναρξης µέτρησης στον πρώτο µικροελεγκτή, ενώ
ο ίδιος παραµένει ανενεργός και περιµένει σήµα για να αρχίσει να λαµβάνει δεδοµένα. Ο δεύ-
τερος µικροελεγκτής στέλνει ένα σήµα έναρξης µέτρησης στον σταθµό µέσω UHF και περι-
µένει να λάβει απάντηση. Όταν έρχεται η απάντηση ο πρώτος µικροελεγκτής µεταφέρει τα
δεδοµένα που έλαβε από τον σταθµό - τα οποία είναι 15 bytes - στον δεύτερο και η λειτουρ-
γία του τελειώνει σε αυτό το σηµείο. Ο δεύτερος µικροελεγκτής µε τη σειρά του, αφού λάβει
τα 15 αυτά bytes, αρχικά τα αποκωδικοποιεί και αποθηκεύει τα δεδοµένα των µετρήσεων σε
µεταβλητές. Τα δεδοµένα προέρχονται από A/D µετατροπείς οι οποίοι βρίσκονται στους
σταθµούς. Κάθε µέτρηση αποτελείται από 10 bits εκτός από τα δεδοµένα της µέτρησης της
στάθµης των υδάτων η οποία καταλαµβάνουν 12 bits. Στη συνέχεια γίνονται πράξεις πάνω
στη µέτρηση αυτή ώστε να προκύψει κατανοητό αποτέλεσµα. Η πράξη που γίνεται είναι η
εξής : Υ = α·x + β, όπου α και β σταθερές οι οποίες είναι διαφορετικές για κάθε σταθµό και x
η τιµή της µέτρησης του σταθµού. Επειδή τα δεδοµένα είναι 10 και 12 bits αναγκαστικά χρη-
σιµοποιούνται αλγόριθµοι πράξεων των 32 bit. Τελικά στην οθόνη υγρών κρυστάλλων απει-
κονίζονται τα αποτελέσµατα. Στις δύο τελευταίες γραµµές δίνονται τα 15 bytes που έστειλε ο
σταθµός καθώς και κάποιες πληροφορίες για τη σωστή λειτουργία κάποιων αισθητηρίων.
Στις δύο πρώτες γραµµές απεικονίζονται ανά δύο τα δεδοµένα των µετρήσεων. Η κύλιση από
γραµµή σε γραµµή γίνεται µε δύο κουµπιά τα οποία βρίσκονται στο επάνω µέρος της συ-
σκευής. Για την καλύτερη κατανόηση της λειτουργίας της συσκευής απαιτείται η εξήγηση
της τοπολογίας των σταθµών, η οποία ακολουθεί παρακάτω.
Επεξήγηση της τοπολογίας των σταθµών του προγράµµατος REMOS
Οι σταθµοί αυτοί βρίσκονται τοποθετηµένοι σε διάφορες τοποθεσίες. Στη µνήµη EPROM του
µικροελεγκτή της εργασίας είναι τοποθετηµένα τα δεδοµένα των σταθερών α και β της περιο-
χής της λιµνοθάλασσας του Μεσολογγίου. Ο µέγιστος αριθµός σταθµών µιας περιοχής είναι
16. Τα δεδοµένα που απεικονίζονται στην οθόνη LCD είναι 8. Σε κάθε σταθµό υπάρχουν ε-
πτά κανάλια (A/D µετατροπείς) δεδοµένων των 10 bits και ένα σύστηµα µέτρησης της στάθ-
µης του νερού το οποίο στέλνει 3 bytes δεδοµένων. Τα δεδοµένα στάθµης του νερού είναι
Θεωρητική επεξήγηση της κατασκευής - 7 -
δύο των 12 bit το καθένα. Το πρώτο δεδοµένο είναι η πραγµατική µέτρηση και το δεύτερο
µία µέτρηση αναφοράς. Η πράξη που γίνεται για να εξαχθεί η τιµή της στάθµης του νερού εί-
ναι διαφορετική από τις άλλες και έχει ως εξής : Υ = α ·
αναφοράςΜέτρηση
µέτρησηΠραγµατική
+ β, όπου α
και β οι σταθερές. Οι σταθερές α και β χρησιµεύουν στην εξαγωγή της µέτρησης σε µορφή
που είναι αντιληπτή από το χρήστη. Οι A/D µετατροπείς στέλνουν σαν δεδοµένα ακέραιους
αριθµούς µεταξύ των τιµών 0 – 1024 για δεδοµένο των 10 bit και 0 – 4096 για δεδοµένο των
12 bit. Ο χρήστης όµως τη στάθµη του νερού τη µετράει σε cm και στο LCD display πρέπει
να εµφανίζεται ένας αριθµός της µορφής π.χ. 102.5 cm. Αυτή η απαίτηση οδήγησε σε ανά-
πτυξη ρουτινών για πράξεις µε αριθµούς κινητής υποδιαστολής (floating point). Η καθεµιά
από τις σταθερές α και β, που βρίσκονται σε πίνακες στην EPROM του µικροελεγκτή, κατα-
λαµβάνει 3 bytes. Η διαµόρφωση της δοµής της κάθε σταθεράς έχει ως εξής : 1ο
byte byte
χαµηλής τάξης της σταθεράς
2ο
byte byte υψηλής τάξης της σταθεράς
3ο
byte byte ελέγχου
1ο
– 4ο
bit : δύναµη στην οποία είναι υψωµένη η σταθερά
5ο
– 6ο
bit : δεν χρησιµοποιούνται
7ο
bit : πρόσηµο της δύναµης που είναι υψωµένη η σταθερά
8ο
bit : πρόσηµο της σταθεράς
Τα πρόσηµα (7ο
και 8ο
bit) δείχνουν θετικό αριθµό αν η τιµή τους είναι 0 και αρνητικό αν η
τιµή τους είναι 1. Για παράδειγµα η τιµή –71.6 στην διαµόρφωση των τριών byte έχει την ε-
ξής µορφή : 02 CC C1, όπου 2CC16 είναι ο αριθµός 716 και C116 το byte ελέγχου
(11000001)2.
Παρακάτω ακολουθεί µια περίληψη της δοµής του πίνακα των σταθερών.
1. Συνολικά κανάλια : 8
2. Αριθµός σταθερών ανά µέτρηση : 2
3. Αριθµός bytes ανά σταθερά : 3
4. Αριθµός bytes ανά κανάλι : 6
5. Συνολικός αριθµός bytes ανά σταθµό : 48
6. Συνολικός αριθµός σταθµών ανά µικροελεγκτή : 16
7. Συνολικός αριθµός bytes στην µνήµη του µικροελεγκτή : 768
Στην EPROM του µικροελεγκτή υπάρχει ακόµη ένας πίνακας µε τα αλφαριθµητικά (strings)
που θα εµφανιστούν στην οθόνη LCD. Τα αλφαριθµητικά αυτά είναι τα ονόµατα που δίνο-
νται σε κάθε κανάλι ανάλογα µε τα δεδοµένα που µετράει και δεν µπορούν να αλλάξουν από
σταθµό σε σταθµό. Τόσο ο πίνακας σταθερών όσο και ο πίνακας αλφαριθµητικών γίνονται
Θεωρητική επεξήγηση της κατασκευής - 8 -
ευκολότερα κατανοητοί στο επόµενο µέρος της εργασίας, στη λίστα assembly του προγράµ-
µατος (σελ. 64-67).
Κώδικας Assembly των δύο µικροελεγκτών - 9 -
Κώδικας Assembly των δύο µικροελεγκτών
Στο κεφάλαιο αυτό δίνονται τα προγράµµατα σε γλώσσα assembly για τον 6805. Η πρώ-
τη λίστα αφορά το πρόγραµµα του πρώτου µικροελεγκτή το οποίο είναι κοινό και στις δύο
εκδόσεις, µε τη µικρή και µε τη µεγάλη οθόνη. Η δεύτερη λίστα αποτελεί το πρόγραµµα του
2ου
µικροελεγκτή για τη µικρή οθόνη των δύο γραµµών. Τέλος η τρίτη λίστα αφορά το πρό-
γραµµα του 2ου
µικροελεγκτή στην έκδοση µε τη µεγάλη οθόνη.
Λίστα assembly 1ου
µικροελεγκτή
1ο
αρχείο : REGISTER.H. Το αρχείο αυτό περιέχει τις διευθύνσεις των καταχωρητών
του µικροελεγκτή και επισυνάπτεται στο κυρίως αρχείο.
* Portions to Motorola Inc
* (c) 16/01/95 by Nick & Chris Firmware House
PortA.Data EQU $0000
PortB.Data EQU $0001
PortC.Data EQU $0002
PortD.Data EQU $0003
PortA.Direction EQU $0004
PortB.Direction EQU $0005
PortC.Direction EQU $0006
Syn.Control EQU $000A
Syn.Status EQU $000B
Syn.Data EQU $000C
Asyn.Baud EQU $000D
Asyn.Control1 EQU $000E
Asyn.Control2 EQU $000F
Asyn.Status EQU $0010
Asyn.Data EQU $0011
Timer.Control EQU $0012
Timer.Status EQU $0013
InpCap.HighByte EQU $0014
InpCap.LowByte EQU $0015
OutCom.HighByte EQU $0016
OutCom.LowByte EQU $0017
Count.HighByte EQU $0018
Count.LowByte EQU $0019
AlCnt.HighByte EQU $001A
AlCnt.LowByte EQU $001B
Program EQU $001C
CompOK.Reset EQU $001D
CompOK.Control EQU $001E
Option EQU $1FDF
Κώδικας Assembly των δύο µικροελεγκτών - 10 -
2ο
αρχείο : RECEIVE.H. Το αρχείο αυτό περιέχει µεταβλητές. Όπως το προηγούµενο
έτσι και αυτό επισυνάπτεται στο κυρίως αρχείο.
$base 10t
FSK0L RMB 1
FSK0H RMB 1
FSK1L RMB 1
FSK1H RMB 1
FSKL RMB 1
FSKH RMB 1
TIMERL RMB 1
TIMERH RMB 1
OCMPLOTEMP1 RMB 1
OCMPLOTEMP2 RMB 1
TEMPCAPT1H RMB 1
TEMPCAPT1L RMB 1
TEMPCAPT2H RMB 1
TEMPCAPT2L RMB 1
DIFFH RMB 1
DIFFL RMB 1
TEMP3 RMB 1
TEMP4 RMB 1
TEMP5 RMB 1
TEMP6 RMB 1
COUNTLOOP1 RMB 1
COUNTLOOP2 RMB 1
COUNTLOOP3 RMB 1
COUNTLOOP4 RMB 1
COUNTLOOP5 RMB 1
CODE RMB 1
NUMBEROFOVERFLOWS RMB 1
RECEIVEDBYTE0 RMB 1
RECEIVEDBYTE1 RMB 1
RECEIVEDBYTE2 RMB 1
RECEIVEDBYTE3 RMB 1
RECEIVEDBYTE4 RMB 1
RECEIVEDBYTE5 RMB 1
RECEIVEDBYTE6 RMB 1
RECEIVEDBYTE7 RMB 1
RECEIVEDBYTE8 RMB 1
RECEIVEDBYTE9 RMB 1
RECEIVEDBYTE10 RMB 1
RECEIVEDBYTE11 RMB 1
RECEIVEDBYTE12 RMB 1
RECEIVEDBYTE13 RMB 1
CORRECT0 RMB 1
CORRECT1 RMB 1
CORRECT2 RMB 1
CORRECT3 RMB 1
CORRECT4 RMB 1
CORRECT5 RMB 1
CORRECT6 RMB 1
CORRECT7 RMB 1
CORRECT8 RMB 1
CORRECT9 RMB 1
CORRECT10 RMB 1
CORRECT11 RMB 1
CORRECT12 RMB 1
CORRECT13 RMB 1
SAMEVALUEPAIRS RMB 1
Κώδικας Assembly των δύο µικροελεγκτών - 11 -
CORRECTPAIRSCOUNT RMB 1
CORRECTROLLEDVALUE RMB 1
TEMP66 RMB 1
RECEIVESTATUS RMB 1
COUNTLOOP7 RMB 1
COUNTLOOP8 RMB 1
COUNTLOOP9 RMB 1
TEMPX RMB 1
DELAYL RMB 1
DELAYH RMB 1
COUNT.HIGHBYTE~ RMB 1
TEMPX1 RMB 1
TEMPX2 RMB 1
FIRSTVALUE0 RMB 1
FIRSTVALUE1 RMB 1
FIRSTVALUE2 RMB 1
FIRSTVALUE3 RMB 1
FIRSTVALUE4 RMB 1
FIRSTVALUE5 RMB 1
FIRSTVALUE6 RMB 1
FIRSTVALUE7 RMB 1
FIRSTVALUE8 RMB 1
FIRSTVALUE9 RMB 1
FIRSTVALUE10 RMB 1
FIRSTVALUE11 RMB 1
FIRSTVALUE12 RMB 1
FIRSTVALUE13 RMB 1
SECONDVALUE0 RMB 1
SECONDVALUE1 RMB 1
SECONDVALUE2 RMB 1
SECONDVALUE3 RMB 1
SECONDVALUE4 RMB 1
SECONDVALUE5 RMB 1
SECONDVALUE6 RMB 1
SECONDVALUE7 RMB 1
SECONDVALUE8 RMB 1
SECONDVALUE9 RMB 1
SECONDVALUE10 RMB 1
SECONDVALUE11 RMB 1
SECONDVALUE12 RMB 1
SECONDVALUE13 RMB 1
THIRDVALUE0 RMB 1
THIRDVALUE1 RMB 1
THIRDVALUE2 RMB 1
THIRDVALUE3 RMB 1
THIRDVALUE4 RMB 1
THIRDVALUE5 RMB 1
THIRDVALUE6 RMB 1
THIRDVALUE7 RMB 1
THIRDVALUE8 RMB 1
THIRDVALUE9 RMB 1
THIRDVALUE10 RMB 1
THIRDVALUE11 RMB 1
THIRDVALUE12 RMB 1
THIRDVALUE13 RMB 1
Κώδικας Assembly των δύο µικροελεγκτών - 12 -
FIRSTVALUECOUNT RMB 1
SECONDVALUECOUNT RMB 1
THIRDVALUECOUNT RMB 1
SECONDTIME RMB 1
INTERPACKETCOUNT RMB 1
FGT1400&FLT1640C RMB 1
FLT700HZCOUNT RMB 1
FGT2440HZCOUNT RMB 1
SYNCPULSESLT60 RMB 1
ERRORSTATUS RMB 1
SYNCSTATUS RMB 1
3ο
αρχείο : TRANSMIT.H. Το αρχείο αυτό περιέχει µεταβλητές. Το αρχείο αυτό επισυ-
νάπτεται στο κυρίως αρχείο.
$BASE 10T
BitsToBeSend RMB 1
* Το σύνολο των bits τα οποία θα εκπεµφθούν (από βάση 8, από τερµατικό 80)
ShiftedBits RMB 1
* Ο αριθµός των bits τα οποία εκπέµφθησαν
PulseW.Status RMB 1
* Το byte αυτό χρησιµοποιείται µε τον καταχωρητή X για να αποδώσει τιµή
* στον καταχωρητή Output Compare. Αν έχει τιµή 0 ο χρόνος για τον
* Output Compare φορτώνεται µέσω των Counts και έχει τιµή 01F4 ενώ για
* το 1 ο Output Compare παίρνει την τιµή 00FA
OutCom.LowByte~ RMB 1
* Προσωρινό byte αποθήκευσης του χαµηλού byte του Output Compare
ByteToBeSend0~ RMB 1
ByteToBeSend1~ RMB 1
ByteToBeSend2~ RMB 1
ByteToBeSend0 RMB 1
ByteToBeSend1 RMB 1
ByteToBeSend2 RMB 1
* Το σύνολο των bytes που ολισθαίνουν. Στην περίπτωση της βάσης έχουµε
* 8 bit ολίσθηση ενώ στην περίπτωση του τερµατικού έχουµε 80 bit ολίσθηση
SynPul.Num RMB 1
* Κρατά το σύνολο των παλµών συγχρονισµού (150 για την περίπτωση της βάσης
* και 150 για την περίπτωση του τερµατικού)
SynPul.Counter RMB 1
* Μας δίνει τον αριθµό των συγχρονιστικών παλµών που έχουν ήδη εκπεµφθεί
SynPul.Level RMB 1
* Μας δίνει το επίπεδο του συγχρονιστικού παλµού (0 για τη βάση και 1
* για το τερµατικό)
Pulsepackets.Num RMB 1
*It is the number of transmitions
Κώδικας Assembly των δύο µικροελεγκτών - 13 -
4ο
αρχείο : ALLBASE.ASM. Το αρχείο αυτό περιέχει το πρόγραµµα του 1ου
µικροελε-
γκτή. Το αρχείο αυτό είναι το βασικό αρχείο κώδικα. Σχόλια στον κώδικα υπάρχουν µόνο
στα σηµεία που επενέβηκα.
$BASE 10T
$INCLUDE "REGISTER.H"
ORG $30
$INCLUDE "RECEIVE.H"
$INCLUDE "TRANSMIT.H"
StationNo RMB 1 ; 1 byte for station
number
TEMPA RMB 1 ; Temporary acca
MyTEMPX RMB 1 ; Temporary X
register
MyCnt RMB 1 ; Temporary Counter
TempXcounter RMB 1 ; Temporary X counter
SendByte EQU CORRECT0 ; Located in RECEIVE.H
ORG $180
INIT LDA #%11001010
STA OPTION
RSP
CLR SECONDTIME
CLR INTERPACKETCOUNT
CLR FGT1400&FLT1640C
CLR FLT700HZCOUNT
CLR FGT2440HZCOUNT
CLR SYNCPULSESLT60
CLR SYNCSTATUS
LDA #$00
STA PortB.Direction
CLR PORTC.DATA
CLR RECEIVESTATUS
Initialization LDA #9
STA BitsToBeSend
LDA #101
STA SynPul.Num
CLR SynPul.Level
ExecutionStart
LDA #$00
STA PortA.Direction ; All inputs
LDA #%11000000 ; PB0 - PB3 : StationNo (IN)
; PB4 : Start operation (IN)
; PB5 : Finished with previous
byte
; PB6 : Send next byte to
second microc. (OUT)
STA PortB.Direction ; Port B direction
LDA #0
STA PortB.Data
NOP
NOP
NOP
LDA PortB.Data ; Load PortB
Κώδικας Assembly των δύο µικροελεγκτών - 14 -
AND #$0F ; Only the lower 4 bits
STA StationNo ; Station number
StartOpLoop LDA PortB.Data ; Get data from Port B
AND #%00010000 ; Check if Start operation
signal has been sent
BEQ StartOpLoop ; No ? Loop until it has.
StartMeasure
LDA #$FF ; Port C all outputs
STA PortC.Direction
LDA #0
NOP
NOP
STA PortC.Data ; PortC data all zero's
LDA StationNo ; Station number
ORA #%11110000 ; OR $F0 for relays
STA Code
BSET 0,PortC.Data ; Start bit to UHF
BSET 1,PortC.Data ; Test led on
JSR Measure
LDA #$FF
STA PortA.Direction ; Port A out for sending Data
SendDataProc
CLR MyCnt ; Clear Counter
STX MyTEMPX
STA TEMPA
CLRX ; Clearing X for address
SendDataLoop
LDA SendByte,X ; SendByte address
NOP
STA PortA.Data ; Data to 1st mic.
NOP
NOP
NOP
BSET 6,PortB.Data ; Ready to send byte
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP ; Delay (2cycles x 10)
BCLR 6,PortC.Data ; Send next byte --> 0
INCX
INC MyCnt ; +1 to Counter and X
LDA #15
CMP MyCnt
BEQ EndDataLoop ; If Counter = 15 loop to END
JSR Dlay50ms ; Make a delay
JMP SendDataLoop ; Jump to SendDataLoop
; for next byte...
EndDataLoop
LDA TEMPA
LDA MyTEMPX ; Initial data to acca abnd X
Κώδικας Assembly των δύο µικροελεγκτών - 15 -
LDA #$00
STA PortA.Direction ; Port A is input
ExitTransfer BRA ExitTransfer
Measure JSR MAIN
START CLR TEMP4
CLR TEMP5
CLR TEMP6
CLR TEMP66
CLRX
CLR COUNTLOOP1
CLR COUNTLOOP2
CLR COUNTLOOP7
CLR COUNTLOOP8
CLR COUNTLOOP9
CLR CORRECTPAIRSCOUNT
CLR SAMEVALUEPAIRS
CLR FIRSTVALUECOUNT
CLR SECONDVALUECOUNT
CLR THIRDVALUECOUNT
CLR CORRECTROLLEDVALUE
BSET 1,TIMER.CONTROL
LDA TIMER.STATUS
LDA INPCAP.LOWBYTE
LOOP1000
* BRCLR 7,TIMER.STATUS,LOOP10000
BRCLR 7,TIMER.STATUS,LOOP1000
LDA INPCAP.HIGHBYTE
STA TEMPCAPT1H
LDA TIMER.STATUS
LDA INPCAP.LOWBYTE
STA TEMPCAPT1L
JMP LOOP2
LOOP10000 INC COUNTLOOP7
LDA COUNTLOOP7
CMP #255
BEQ SHUTDOWN1
* BEQ NEXTTIME1
BRA LOOP1000
NEXTTIME1 INC COUNTLOOP8
LDA COUNTLOOP8
CMP #255
BEQ NEXTTIME2
BRA LOOP1000
NEXTTIME2 INC COUNTLOOP9
LDA COUNTLOOP9
CMP #1
BEQ SHUTDOWN11
BRA LOOP1000
SHUTDOWN1 LDA RECEIVESTATUS
CMP #$FF
BEQ TESTCONTROL1
* JMP START
LDA SYNCSTATUS
CMP #0
Κώδικας Assembly των δύο µικροελεγκτών - 16 -
BEQ CONTINUE0
LDA INTERPACKETCOUNT
CMP #$FF
BNE CONTINUE10
LDA #$FE
STA INTERPACKETCOUNT
CONTINUE10 INC INTERPACKETCOUNT
CONTINUE0 CPX #0
BEQ START
JMP EXIT
TESTCONTROL1 BSET 1,PORTC.DATA
BRA AFTERDELAY
DELAY JSR DELAY50MS
JSR DELAY50MS
JSR DELAY50MS
JSR DELAY50MS
JSR DELAY50MS
JSR DELAY50MS
JSR DELAY50MS
JSR DELAY50MS
JSR DELAY50MS
JSR DELAY50MS
JSR DELAY50MS
JSR DELAY50MS
JSR DELAY50MS
JSR DELAY50MS
JSR DELAY50MS
JSR DELAY50MS
JSR DELAY50MS
JSR DELAY50MS
JSR DELAY50MS
JSR DELAY50MS
RTS
SHUTDOWN11 BRA SHUTDOWN1
AFTERDELAY
JMP TESTCONTROL
LOOP0 CLR TEMP6
CLR TEMP66
LOOP000 BSET 1,TIMER.CONTROL
CLR COUNTLOOP1
CLR TEMP5
CLR COUNTLOOP3
LDA TIMER.STATUS
LDA INPCAP.LOWBYTE
LOOP101 BRCLR 7,TIMER.STATUS,LOOP100
BRA CONTINUE100
LOOP100 INC COUNTLOOP3
LDA COUNTLOOP3
CMP #255
BNE LOOP101
BRA SHUTDOWN11
Κώδικας Assembly των δύο µικροελεγκτών - 17 -
CONTINUE100 LDA INPCAP.HIGHBYTE
STA TEMPCAPT1H
LDA TIMER.STATUS
LDA INPCAP.LOWBYTE
STA TEMPCAPT1L
LOOP3 LDA TIMER.STATUS
LDA INPCAP.LOWBYTE
LOOP2 CLR TEMP5
LOOP11 BRCLR 7,TIMER.STATUS,LOOP10
BRA CONTINUE
LOOP10 INC TEMP5
LDA TEMP5
CMP #255
BNE LOOP11
BRA SHUTDOWN11
CONTINUE LDA INPCAP.HIGHBYTE
STA TEMPCAPT2H
LDA TIMER.STATUS
LDA INPCAP.LOWBYTE
STA TEMPCAPT2L
CLC
LDA TEMPCAPT2L
SUB TEMPCAPT1L
STA DIFFL
LDA TEMPCAPT2H
SBC TEMPCAPT1H
STA DIFFH
CMP #1
BLO TEST205255
BEQ TEST256305
BHI TEST512562TEMP
TEST205255 LDA DIFFL
CMP #205
BLO FGT2440HZ
* BLO ERROR
JMP BITONE
TEST256305 LDA DIFFL
CMP #49
BHI TEST306461TEMP
JMP BITONE
FGT1400&FLT1640H
LDA SYNCSTATUS
CMP #0
BEQ CONTINUE90
LDA FGT1400&FLT1640C
CMP #$FF
BNE CONTINUE20
LDA #$FE
STA FGT1400&FLT1640C
CONTINUE20 INC FGT1400&FLT1640C
CONTINUE90 CPX #0
Κώδικας Assembly των δύο µικροελεγκτών - 18 -
BEQ START000
JMP LOOP77
FLT700HZ
LDA SYNCSTATUS
CMP #0
BEQ CONTINUE80
LDA FLT700HZCOUNT
CMP #$FF
BNE CONTINUE30
LDA #$FE
STA FLT700HZCOUNT
CONTINUE30 INC FLT700HZCOUNT
CONTINUE80 CPX #0
BEQ START000
JMP LOOP77
FGT2440HZ
LDA SYNCSTATUS
CMP #0
BEQ CONTINUE70
LDA FGT2440HZCOUNT
CMP #$FF
BNE CONTINUE40
LDA #$FE
STA FGT2440HZCOUNT
CONTINUE40 INC FGT2440HZCOUNT
CONTINUE70 CPX #0
BEQ START000
JMP LOOP77
TEST306461TEMP BRA TEST306461
TEST512562TEMP BRA TEST512562
START000 JMP START
SYNCPULSESLT60L
LDA SYNCSTATUS
CMP #0
BEQ CONTINUE60
LDA SYNCPULSESLT60
CMP #$FF
BNE CONTINUE50
LDA #$FE
STA SYNCPULSESLT60
CONTINUE50 INC SYNCPULSESLT60
CONTINUE60 CPX #0
BEQ START000
JMP LOOP77
LOOP33 JMP LOOP3
NEXT30 LDA TEMP66
CMP #1
BLO NEXT31
* INCX
* JMP LOOP77
INC ERRORSTATUS
RTS
NEXT31 CPX #1
Κώδικας Assembly των δύο µικροελεγκτών - 19 -
BLO NEXT32
* INCX
* JMP LOOP77
INC ERRORSTATUS
NEXT32 RTS
TEST306461 CMP #102
BLO FGT1400&FLT1640
* BLO ERROR
BRA BITZERO
TEST512562
LDA DIFFH
CMP #2
BHI FLT700HZ
LDA DIFFL
CMP #202
BHI FLT700HZ
* BHI ERROR
BRA BITZERO
FGT1400&FLT1640 JMP FGT1400&FLT1640H
BITONE INC TEMP6
LDA COUNTLOOP1
CMP #1
BLO TELOS0
BRA BEFORETELOS
LOOP770 JMP LOOP77
LOOP00 JMP LOOP0
BITZERO INC TEMP66
LDA TEMP6
CMP #60
BLS SYNCPULSESLT60L
* BLS ERROR
LDA SYNCSTATUS
CMP #$FF
BNE CONTINUE110
LDA #$FE
STA SYNCSTATUS
CONTINUE110 INC SYNCSTATUS
CLC
INC COUNTLOOP1
BRA TELOS
BEFORETELOS INC COUNTLOOP1
TELOS0 SEC
TELOS ROL RECEIVEDBYTE0
ROL RECEIVEDBYTE1
Κώδικας Assembly των δύο µικροελεγκτών - 20 -
ROL RECEIVEDBYTE2
ROL RECEIVEDBYTE3
ROL RECEIVEDBYTE4
ROL RECEIVEDBYTE5
ROL RECEIVEDBYTE6
ROL RECEIVEDBYTE7
ROL RECEIVEDBYTE8
ROL RECEIVEDBYTE9
ROL RECEIVEDBYTE10
ROL RECEIVEDBYTE11
ROL RECEIVEDBYTE12
ROL RECEIVEDBYTE13
LDA TEMPCAPT2H
STA TEMPCAPT1H
LDA TEMPCAPT2L
STA TEMPCAPT1L
LDA COUNTLOOP1
CMP #113
BLO LOOP33
INCX
INC CORRECTROLLEDVALUE
CPX #2
BHS CONTINUE1
CONTINUE3 JMP LOOP4000
CONTINUE1 LDA CORRECTROLLEDVALUE
CMP #2
BLO CONTINUE3
LDA RECEIVEDBYTE0
CMP FIRSTVALUE0
BNE LOOP3900
LDA RECEIVEDBYTE1
CMP FIRSTVALUE1
BNE LOOP3900
LDA RECEIVEDBYTE2
CMP FIRSTVALUE2
BNE LOOP3900
LDA RECEIVEDBYTE3
CMP FIRSTVALUE3
BNE LOOP3900
LDA RECEIVEDBYTE4
CMP FIRSTVALUE4
BNE LOOP3900
LDA RECEIVEDBYTE5
CMP FIRSTVALUE5
BNE LOOP3900
LDA RECEIVEDBYTE6
CMP FIRSTVALUE6
BNE LOOP3900
LDA RECEIVEDBYTE7
CMP FIRSTVALUE7
BNE LOOP3900
LDA RECEIVEDBYTE8
CMP FIRSTVALUE8
BNE LOOP3900
LDA RECEIVEDBYTE9
CMP FIRSTVALUE9
Κώδικας Assembly των δύο µικροελεγκτών - 21 -
BNE LOOP3900
LDA RECEIVEDBYTE10
CMP FIRSTVALUE10
BNE LOOP3900
LDA RECEIVEDBYTE11
CMP FIRSTVALUE11
BNE LOOP3900
LDA RECEIVEDBYTE12
CMP FIRSTVALUE12
BNE LOOP3900
LDA RECEIVEDBYTE13
CMP FIRSTVALUE13
BNE LOOP3900
INC FIRSTVALUECOUNT
LDA FIRSTVALUECOUNT
CMP #31
BEQ FIRSTVALUEMAX
JMP LOOP77
LOOP3900 JMP LOOP39000
FIRSTVALUEMAX LDA FIRSTVALUECOUNT
STA CORRECTPAIRSCOUNT
STA SAMEVALUEPAIRS
LDA FIRSTVALUE0
STA CORRECT0
LDA FIRSTVALUE1
STA CORRECT1
LDA FIRSTVALUE2
STA CORRECT2
LDA FIRSTVALUE3
STA CORRECT3
LDA FIRSTVALUE4
STA CORRECT4
LDA FIRSTVALUE5
STA CORRECT5
LDA FIRSTVALUE6
STA CORRECT6
LDA FIRSTVALUE7
STA CORRECT7
LDA FIRSTVALUE8
STA CORRECT8
LDA FIRSTVALUE9
STA CORRECT9
LDA FIRSTVALUE10
STA CORRECT10
LDA FIRSTVALUE11
STA CORRECT11
LDA FIRSTVALUE12
STA CORRECT12
LDA FIRSTVALUE13
STA CORRECT13
JMP EXIT1
SHUTDOWN2 CPX #20
BLO START0000
BSET 5,SECONDTIME
START0000 JMP START
LOOP4000 LDA RECEIVEDBYTE0
STA FIRSTVALUE0
LDA RECEIVEDBYTE1
STA FIRSTVALUE1
LDA RECEIVEDBYTE2
STA FIRSTVALUE2
Κώδικας Assembly των δύο µικροελεγκτών - 22 -
LDA RECEIVEDBYTE3
STA FIRSTVALUE3
LDA RECEIVEDBYTE4
STA FIRSTVALUE4
LDA RECEIVEDBYTE5
STA FIRSTVALUE5
LDA RECEIVEDBYTE6
STA FIRSTVALUE6
LDA RECEIVEDBYTE7
STA FIRSTVALUE7
LDA RECEIVEDBYTE8
STA FIRSTVALUE8
LDA RECEIVEDBYTE9
STA FIRSTVALUE9
LDA RECEIVEDBYTE10
STA FIRSTVALUE10
LDA RECEIVEDBYTE11
STA FIRSTVALUE11
LDA RECEIVEDBYTE12
STA FIRSTVALUE12
LDA RECEIVEDBYTE13
STA FIRSTVALUE13
INC FIRSTVALUECOUNT
JMP LOOP77
LOOP39000 LDA SECONDVALUECOUNT
CMP #1
BLO LOOP3910
LDA RECEIVEDBYTE0
CMP SECONDVALUE0
BNE LOOP3920
LDA RECEIVEDBYTE1
CMP SECONDVALUE1
BNE LOOP3920
LDA RECEIVEDBYTE2
CMP SECONDVALUE2
BNE LOOP3920
LDA RECEIVEDBYTE3
CMP SECONDVALUE3
BNE LOOP3920
LDA RECEIVEDBYTE4
CMP SECONDVALUE4
BNE LOOP3920
LDA RECEIVEDBYTE5
CMP SECONDVALUE5
BNE LOOP3920
LDA RECEIVEDBYTE6
CMP SECONDVALUE6
BNE LOOP3920
LDA RECEIVEDBYTE7
CMP SECONDVALUE7
BNE LOOP3920
LDA RECEIVEDBYTE8
CMP SECONDVALUE8
BNE LOOP3920
LDA RECEIVEDBYTE9
CMP SECONDVALUE9
BNE LOOP3920
LDA RECEIVEDBYTE10
CMP SECONDVALUE10
BNE LOOP3920
LDA RECEIVEDBYTE11
CMP SECONDVALUE11
Κώδικας Assembly των δύο µικροελεγκτών - 23 -
BNE LOOP3920
LDA RECEIVEDBYTE12
CMP SECONDVALUE12
BNE LOOP3920
LDA RECEIVEDBYTE13
CMP SECONDVALUE13
BNE LOOP3920
INC SECONDVALUECOUNT
LDA SECONDVALUECOUNT
CMP #31
BEQ SECONDVALUEMAX
JMP LOOP77
LOOP3910 BRA LOOP39100
LOOP3920 BRA LOOP39200
SECONDVALUEMAX LDA SECONDVALUECOUNT
STA CORRECTPAIRSCOUNT
STA SAMEVALUEPAIRS
LDA SECONDVALUE0
STA CORRECT0
LDA SECONDVALUE1
STA CORRECT1
LDA SECONDVALUE2
STA CORRECT2
LDA SECONDVALUE3
STA CORRECT3
LDA SECONDVALUE4
STA CORRECT4
LDA SECONDVALUE5
STA CORRECT5
LDA SECONDVALUE6
STA CORRECT6
LDA SECONDVALUE7
STA CORRECT7
LDA SECONDVALUE8
STA CORRECT8
LDA SECONDVALUE9
STA CORRECT9
LDA SECONDVALUE10
STA CORRECT10
LDA SECONDVALUE11
STA CORRECT11
LDA SECONDVALUE12
STA CORRECT12
LDA SECONDVALUE13
STA CORRECT13
JMP EXIT1
LOOP39100 LDA RECEIVEDBYTE0
STA SECONDVALUE0
LDA RECEIVEDBYTE1
STA SECONDVALUE1
LDA RECEIVEDBYTE2
STA SECONDVALUE2
LDA RECEIVEDBYTE3
STA SECONDVALUE3
LDA RECEIVEDBYTE4
STA SECONDVALUE4
LDA RECEIVEDBYTE5
STA SECONDVALUE5
LDA RECEIVEDBYTE6
STA SECONDVALUE6
LDA RECEIVEDBYTE7
Κώδικας Assembly των δύο µικροελεγκτών - 24 -
STA SECONDVALUE7
LDA RECEIVEDBYTE8
STA SECONDVALUE8
LDA RECEIVEDBYTE9
STA SECONDVALUE9
LDA RECEIVEDBYTE10
STA SECONDVALUE10
LDA RECEIVEDBYTE11
STA SECONDVALUE11
LDA RECEIVEDBYTE12
STA SECONDVALUE12
LDA RECEIVEDBYTE13
STA SECONDVALUE13
INC SECONDVALUECOUNT
JMP LOOP77
LOOP39200 LDA THIRDVALUECOUNT
CMP #1
BLO LOOP3930
LDA RECEIVEDBYTE0
CMP THIRDVALUE0
BNE LOOP77
LDA RECEIVEDBYTE1
CMP THIRDVALUE1
BNE LOOP77
LDA RECEIVEDBYTE2
CMP THIRDVALUE2
BNE LOOP77
LDA RECEIVEDBYTE3
CMP THIRDVALUE3
BNE LOOP77
LDA RECEIVEDBYTE4
CMP THIRDVALUE4
BNE LOOP77
LDA RECEIVEDBYTE5
CMP THIRDVALUE5
BNE LOOP77
LDA RECEIVEDBYTE6
CMP THIRDVALUE6
BNE LOOP77
LDA RECEIVEDBYTE7
CMP THIRDVALUE7
BNE LOOP77
LDA RECEIVEDBYTE8
CMP THIRDVALUE8
BNE LOOP77
LDA RECEIVEDBYTE9
CMP THIRDVALUE9
BNE LOOP77
LDA RECEIVEDBYTE10
CMP THIRDVALUE10
BNE LOOP77
LDA RECEIVEDBYTE11
CMP THIRDVALUE11
BNE LOOP77
LDA RECEIVEDBYTE12
CMP THIRDVALUE12
BNE LOOP77
LDA RECEIVEDBYTE13
CMP THIRDVALUE13
BNE LOOP77
INC THIRDVALUECOUNT
LDA THIRDVALUECOUNT
Κώδικας Assembly των δύο µικροελεγκτών - 25 -
CMP #31
BEQ THIRDVALUEMAX
BRA LOOP77
LOOP77 BRA LOOP777
LOOP3930 JMP LOOP39300
THIRDVALUEMAX LDA THIRDVALUECOUNT
STA CORRECTPAIRSCOUNT
STA SAMEVALUEPAIRS
LDA THIRDVALUE0
STA CORRECT0
LDA THIRDVALUE1
STA CORRECT1
LDA THIRDVALUE2
STA CORRECT2
LDA THIRDVALUE3
STA CORRECT3
LDA THIRDVALUE4
STA CORRECT4
LDA THIRDVALUE5
STA CORRECT5
LDA THIRDVALUE6
STA CORRECT6
LDA THIRDVALUE7
STA CORRECT7
LDA THIRDVALUE8
STA CORRECT8
LDA THIRDVALUE9
STA CORRECT9
LDA THIRDVALUE10
STA CORRECT10
LDA THIRDVALUE11
STA CORRECT11
LDA THIRDVALUE12
STA CORRECT12
LDA THIRDVALUE13
STA CORRECT13
JMP EXIT1
LOOP39300 LDA RECEIVEDBYTE0
STA THIRDVALUE0
LDA RECEIVEDBYTE1
STA THIRDVALUE1
LDA RECEIVEDBYTE2
STA THIRDVALUE2
LDA RECEIVEDBYTE3
STA THIRDVALUE3
LDA RECEIVEDBYTE4
STA THIRDVALUE4
LDA RECEIVEDBYTE5
STA THIRDVALUE5
LDA RECEIVEDBYTE6
STA THIRDVALUE6
LDA RECEIVEDBYTE7
STA THIRDVALUE7
LDA RECEIVEDBYTE8
STA THIRDVALUE8
LDA RECEIVEDBYTE9
STA THIRDVALUE9
LDA RECEIVEDBYTE10
STA THIRDVALUE10
Κώδικας Assembly των δύο µικροελεγκτών - 26 -
LDA RECEIVEDBYTE11
STA THIRDVALUE11
LDA RECEIVEDBYTE12
STA THIRDVALUE12
LDA RECEIVEDBYTE13
STA THIRDVALUE13
INC THIRDVALUECOUNT
LOOP777 CPX #20
BLO NEXT40
BRA EXIT
EXIT
LDA FIRSTVALUECOUNT
CMP SECONDVALUECOUNT
BHI FIRSTGTSECOND
BLO SECONDGTFIRST
BRA FIRSTEQSECOND
FIRSTGTSECOND CMP THIRDVALUECOUNT
BHI FVMAX
BLO TVMAX
BRA FIRSTEQTHIRD
FVMAX JMP FIRSTVALUEMAX
SECONDGTFIRST LDA SECONDVALUECOUNT
CMP THIRDVALUECOUNT
BHI SVMAX
BLO TVMAX
BRA SECONDEQTHIRD
SVMAX JMP SECONDVALUEMAX
TVMAX JMP THIRDVALUEMAX
FIRSTEQSECOND LDA FIRSTVALUECOUNT
CMP THIRDVALUECOUNT
BHI SHUTDOWN3
BLO TVMAX
BRA SHUTDOWN3
SECONDEQTHIRD LDA FIRSTVALUECOUNT
CMP THIRDVALUECOUNT
BHI FVMAX
BLO SHUTDOWN3
BRA SHUTDOWN3
FIRSTEQTHIRD LDA SECONDVALUECOUNT
CMP THIRDVALUECOUNT
BHI SVMAX
BLO SHUTDOWN3
BRA SHUTDOWN3
SHUTDOWN3 BRA ALLERRORDISPLAY
EXIT1
LDA CORRECTPAIRSCOUNT
CMP #3
BHI NEXT3
ALLERRORDISPLAY LDA RECEIVESTATUS
CMP #$FF
BNE GOSTART
BSET 1,PORTC.DATA
Κώδικας Assembly των δύο µικροελεγκτών - 27 -
GOSTART JMP SHUTDOWN2
INIT2 JMP INIT
CORPAIRDISPL JMP CORPAIRDISPLAY
NEXT40 JMP LOOP0
NEXT3 LDA RECEIVESTATUS
CMP #$FF
BEQ CORPAIRDISPL
CMP #0
BNE INIT2
LDA SAMEVALUEPAIRS
ORA SECONDTIME
STA SAMEVALUEPAIRS
BRCLR 3,CODE,OUTWAY
LDA FIRSTVALUECOUNT
ORA SECONDTIME
STA CORRECT8
LDA SECONDVALUECOUNT
ORA SECONDTIME
STA CORRECT9
LDA THIRDVALUECOUNT
ORA SECONDTIME
STA CORRECT10
LDA INTERPACKETCOUNT
STA CORRECT11
LDA SYNCPULSESLT60
STA CORRECT12
LDA FGT2440HZCOUNT
STA CORRECT13
LDA FGT1400&FLT1640C
STA SAMEVALUEPAIRS
OUTWAY RTS
************************
MAIN CLR PULSEPACKETS.NUM
AGAIN2 JSR Synchronization
LDA CODE
STA BYTETOBESEND0
JSR Send
INC PULSEPACKETS.NUM
LDA PULSEPACKETS.NUM
CMP #50
BEQ PULSEDOWN
CLRA
AGAIN3 INCA
CMP #1
BEQ AGAIN2
BRA AGAIN3
PULSEDOWN BSET 0,TIMER.CONTROL
JSR TIMEWAIT
Κώδικας Assembly των δύο µικροελεγκτών - 28 -
NOP
NOP
NOP
NOP
BCLR 0,PortC.Data
NOP
NOP
RTS
Send CLR ShiftedBits
Send1 LDA ShiftedBits
INCA
CMP BitsToBeSend
BLO Send2
BRA ExitSend
Send2 STA ShiftedBits
JSR ShiftBit
JSR TimeWait
JSR TimeWait
BRA Send1
ExitSend RTS
ShiftBit LSL ByteToBeSend0
CLRX
ROLX
STX PulseW.Status
RTS
TimeWait LDX PulseW.Status
LDA Timer.Status
LDA Timer.Control
EOR #%00000001
STA Timer.Control
LDA Counts.LowByte,X
ADD OutCom.LowByte
STA OutCom.LowByte~
LDX PulseW.Status
LDA Counts.HighByte,X
ADC OutCom.HighByte
STA OutCom.HighByte
LDA OutCom.LowByte~
STA OutCom.LowByte
OutComFlag.Clr BRCLR 6,Timer.Status,OutComFlag.Clr
LDA Timer.Status
RTS
Synchronization LDA SynPul.Level
STA PulseW.Status
BCLR 0,Timer.Control
JSR TimeWait
JSR TimeWait
JSR TimeWait
CLR SynPul.Counter
Synchronization1 LDA SynPul.Counter
INCA
CMP SynPul.Num
BLO Synchronization2
BRA ExitSynchron1
Κώδικας Assembly των δύο µικροελεγκτών - 29 -
Synchronization2 STA SynPul.Counter
JSR TimeWait
JSR TimeWait
BRA Synchronization1
ExitSynchron1 LDA PulseW.Status
EOR #%00000001
STA PulseW.Status
JSR TimeWait
JSR TimeWait
ExitSynchronize RTS
TESTCONTROL
LDA PORTD.DATA
AND #%00000011
CMP #0
BEQ OUT0
CMP #1
BEQ OUT1
CMP #3
BEQ OUT3
CMP #2
BEQ OUT2
BRA TESTCONTROL
OUT0 CLR RECEIVESTATUS
JMP INIT
OUT1 BRA RXD
OUT2 BRA TXD1
OUT3 BRA TXD
TXD BCLR 1,PORTC.DATA
LDA #9
STA BITSTOBESEND
LDA #201
STA SYNPUL.NUM
CLR SYNPUL.LEVEL
LDA #%00000000
STA CODE
JSR MAIN
BRA TESTCONTROL
TXD1 BCLR 1,PORTC.DATA
LDA #9
STA BITSTOBESEND
LDA #101
STA SYNPUL.NUM
CLR SYNPUL.LEVEL
LDA #%00110011
STA CODE
JSR MAIN
BRA TESTCONTROL
RXD LDA #$FF
STA RECEIVESTATUS
JMP START
CORPAIRDISPLAY
LDX SAMEVALUEPAIRS
CPX #20
BHS LEDOFF
Κώδικας Assembly των δύο µικροελεγκτών - 30 -
LEDONLOOP
JSR LEDON
BCLR 1,PORTC.DATA
JSR LEDOFFTIMER
JSR LEDOFFTIMER
JSR LEDOFFTIMER
JSR LEDOFFTIMER
JSR LEDOFFTIMER
JSR LEDOFFTIMER
JSR LEDOFFTIMER
JSR LEDOFFTIMER
JSR LEDOFFTIMER
INCX
CPX #20
BEQ LEDOFF
BRA LEDONLOOP
LEDOFF BCLR 1,PORTC.DATA
JMP TESTCONTROL
LEDON BSET 1,PORTC.DATA
LEDOFFTIMER JSR DELAY50MS
RTS
DELAY50MS
LDA TIMER.STATUS
LDA TIMER.CONTROL
LDA COUNT.HIGHBYTE
STA COUNT.HIGHBYTE~
LDA COUNT.LOWBYTE
ADD #$A8
STA OUTCOM.LOWBYTE~
LDA COUNT.HIGHBYTE~
ADC #$61
STA OUTCOM.HIGHBYTE
LDA OUTCOM.LOWBYTE~
STA OUTCOM.LOWBYTE
TIMERLOOP3 BRCLR 6,TIMER.STATUS,TIMERLOOP3
RTS
*
* Dlay50ms : 50 ms delay routine
*
Dlay50ms STA TEMPA
STX TEMPX
LDA #32
OutLoop CLRX
InLoop DECX
BNE InLoop
DECA
BNE OutLoop
LDX TEMPX
LDA TEMPA
RTS ;End of Delay50ms routine
Κώδικας Assembly των δύο µικροελεγκτών - 31 -
*
* Delay1-5ms : 1.5 ms delay
*
Delay1-5ms STX TEMPX
CLRX
InLoop2 DECX
BNE InLoop2
RTS ; End of Delay1-5ms routine
ORG $1EE0
Counts.LowByte FDB $FA7D
Counts.HighByte FDB $0000
ORG $1FF0
FDB $0000
ORG $1FFE
FDB INIT
END
Λίστα assembly 2ου
µικροελεγκτή
5ο
αρχείο : MINILCD.ASM. Το αρχείο αυτό αποτελεί την έκδοση του προγράµµατος
του 2ου
µικροελεγκτή για την µικρή οθόνη.
* MiniLCD.asm - Mini LCD controller program .
* Tolis Stavrakoudis
*
* Port A --> LCD output (out) & Data input from 1st microc. (in)
*
* Port B : bits 0-3 --> Get station number from dip switches (in)
*
* Port B : bit 4 --> LCD R/W pin (out)
* Port B : bit 5 --> LCD RS pin (out)
* Port B : bit 6 --> LCD E1 pin (enable 1) (out)
* Port B : bit 7 --> LCD E2 pin (enable 2) (out)
*
* Port C : bit 0 --> Get start signal from push button (in)
* Port C : bit 1 --> Send start receiving data to 1st microc. (out)
* Port C : bit 2 --> Ready to receive next byte from 1st microc. (out)
* Port C : bit 3 --> (1st microc.) Sending next byte. Get ready ! (in)
$BASE 10T ; Decimal notation
PORTA EQU $00 ; PORT A
DDRA EQU $04 ; PORT A direction
PORTB EQU $01 ; PORT B
DDRB EQU $05 ; PORT B direction
PORTC EQU $02 ; PORT C
DDRC EQU $06 ; PORT C direction
ORG $A0 ; Variables
TEMPA RMB 1 ; Temporary accumulator
TEMPX RMB 1 ; Temporary X register
TEMP1 RMB 1 ; Temporary byte 1 (general porpose)
TEMP2 RMB 1 ; Temporary byte 2 (general porpose)
Station RMB 1 ; Station number ( 1 - 16)
Κώδικας Assembly των δύο µικροελεγκτών - 32 -
Cnt RMB 1 ; Counter for bytes that come in
BCDCnt RMB 1 ; BCD Counter used in Bin2BCD proc
BCDout RMB 1 ; Byte in BCD format written from Bin2BCD proc
Bytes RMB 15 ; All the data bytes together
ORG $100 ; Starting program at position 100h
INIT ; Initialization proc
LDA #$00
STA DDRA ; Port A is INPUT
LDA #$F0 ; Port B : PB0 - PB3 : IN
STA DDRB ; PB4 - PB7 : OUT
BCLR 4,PORTB ; R/W = 0
BCLR 5,PORTB ; RS = 0
BCLR 6,PORTB ; E1 = 0
BCLR 7,PORTB ; E2 = 0
LDA #%11110110
STA DDRC ; Port C : PC0 : IN
; PC1 : OUT
; PC2 : OUT
; PC3 : IN ( From 1st microcontroller)
BCLR 1,PORTC ; PC1 = 0 (Start operation)
BCLR 2,PORTC ; PC2 = 0 (Send next byte)
BCLR 4,PORTC
CLR TEMPA ; Clearing all temporary bytes
CLR TEMPX
CLR TEMP1
CLR TEMP2
CLR Station ; Clearing station number
CLR Cnt ; Clear counter
START ; Program starts here
LDA PORTC ; Wait for start signal
AND #1
BEQ START
BEGIN ; Begin operation
LDA PORTB ; Load Port B into accumulator
AND #$0F ; Only the PB0 - PB3 is active
STA Station ; Store station number to Station
BSET 1,PORTC ; PC1 = 1.Start operation signal send to 1st
microc.
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP ; Just a delay
BCLR 1,PORTC ; PC1 = 0 . Start operation = 0
Receive ; Receive data from 1st microc.
STX TEMPX ; Store X to TEMPX
CLRX
CLR Cnt
Κώδικας Assembly των δύο µικροελεγκτών - 33 -
BytesIn
NOP
NOP
NOP
NOP
NOP ; Delay in order to get next byte properly
LDA PORTC ; Check if PC3 = 1
AND #%00001000
BEQ BytesIn ; If PC3 = 0 goto ByteIn
BSET 4,PORTC ; Test LED on
NOP
NOP
NOP
NOP
LDA PORTA ; Get byte in
STA Bytes,X ; Store to Bytes table + X possition
INC Cnt ; Increase Counter
INCX ; Increase X register memory shift in Bytes
table
LDA #15
CMP Cnt ; Compare Cnt with 15
BEQ RecEnd ; If Cnt = 15 leave
JMP BytesIn ; Go up for next byte...
RecEnd ; End of data exchange
LDX TEMPX ; Restore old X value
LDA #$FF
STA DDRA ; Port A is exit now for the LCD display
LDA #0
STA PORTA ; Port A = 0
CLR Cnt ; Clear Counter
BSET 4,PORTC ; Test bit -> 1
JSR InitLCD ; Initialize the LCD
JSR WriteData ; Write Bytes data to 3rd line of the LCD
JSR InitLCD2 ; Second row
JSR DataStation ; Write Station in line 1
HERE BRA HERE ; Ready to receive new operation for another
station
*******************************************************
* WriteData : Write Bytes data to 3rd line of the LCD *
* Write Bytes to 3rd line *
* Format is XX XX XX XX-XX XX XX XX (where XX in hex) *
*******************************************************
WriteData
STX TEMPX
STA TEMPA
CLR Cnt ; Clear counter
CLRX
MainLoop
LDA Bytes,X ; Load acca with Bytes[X] data each time
STA TEMP1
AND #$F0 ; Upper 4 bits
ASRA
ASRA
Κώδικας Assembly των δύο µικροελεγκτών - 34 -
ASRA
ASRA
AND #$0F ; Bit 7 is sure 0
CMP #9 ; Is a number?
BHI AF ; No.Then it's a letter A to F (Jump AF)
ADD #48 ; Make it ASCII number
JSR WDAT ; And write it...
JMP Dig1
AF ADD #55 ; Make it ASCII letter A-F
JSR WDAT ; And write it
Dig1
LDA TEMP1 ; Go for second hex digit
AND #$0F ; 4 lower bits only
CMP #9 ; Is a number?
BHI AF2 ; No.Then it's a letter A to F (Jump AF)
ADD #48 ; Make it ASCII number
JSR WDAT ; And write it...
JMP Dig2
AF2 ADD #55 ; Make it ASCII letter A-F
JSR WDAT ; And write it
Dig2
LDA #$20
JSR WDAT ; Write a space
INC Cnt ; Bytes written
INCX ; Also X register
LDA Cnt
CMP #8 ; If display on 6th byte -> 1 line down
BNE Next
LDA #%11000000
JSR WCTRL
LDA Cnt
Next CMP #15 ; Bytes = 15 ?
BEQ NoLoop ; Exit...
JMP MainLoop ; Next byte...
NoLoop LDA TEMPA
LDX TEMPX
CLR Cnt
CLR TEMP1 ; All temporary variables to old values...
RTS ; Exit WriteData proc
***************************************************************************
* DataStation : Write Station : xx (xx = 1-16) to the first line of the LCD
* Input : Station byte (binary)
* Accumulator unchanged
***************************************************************************
DataStation ; Procedure starts here
STA TEMPA ; Store accu to TEMPA
; Start writing 'Station : '
LDA #$53
JSR WDAT2 ; 'S'
LDA #$74
JSR WDAT2 ; 't'
LDA #$61
JSR WDAT2 ; 'a'
LDA #$74
JSR WDAT2 ; 't'
LDA #$69
JSR WDAT2 ; 'i'
LDA #$6F
JSR WDAT2 ; 'o'
Κώδικας Assembly των δύο µικροελεγκτών - 35 -
LDA #$6E
JSR WDAT2 ; 'n'
LDA #$20
JSR WDAT2 ; ' '
LDA #$3A
JSR WDAT2 ; ':'
LDA #$20
JSR WDAT2 ; ' '
; Procced with station number
LDA Station
JSR Bin2BCD ; Convert station to readable format
LDA BCDout ; Output to acca
AND #$F0 ; First 4 bits (If exist)
CMP #0
BEQ Digit2
ASRA ; 4 bits to the right
ASRA
ASRA
ASRA
AND #$0F ; Eliminate bit7 from being 1, if any...
ADD #48 ; number + 48 --> ASCII number in LCD
JSR WDAT2 ; And write it to the LCD
Digit2 LDA BCDout ; Load BCDout again for second digit (main)
AND #$0F ; 4 lower bits only
ADD #48 ; Same procedure again...
JSR WDAT2 ; And write it to the LCD
LDA TEMPA ; Restore acca old value
RTS ; Leave DataStation proc
*************************************************
* InitLCD : Initialize LCD display's first line *
* Just sending commands... *
* Acca remains as was *
*************************************************
InitLCD
STA TEMPA ; Store acca
LDA #$01
JSR WCTRL ; Send clear
LDA #$02
JSR WCTRL ; Send Home
LDA #$38
JSR WCTRL ; Function Set : 8 bit, 2 line, 5x7 font
LDA #$0C
JSR WCTRL ; Display on, Cursor off
LDA #$06
JSR WCTRL ; Entry mode : Increase address, no shift
LDA TEMPA
RTS ; Leave InitLCD proc
************************************************
* WCTRL : Write control word to LCD (1st line) *
* Input : accu *
************************************************
WCTRL
STX TEMPX ; Store X register
STA PORTA ; Data out
BSET 6,PORTB ; E1 --> 1
BCLR 6,PORTB ; E1 --> 0
Κώδικας Assembly των δύο µικροελεγκτών - 36 -
LDX #20 ; 60 µsec delay
L120u DECX
BNE L120u
CMP #$02 ; If command > $02
BHI ARN5m ; then goto ARN5m
L5m JSR ANRTS ; else jump to an RTS command
DECX
BNE L5m ; 2.5 msec delay
ARN5M LDX TEMPX
CLR TEMPX
ANRTS RTS ; Return to program (exit WCTRL proc)
********************************************
* WDAT : Write data word to LCD (1st line) *
* Input : acca *
********************************************
WDAT
STX TEMPX ; Store X register
STA TEMPA ; Store accu
STA PORTA ; Data out
BSET 5,PORTB ; RS --> 1
BSET 6,PORTB ; E1 --> 1
BCLR 6,PORTB ; E1 --> 0
BCLR 5,PORTB ; RS --> 0
LDX #20 ; 60 µsec delay
L120 DECX
BNE L120
LDA TEMPA ; Initial value to acca and X registers
CLR TEMPA
LDX TEMPX
CLR TEMPX
RTS ; Return to program (exit WDAT proc)
*******************************************
* Bin2BCD proc : Binary to BCD conversion *
* Input : accu / output : BCDout *
* 2 digits maximum *
*******************************************
Bin2BCD
STA TEMP2 ; Store accu to TEMP2
CLR BCDCnt ; Zero BCDCounter
MainBCD CMP #9 ; Load accu into Val and compare with 9
BHI Subtract ; One decade down if Val > 9
STA TEMP1
LDA BCDCnt ; Load number of decades into accu
ASLA ; and shift left 4 times to get the
ASLA ; decades digit
ASLA
ASLA
ORA TEMP1 ; MSB (or) LSB --> BCD out
STA BCDout ; BCDout is the result in BCD format
LDA TEMP2 ; Store initial value to accu
CLR TEMP2 ; and clear TEMP2
RTS ; Return from Bin2BCD proc
Subtract SUB #10 ; Subtract 10
INC BCDCnt
JMP MainBCD
Κώδικας Assembly των δύο µικροελεγκτών - 37 -
ORG $1FF0
FDB $0000
ORG $1FFE ; RESET vector
FDB INIT
6ο
αρχείο : MAINLCD.ASM. Το αρχείο αυτό αποτελεί την έκδοση του προγράµµατος του
2ου
µικροελεγκτή για την µεγάλη οθόνη.
*************************************************************************
** MainLCD.asm - LCD controller program (FINAL VERSION).
** Tolis Stavrakoudis
**
** Port A : bits 0-7 --> LCD output(out), Data input from 1st microc.(in)
**
** Port B : bits 0-3 --> Get station number from dip switches (in)
** Port B : bit 4 --> LCD R/W pin (out)
** Port B : bit 5 --> LCD RS pin (out)
** Port B : bit 6 --> LCD E1 pin (enable 1) (out)
** Port B : bit 7 --> LCD E2 pin (enable 2) (out)
**
** Port C : bit 0 --> Get start signal from push button (in)
** Port C : bit 1 --> Send start receiving data to 1st microc. (out)
** Port C : bit 2 --> Ready to receive next byte from 1st microc. (out)
** Port C : bit 3 --> (1st microc.) Sending next byte (in)
** Port C : bit 4 --> Line up button (in)
** Port C : bit 5 --> Line down button (in)
*************************************************************************
$BASE 10T ; Decimal notation
PortA EQU $00
PortB EQU $01
PortC EQU $02
DDRA EQU $04 ; Direction of portA
DDRB EQU $05 ; Direction of PortB
DDRC EQU $06 ; Direction of portC
RamLoop EQU $65 ; RAM code (5 bytes)
ORG $50 ; Variables
LineCnt RMB 1 ; Used in data selection (0,1,2,3)
TempCnt RMB 1
Temp RMB 1
TempA RMB 1
TempX RMB 1
Temp1 RMB 1
Temp2 RMB 1
Cnt RMB 1 ; Used in DIV32 proc & for data in
BCDout RMB 1 ; Out number from Bin2BCD proc
BCDCnt RMB 1
Station RMB 1 ; Station number ( 1 - 16)
Bytes RMB 15 ; Received bytes
RefMeasure RMB 2 ; Ultrasonic reference measurement
RealMeasure RMB 2 ; Ultrasonic real measurement
Channel0 RMB 2 ; Conductivity
Channel1 RMB 2 ; pH
Channel2 RMB 2 ; Oxygen
Channel3 RMB 2 ; Water temperature
Channel2_0 RMB 2 ; Air temperature
Κώδικας Assembly των δύο µικροελεγκτών - 38 -
Channel2_1 RMB 2 ; System temperature
Channel2_2 RMB 2 ; Battery voltage
Flag RMB 1 ; flag
input1 RMB 4 ; 32 bit addition and subtraction
input2 RMB 4
sum RMB 4
diff RMB 4
multp RMB 4 ; 32 bit multiplication
mulcan RMB 4
mtemp RMB 4
dvdnd RMB 4 ; 32 bit division
divisor RMB 4
quo RMB 4
TempAx RMB 4 ; Temp ax
Tempb RMB 4 ; Temp b constant
TempBc RMB 1
TempAxc RMB 1 ; Temporary Control bytes
Final1 RMB 4
Final2 RMB 4 ; Final results for both lines
Final1C RMB 1
Final2C RMB 1 ; Final results' control bytes
PStation RMB 2 ; Pointer to station's relative address
Alarm RMB 1 ; Alarm control byte
TmpCnt2 RMB 1 ; Temporary Cnt
* Variables ends here
ORG $100 ; Program starts here
INIT
NOP
NOP
NOP
NOP ; Delays in case of RESET signal
LDA #$FF
STA DDRA ; Port A is output
LDA #$F0 ; Port B : PB0 - PB3 : IN
STA DDRB ; PB4 - PB7 : OUT
BCLR 4,PORTB ; R/W = 0
BCLR 5,PORTB ; RS = 0
BCLR 6,PORTB ; E1 = 0
BCLR 7,PORTB ; E2 = 0
LDA #%11000110
STA DDRC ; Port C : in/out
CLR PORTC
CLR PORTB
CLR TEMPA ; Clearing all temporary bytes
CLR TEMPX
CLR TEMP1
CLR TEMP2
CLR Station ; Clearing station number
CLR Cnt ; Clear counter
LDA #0
STA LineCnt ; Clear line counter (Line = 0)
CLR TempAx
Κώδικας Assembly των δύο µικροελεγκτών - 39 -
CLR TempAx+1
CLR TempAx+2
CLR TempAx+3
CLR Tempb
CLR Tempb+1
CLR Tempb+2
CLR Tempb+3
CLR mulcan
CLR mulcan+1
CLR mulcan+2
CLR mulcan+3
CLR Final1
CLR Final1+1
CLR Final1+2
CLR Final1+3
CLR Final2
CLR Final2+1
CLR Final2+2
CLR Final2+3
JSR InitLCD ; LCD initialization
LDA #00
STA DDRA ; PortA is now input
START ; Staring program
LDA PORTC ; Wait for start signal
AND #1
BEQ START
BEGIN ; Begin operation
LDA PORTB ; Load Port B nto accumulator
AND #$0F ; Only the PB0 - PB3 is active
STA Station ; Store station number to Station
BSET 1,PORTC ; PC1 = 1 . Start operation signal send
to 1st microc.
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP ; Delay for signal to be understood
BCLR 1,PORTC ; PC1 = 0 . Start operation = 0
Receive
STX TEMPX ; Receive data from 1st microc.
CLRX ; Store X to TEMPX
CLR Cnt
BytesIn
NOP
NOP
NOP
NOP
NOP
LDA PORTC ; Check if PC3 = 1
AND #%00001000
BEQ BytesIn ; If PC3 = 0 goto ByteIn
BSET 6,PORTC ; Test LED on
Κώδικας Assembly των δύο µικροελεγκτών - 40 -
NOP
NOP
NOP
NOP
LDA PORTA ; Get byte in
STA Bytes,X ; Store to Bytes table + X possition
INC Cnt ; Increase Counter
INCX ; Increase X register memory shift in
Bytes table
LDA #15
CMP Cnt ; Compare Cnt with 15
BEQ RecEnd ; If Cnt = 15 leave
JMP BytesIn ; Go up for next byte...
RecEnd ; End of data exchange
LDX TEMPX ; Restore old X value
LDA #$FF
STA DDRA ; Port A is exit now for the LCD
display
LDA #0
STA PORTA ; Port A = 0
CLR Cnt ; Clear Counter
BSET 7,PORTC ; Test bit -> 1
JSR DecodeData ; Data decoding proc
JSR WriteData ; Write hex data bits
LineShow ; Show appropriate line in LCD 1st row
LDA #3 ;
CMP LineCnt ; 3 - LineCnt = ?
BHS OkLine1 ; If LineCnt <= 3 continue
SUB LineCnt ; Subtract it
AND #$7 ; Only 3 lower bits
* Now acca has the value 4 (Line up button on line 0)
* or the value 7 (Line down on line 3 gives FF -> 7 with AND)
CMP #4
BEQ OkLine2
LDA #3
STA LineCnt ; LineCnt has the value 3 again
BRA OkLine1 ; Jump to avoid zeroing
OkLine2 LDA #0
STA LineCnt ; LineCnt has the value 0 again
OkLine1 ; Line is ok...CONTINUE
JSR ShowMask ; Write mask on LCD
CLR Final1C ; Zero all these variables
CLR Final2C
CLR TempAxC
CLR TempbC
JSR ComputeVals ; Compute values
JSR ShowVals ; Print values on LCD
LineButton LDA PortC ; Get up-down signal
STA TempA ; Storing acca
AND #%00100000 ; Check for line down
BNE LineDown
LDA TempA ; Initial value
AND #%00010000 ; Check for line up
BNE LineUp
BRA LineButton ; If both signals are zero wait for key
LineDown INC LineCnt
LDA #10 ; 0.5 sec delay
STA Cnt
Κώδικας Assembly των δύο µικροελεγκτών - 41 -
Del1 LDA Cnt
CMP #0
BEQ Del1End
JSR Delay25ms ; Delay for button release
DEC Cnt
BRA Del1 ; Now the screen is ready to show
Del1End ; the first number
BRA LineShow ; Up to LineShow
LineUp DEC LineCnt
LDA #10 ; 0.5 sec delay
STA Cnt
Del2 LDA Cnt
CMP #0
BEQ Del2End
JSR Delay25ms
DEC Cnt
BRA Del2 ; Now the screen is ready to show
Del2End ; the first number
BRA LineShow ; Decrease LineCnt and show again
HERE BRA HERE ; Never ending loop (Program
termination)
*********************************
** Delay25ms : 25 msec delay **
** Restores acca & X registers **
*********************************
Delay25ms
STA input1
STX input1+1
LDA #32
OutLoop CLRX
InLoop DECX
BNE InLoop ; 256 TIMES (768 µsec)
DECA
BNE OutLoop
LDA input1
LDX input1+1 ; Total 24.7 msec
RTS ; End of Delay25ms proc
****************************************************
** WCTRL - Write control byte to LCD (1st line) **
** Input : acca -> control byte **
** Restores original values to acca and X **
****************************************************
WCTRL STX TEMPX
STA PORTA
BSET 6,PORTB ; E1 -> 1
BCLR 6,PORTB ; E1 -> 0
LDX #100
L120U DECX ; 60 µsec delay
BNE L120U
CMP #$02
BHI ARN5M
L5M JSR ARNTS ; 2.5 msec delay
DECX
BNE L5M
ARN5M LDX TEMPX
ARNTS RTS
Κώδικας Assembly των δύο µικροελεγκτών - 42 -
****************************************************
** WCTRL2 - Write control byte to LCD(2nd line) ***
** Input : acca -> control byte ***
** Restores original values to acca and X ***
****************************************************
WCTRL2 STX TEMPX
STA PORTA
BSET 7,PORTB ; E2 -> 1
BCLR 7,PORTB ; E2 -> 0
LDX #100
L120U2 DECX
BNE L120U2 ; 60 µsec delay
CMP #$02
BHI ARN5M2
L5M2 JSR ARNTS2
DECX
BNE L5M2 ; 2.5 msec delay
ARN5M2 LDX TEMPX
ARNTS2 RTS
***********************************************
** WDAT - Write data byte to LCD(1st line) ***
** Input : acca -> control byte ***
** Restores original values to acca and X ***
***********************************************
WDAT STX TEMPX
STA TEMPA
STA PORTA
BSET 5,PORTB ; RS -> 1
BSET 6,PORTB ; E1 -> 1
BCLR 6,PORTB ; E1 -> 0
BCLR 5,PORTB ; RS -> 0
LDX #100
L120 DECX
BNE L120
LDA TEMPA
LDX TEMPX
RTS
************************************************
** WDAT2 - Write data byte to LCD(2nd line) ***
** Input : acca -> control byte ***
** Restores original values to acca and X ***
************************************************
WDAT2 STX TEMPX
STA TEMPA
STA PORTA
BSET 5,PORTB ; RS -> 1
BSET 7,PORTB ; E2 -> 1
BCLR 7,PORTB ; E2 -> 0
BCLR 5,PORTB ; RS -> 0
LDX #100
L1202 DECX
BNE L1202
LDA TEMPA
LDX TEMPX
RTS
Κώδικας Assembly των δύο µικροελεγκτών - 43 -
***************************************************
** InitLCD : Initialize LCD display's first line **
** Just sending commands... **
** Accu remains as was **
***************************************************
InitLCD
STA TEMPA ; Store accu
LDA #$01
JSR WCTRL ; Send clear
JSR WCTRL2
LDA #$02
JSR WCTRL ; Send Home
JSR WCTRL2
LDA #$38
JSR WCTRL ; Function Set : 8 bit, 2 line, 5x7 font
JSR WCTRL2
LDA #$0C
JSR WCTRL ; Display on, Cursor off
JSR WCTRL2
LDA #$06
JSR WCTRL ; Entry mode : Increase address, no shift
JSR WCTRL2
LDA TEMPA
RTS ; End of InitLCD proc
*********************************************************
** WriteData : Write Bytes data to 3rd line of the LCD **
** Write Bytes to 3rd line **
** Format is XX XX XX XX-XX XX XX XX (where XX in hex) **
*********************************************************
WriteData
STX TEMPX
STA TEMPA
CLR Cnt ; Clear counter
CLRX
MainLoop
LDA Bytes,X ; Load accu with Bytes[X] data
STA TEMP1
AND #$F0 ; Upper 4 bits
ASRA
ASRA
ASRA
ASRA
AND #$0F ; Bit 7 is sure 0
CMP #9 ; Is a number?
BHI AF ; No.Then it's a letter A to F(Jump AF)
ADD #48 ; Make it ASCII number
JSR WDAT2 ; And write it...
JMP Dig1
AF ADD #55 ; Make it ASCII letter A-F
JSR WDAT2 ; And write it
Dig1
LDA TEMP1 ; Go for second hex digit
AND #$0F ; 4 lower bits only
CMP #9 ; Is a number?
BHI AF2 ; No.It's a letter A to F(Jump AF2)
ADD #48 ; Make it ASCII number
JSR WDAT2 ; And write it...
JMP Dig2
Κώδικας Assembly των δύο µικροελεγκτών - 44 -
AF2 ADD #55 ; Make it ASCII letter A-F
JSR WDAT2 ; And write it
Dig2
LDA #$20
JSR WDAT2 ; Write a space
INC Cnt ; Bytes written
INCX
LDA Cnt
CMP #8 ; If display on 6th byte -> 1 line down
BNE Next
LDA #192
JSR WCTRL2
LDA Cnt
Next CMP #15 ; Bytes = 15 ?
BEQ NoLoop ; Exit...
JMP MainLoop ; Next byte...
NoLoop
LDA #5 ; 8 right shifts of cursor
STA Cnt
ShiftLp2 LDA Cnt
CMP #0
BEQ ShiftLp2End
LDA #%00010100 ; Shift cursor to the right 1 char
JSR WCTRL2
DEC Cnt
BRA ShiftLp2 ; Now the screen is ready to show
ShiftLp2End ; the first number
LDA #$70 ; Write "pH:"
JSR WDAT2
LDA #$48
JSR WDAT2
LDA #$3A
JSR WDAT2
LDA Alarm
AND #$1 ; Check pH alarm
BEQ pHoff
LDA #$31
JSR WDAT2 ; Write 1 if on
BRA phAfter
pHoff LDA #$30
JSR WDAT2 ; Write 0 if off
phAfter LDA #$2C
JSR WDAT2 ; Write comma
LDA #$20
JSR WDAT2 ; Write 1 space
LDA #$6F ; Write "oxy:"
JSR WDAT2
LDA #$78
JSR WDAT2
LDA #$79
JSR WDAT2
LDA #$3A
JSR WDAT2
LDA Alarm
AND #$2 ; Check oxygen alarm
BEQ oxyOff
LDA #$31
JSR WDAT2 ; Write 1 if on
BRA oxyAfter
oxyOff LDA #$30
JSR WDAT2 ; Write 0 if off
Κώδικας Assembly των δύο µικροελεγκτών - 45 -
oxyAfter
LDA TEMPA
LDX TEMPX
CLR Cnt
CLR TEMP1 ; All temporary variables to old
values...
RTS ; Exit WriteData proc
*********************************************
** Bin2BCD proc : Binary to BCD conversion **
** Input : acca **
** Output : BCDout **
** 2 digits maximum **
** Restores original values to acca **
*********************************************
Bin2BCD
STA sum+3 ; Store accu to TEMP2
CLR BCDCnt ; Zero BCDCounter
MainBCD CMP #9 ; Load accu into Val and compare with 9
BHI Subtract ; One decade down if Val > 9
STA sum+2
LDA BCDCnt ; Load number of decades into accu
ASLA ; and shift left 4 times to get the
ASLA ; decades digit
ASLA
ASLA
ORA sum+2 ; MSB (or) LSB --> BCD out
STA BCDout ; BCDout is the result in BCD format
LDA sum+3 ; Store initial value to accu
RTS ; Return from Bin2BCD proc
Subtract SUB #10 ; Subtract 10
INC BCDCnt
BRA MainBCD ; Bin2BCD proc ends here
* This function is NOT used in that version of the program.
**************************************
** Bin2Hex - proc : Binary to hex ***
** LCD output ***
** Input : acca ***
** Output : LCD screen ***
** Restores original value to acca ***
**************************************
Bin2Hex
STA Temp1
AND #$F0 ; Upper 4 bits
ASRA
ASRA
ASRA
ASRA
AND #$0F ; Bit 7 is sure 0
CMP #9 ; Is a number?
BHI AFT ; No.It's a letter A to F(Jump AFT)
ADD #48 ; Make it ASCII number
JSR WDAT ; And write it...
AFT ADD #65 ; Make it ASCII letter A-F
JSR WDAT ; And write it
LDA Temp1 ; Go for second hex digit
AND #$0F ; 4 lower bits only
CMP #9 ; Is a number?
BHI AF2T ; No.It's a letter A to F(Jump AF2T)
Κώδικας Assembly των δύο µικροελεγκτών - 46 -
ADD #48 ; Make it ASCII number
JSR WDAT ; And write it...
AF2T ADD #65 ; Make it ASCII letter A-F
JSR WDAT ; And write it
LDA Temp1
RTS ; Leave Bin2Hex proc
*****************************************
** DecodeData proc - Decodes data from **
** 15 received bytes **
** Input : Bytes **
** Output : 16bit variables **
** Restores original values to acca **
*****************************************
DecodeData
STA TEMPA
LDA Bytes+6 ; Byte 7 : bits 0-7
STA Channel0+1
LDA Bytes+7 ; Byte 8 : bits 0-7
STA Channel1+1
LDA Bytes+8 ; Byte 9 : bits 0-7
STA Channel2+1
LDA Bytes+9 ; Byte 10 : bits 0-7
STA Channel3+1
LDA Bytes+5 ; Higher bits of channels 0-3
STA Temp
AND #$C0 ; 2 higher bits of acca
ASRA
ASRA
ASRA
ASRA
ASRA
ASRA ; 6 bits shift
AND #$03 ; Make sure all other bits are zero's
STA Channel0
LDA Temp
AND #$30 ; Bits 4 & 5 of acca
ASRA
ASRA
ASRA
ASRA ; 4 bits shift
AND #$03
STA Channel1
LDA Temp
AND #$0C ; Bits 2 & 3 of acca
ASRA
ASRA ; 2 bits shift
AND #$03
STA Channel2
LDA Temp
AND #$03 ; Bits 0 & 1 of acca
STA Channel3
LDA Bytes+11
STA Channel2_0+1
LDA Bytes+12
STA Channel2_1+1
LDA Bytes+13
STA Channel2_2+1
LDA Bytes+10
STA Temp ; Original value
Κώδικας Assembly των δύο µικροελεγκτών - 47 -
AND #$30 ; Bits 4 & 5 of acca
ASRA
ASRA
ASRA
ASRA ; 4 bits shift
AND #$03
STA Channel2_0 ; 2 higher bits
LDA Temp
AND #$0C ; Bits 2 & 3 of acca
ASRA
ASRA
AND #$03
STA Channel2_1 ; 2 higher bits
LDA Temp
AND #$03
STA Channel2_2 ; 2 higher bits
LDA Bytes+3
STA RealMeasure+1 ; Low byte of real measurement
LDA Bytes+4
STA RefMeasure+1 ; Low byte of reference measurement
LDA Bytes+2
AND #$0F ; 4 lower bits
STA RefMeasure ; 4 higher bits of RefMeasurement
LDA Bytes+2
AND #$F0 ; 4 higher bits of byte
ASRA
ASRA
ASRA
ASRA
STA RealMeasure ; 4 higher bits of real measurement
CLR Alarm ; Alarm byte clear
LDA Bytes+1 ; Get 2nd byte (Terminal received
correct pairs)
BIT #$80 ; Is bit7 1?
BEQ Alarm2 ; No check the other...
BSET 0,Alarm ; Yes, pH alarm on
Alarm2 BIT #$40 ; Is bit6 1?
BEQ AlarmEnd ; No ,exit.
BSET 1,Alarm ; Yes, oxygen alarm on
AlarmEnd CLR Temp
LDA TEMPA
RTS ; DecodeData proc ends here
*******************************************
** ShowMask - proc **
** input : LineCnt **
** output : LCD display **
** Restores acca, X **
** Mask : "Data name", number, "unit" **
** | | | **
** 20 bytes 15 spaces 5 bytes **
*******************************************
ShowMask
STA input1 ; Temporary storage of acca
STX input1+1 ; Temporary storage of X
LDA LineCnt ; Get Line
CLR BCDCnt ; BCDCnt(0->line 1 | 1 -> line 2)
LDX #50
MUL ; acca = LineCnt·50
CLR Cnt
STA Temp2 ; Temp2 has the relative address
LDX Temp2 ; Relative address to X
LDA #2
Κώδικας Assembly των δύο µικροελεγκτών - 48 -
JSR WCTRL ; Go home
BeforeMask LDA #20
STA Cnt
MaskLoop LDA MaskTbl,X ; Load MaskTable data
JSR WDAT ; Now writing "Data name"
DEC Cnt
BEQ MaskEnd1 ; Is Cnt=0?
INCX ; No.Increase address
BRA MaskLoop ; and jump up to MaskLoop
MaskEnd1 LDA #15 ; Write number's 10 spaces
STA Cnt
SpaceLoop1 LDA #$20 ; Space character
JSR WDAT
DEC Cnt
BNE SpaceLoop1 ; Cnt>0? -> Up to SpaceLoop1
INCX ; Continue with units
LDA #5
STA Cnt
UnitLoop1 LDA MaskTbl,X ; Load "unit"
JSR WDAT
DEC Cnt
BEQ UnitEnd1 ; Cnt=0? -> Exit
INCX
BRA UnitLoop1
UnitEnd1 INC BCDCnt
LDA BCDCnt
CMP #2
BEQ StrMaskEnd
INCX
LDA #192 ; Change line to LCD
JSR WCTRL
BRA BeforeMask ; All over again...
StrMaskEnd
LDA #2
JSR WCTRL ; Return display and cursor to original
; position (1st line : 1st character)
LDA #20 ; 20 right shifts of cursor
STA Cnt
ShiftLp LDA Cnt
CMP #0
BEQ ShiftLpEnd
LDA #%00010100 ; Shift cursor to the right 1 char
JSR WCTRL
DEC Cnt
BRA ShiftLp ; Now the screen is ready to show
ShiftLpEnd ; the first number
LDA input1
LDX input1+1
CLR input1
CLR input1+1
CLR Cnt
RTS ; ShowMask proc ends here
*****************************************************************
** AddThem - proc (Adds the final results) **
** input : TempAx,TempAxC | Tempb,TempbC | BCDCnt **
** output : Final1,Final1C or Final2,Final2C (BCDCnt depended) **
** Does not restore acca **
*****************************************************************
Κώδικας Assembly των δύο µικροελεγκτών - 49 -
AddThem
LDA TempAx
STA input1
LDA TempAx+1
STA input1+1
LDA TempAx+2
STA input1+2
LDA TempAx+3
STA input1+3
LDA Tempb
STA input2
LDA Tempb+1
STA input2+1
LDA Tempb+2
STA input2+2
LDA Tempb+3
STA input2+3
JSR ADD32
LDA BCDCnt
CMP #2 ;BCDCnt-2=0?
BEQ SecondLine ;Yes ->Jump to SecondLine
LDA sum ; else 1st line
STA Final1
LDA sum+1
STA Final1+1
LDA sum+2
STA Final1+2
LDA sum+3
STA Final1+3
LDA TempAxC
STA Final1C ; Data transfer completed(1st line)
BRA ExitAdd
SecondLine
LDA sum
STA Final2
LDA sum+1
STA Final2+1
LDA sum+2
STA Final2+2
LDA sum+3
STA Final2+3
LDA TempAxC
STA Final2C ; Data transfer completed(2nd line)
ExitAdd RTS ; AddThem proc ends here
*********************************************************************
** Equalize - proc (Prepare real data format for addition **
** input : ax->mulcan | b->Tempb | TempAxC | TempbC **
** output : ax->TempAx,TempAxC | b->Tempb,TempbC **
** Does not restore acca **
** Using divisor for ax power's prefix(1 if (ax)10^<0 **
** divisor+1 for b and **
** divisor+2 to indicate the number **
** to be multiplied (0 for ax and 1 for b) **
*********************************************************************
Equalize
LDA BCDCnt
STA TmpCnt2 ; Store BCDCnt to safe place...
CLR divisor ; ax's power prefix
CLR divisor+1 ; b's power prefix
CLR divisor+2 ; if 0, ax is to be multiplied, 1:b
LDA TempAxC ; Loading control byte
Κώδικας Assembly των δύο µικροελεγκτών - 50 -
AND #$40 ; Is ax's power (-)?
BEQ BCheckpow ; 1. No,then ax's power (+)
BSET 0,divisor ; 2. Yes,ax·10^N -> N(-)
BCheckpow LDA TempbC
AND #$40 ; Same job with b
BEQ OkCheck ; b's power (+)
BSET 0,divisor+1
OkCheck LDA divisor
EOR divisor+1 ; divisor (xor) divisor+1
BEQ Samepow ; If '0' jump to same pow
; else powers are different
LDA divisor ; Check for ax's power
AND #$01 ; Is it negative?
BEQ Bminuspow ; No,then b's power<0.Jump
BSET 0,divisor+2 ; else ax's power<0
Bminuspow ; b must be multiplied in order to
achive ax's power
* In that point divisor and divisor+1 have the prefixes of ax's and
* b's powers and divisor+2 indicates either ax or b is going to be
* multiplied.No min-max chack required
LDA divisor+2 ; Who is going to be multiplied?
AND #$01
BEQ AxMul ; If "0" ax must be multiplied
LDA TempAxC ; else b
AND #$0F ; only 4 lowerbits of a control byte
STA BCDCnt ; store temporalily
LDA TempbC
AND #$0F ; Same with b
ADD BCDCnt ; Add the powers
STA Cnt ; and store result in Cnt
LDA TempAxC ; load control byte again
AND #$40 ; and set same power to b
BEQ Setplusbpow ; if ax's power (+) set same to b
BSET 6,TempbC ; else b's power (-)
BRA JumpTmp1
Setplusbpow BCLR 6,TempbC
JumpTmp1 LDA TempAxC
AND #$0F ; only power bits
STA BCDCnt
LDA TempbC
AND #$F0 ; Keep only 4 higher bits of b control
ORA BCDCnt ; now b's power is the same with ax's
STA TempbC
BRA StartMul
AxMul LDA TempbC
AND #$0F ; 4 lower bitsa of b control
STA BCDCnt
LDA TempAxC
AND #$0F ; same with ax control byte
ADD BCDCnt
STA Cnt ; store to Cnt (Loops number)
LDA TempbC
AND #$40 ; set same power to ax
BEQ SetplusApow
BSET 6,TempAxC
BRA JumpTmp2
SetplusApow BCLR 6,TempAxC ; setting ax's power plus (as shown up)
JumpTmp2 LDA TempbC
AND #$0F
STA BCDCnt
LDA TempAxC
Κώδικας Assembly των δύο µικροελεγκτών - 51 -
AND #$F0 ; 4 upper bits only
ORA BCDCnt ; ax's power same with b's
STA TempAxC
BRA StartMul
SamePow LDA TempAxC ; Same powers.Find max power
AND #$0F
STA BCDCnt ; store temporalily
LDA TempbC
AND #$0F ; b - ax powers comparison
CMP BCDCnt
BMI AxGreaterb ; If negative ax > b
SUB BCDCnt ; else subtract them
STA Cnt ; store it in Cnt
BCLR 0,divisor+2 ; ax must bemultiplied
LDA TempbC
AND #$0F ; b's power
STA BCDCnt
LDA TempAxC
AND #$F0
ORA BCDCnt
STA TempAxC ; ax's power same with b's
BRA StartMul
AxGreaterb SUB BCDCnt ; b must be multiplied
NEGA ; subtract b-ax powers and negate them
STA Cnt ; Store it to Cnt
BSET 0,divisor+2 ; b multiplication
LDA TempAxC
AND #$0F ; ax's power
STA BCDCnt
LDA TempbC
AND #$F0
ORA BCDCnt
STA TempbC
StartMul LDA divisor+2 ; who is going to be multiplied?
CMP #0
BEQ AxMul32 ; if divisor+2="0" then ax->MUL32
LDA mulcan ; else b->MUL32
STA TempAx
LDA mulcan+1 ; exchange ax with b in mulcan...
STA TempAx+1
LDA mulcan+2
STA TempAx+2
LDA mulcan+3
STA TempAx+3
LDA Tempb
STA mulcan
LDA Tempb+1
STA mulcan+1
LDA Tempb+2
STA mulcan+2
LDA Tempb+3
STA mulcan+3 ; b is in mulcan now
LDA #$0A ; move 10 in multp
STA multp+3
CLR multp+2
CLR multp+1
CLR multp
CLR mtemp
CLR mtemp+1
CLR mtemp+2
CLR mtemp+3
bMulLoop LDA Cnt ; Cnt times loop
CMP #0 ; Compare with zero
Κώδικας Assembly των δύο µικροελεγκτών - 52 -
BEQ EndbMulLoop ; if zero end loop
JSR MUL32 ; multiply b(x)10
DEC Cnt ; Counter--
BRA bMulLoop ; data is in mulcan,so if Cnt>0
multiply again
EndbMulLoop LDA mulcan
STA Tempb
LDA mulcan+1
STA Tempb+1
LDA mulcan+2
STA Tempb+2
LDA mulcan+3
STA Tempb+3 ; Data all OK.
LDA mtemp+3 ; If mtemp(NOT)0 there is overflow
error
AND #$FF
BNE ErrorOver
LDA mtemp+2
AND #$FF
BNE ErrorOver
LDA mtemp+1
AND #$FF
BNE ErrorOver
LDA mtemp
AND #$FF
BNE ErrorOver
BRA ExitEq ; No overflow error.Exit...
AxMul32 LDA #$0A
STA multp+3
CLR multp+2
CLR multp+1
CLR multp
AxMulLoop LDA Cnt
CMP #0
BEQ EndAMulLoop ; Same with ax as above...
JSR MUL32
DEC Cnt
BRA AxMulLoop
EndAMulLoop LDA mulcan
STA TempAx
LDA mulcan+1
STA TempAx+1
LDA mulcan+2
STA TempAx+2
LDA mulcan+3
STA TempAx+3
LDA mtemp+3 ; If mtemp(NOT)0 there is overflow
error
AND #$FF
BNE ErrorOver
LDA mtemp+2
AND #$FF
BNE ErrorOver
LDA mtemp+1
AND #$FF
BNE ErrorOver
LDA mtemp
AND #$FF
BNE ErrorOver
BRA ExitEq
ErrorOver LDA #$2A ; Char "*"
JSR WDAT ; Write *OVER* in LCD display
LDA #$4F ; Char "O"
Κώδικας Assembly των δύο µικροελεγκτών - 53 -
JSR WDAT
LDA #$56 ; Char "V"
JSR WDAT
LDA #$45 ; Char "E"
JSR WDAT
LDA #$52 ; Char "R"
JSR WDAT
LDA #$2A ; Char "*"
JSR WDAT
ErrorHere
ExitEq CLR Cnt
CLR BCDCnt
CLR divisor
CLR divisor+1
CLR divisor+2
LDA TmpCnt2
STA BCDCnt ; BCDCnt has the number of the
line(0 or 1)
CLR TmpCnt2
RTS ; Equalize proc ends here
************************************************
** ComputeVals - proc ( Compute final values) **
** input : LineCnt, Station **
** output : Final1,Final1C | Final2,Final2C **
** Restores original values to X register **
************************************************
ComputeVals
CLR BCDCnt
CLR mulcan
CLR mulcan+1
CLR mulcan+2
CLR mulcan+3
CLR multp
CLR multp+1
CLR multp+2
CLR multp+3
CLR Flag ; Clear flag bits
STX Temp1 ; temp storage
LDA Station
STA Cnt
CMP #0 ; If Cnt>0
BNE ADD32Loop ; jump to ADD32Loop
LDA #$FF ; else move value $1BFF to PStation
STA PStation+1
LDA #$1B
STA PStation
BRA ExitAddLp ; and jump to end
ADD32Loop LDA #48 ; 1 station=48 bytes
STA input1+3 ; move 48 to prepare for addition
LDA #$FF
STA sum+3 ; move $1BFF to sum variable
LDA #$1B
STA sum+2
CLR sum+1
CLR sum
ADDlpCnt LDA sum+3
STA input2+3
LDA sum+2
STA input2+2
CLR input2+1
CLR input2
Κώδικας Assembly των δύο µικροελεγκτών - 54 -
JSR ADD32 ; sum=sum+48
DEC Cnt
BNE ADDLpCnt ; If Cnt>0 jump up
LDA sum+3 ; else move result in PStation
STA PStation+1
LDA sum+2
STA PStation ; Now PStation has the address
; of DataTable of each station
ExitAddLp LDA LineCnt
CLRX
LDX #12
MUL ; LineCnt*12->address pointer
TAX ; moving it to X
STX Temp2
LDA #$D6
STA RamLoop ; Hex code for LDA #$xxxx,X command
LDA PStation ; Address follows
STA RamLoop+1
LDA PStation+1
STA RamLoop+2
LDA #$81 ; Finally RTS command in machine code
STA RamLoop+3
StoreABc JSR RamLoop
STA TempAx+2
INCX
JSR RamLoop
STA TempAx+3 ; a constant is in TempAx variable
INCX
JSR RamLoop
STA TempAxC ; Control byte of a constant
CLR TempAx+1
CLR TempAx
INCX
JSR RamLoop
STA Tempb+2
INCX
JSR RamLoop
STA Tempb+3 ; b constant is in Tempb variable
INCX
JSR RamLoop
STA TempbC ; Control byte of b constant
CLR Tempb+1
CLR Tempb
INCX
STX Temp2 ; Temp2 has the next line's address...
LDA #4
LDX LineCnt ; acca(=address)=4*LineCnt
MUL
ADD BCDCnt ; acca=acca+BCDCnt
TAX ; if BCDCnt=2 (2nd line)
LDA RealMeasure,X
STA mulcan+2 ; Storing x data to prepare for MUL32
INCX ; a*x
LDA RealMeasure,X
STA mulcan+3
LDA TempAx+2
STA multp+2
LDA TempAx+3
STA multp+3
JSR MUL32 ; Multiply them
LDA LineCnt ; If LineCnt (OR) BCDCnt <> 0 continue
ORA BCDCnt ; else do the division(Refmeasure)
Κώδικας Assembly των δύο µικροελεγκτών - 55 -
BNE ContDiv
LDA mulcan
STA dvdnd
LDA mulcan+1
STA dvdnd+1
LDA mulcan+2
STA dvdnd+2
LDA mulcan+3
STA dvdnd+3
LDA RefMeasure
STA divisor+2
LDA RefMeasure+1
STA divisor+3
CLR divisor+1
CLR divisor ; Data transfered and ready for DIV32
JSR DIV32
LDA quo
STA mulcan
LDA quo+1
STA mulcan+1
LDA quo+2 ; transfering data to mulcan in
STA mulcan+2 ; order to have same protocol for
LDA quo+3 ; all data lines
STA mulcan+3
; Continue...
* Now mulcan has the resule a*x.Since x is an unsigned integer
* the control byte of ax will be the same with a.b is now in
* Tempb variable.b's control byte in TempbC
ContDiv LDA TempbC
AND #$80 ; Is last bit 1? (b(-))
BEQ Bplus ; No,then b>0.Jump
LDA TempAxC ; Yes,b<0 . Check a
AND #$80 ; Is last bit 1? (a(-))
BEQ AplusBminus ; No,then a>0 and b<0 . Jump
BSET 7,Flag ; Yes, a<0 , b<0 . Continue
BSET 6,Flag ; Set flags
BSET 5,Flag ; Final="1" (<0)
BRA ABsame ; Jump
Bplus LDA TempAxC ; Check for ax (b<0)
AND #$80 ; Is last bit 1? (a(-))
BNE AminusBplus ; No, a<0 and b>0 , Set flags
BCLR 6,Flag
BCLR 5,Flag ; Final="0" (>0)
BRA ABsame
AplusBminus BCLR 7,Flag ; a>0
BSET 6,Flag ; b<0
BRA ABdiff
AminusBplus BSET 7,Flag ; a<0
BCLR 6,Flag ; b>0
BRA ABdiff
ABsame JSR Equalize
JSR AddThem
JMP procEnd ; End of procedure...
ABdiff JSR Equalize
LDA #4
STA Cnt
CLRX ; X=0
Κώδικας Assembly των δύο µικροελεγκτών - 56 -
MinMaxLoop1 LDA Cnt ; Prepare for down counter with Cnt
CMP #0 ; Cnt-0=?
BEQ LoadOk1
LDA Tempb,X
CMP TempAx,X ; Tempb+x - TempAx+X = ? ( + or - )
BHI bGreatAx ; If b(i)>ax(i) *** CAREFULLY ***
BNE LoadOk1 ; and the result is not zero then jump
INCX ; X++
DEC Cnt ; Cnt=Cnt-1
BRA MinMaxLoop1
bGreatAx BSET 0,Flag ; |b|>|ax|
BRA After1
LoadOk1 BCLR 0,Flag ; |ax|>|b|
After1 LDA Flag ; If Flag[0]->"1"
AND #1
BNE bGreaterAx ; |b|>|ax|.Jump
CLRX ; else |ax|>|b|
LDA #4 ; Cnt=4
STA Cnt
SubLoop1 LDA Cnt
CMP #0
BEQ SubLoop1End
LDA TempAx,X ; Transfer data for subtraction
STA input1,X
LDA Tempb,X
STA input2,X
INCX
DEC Cnt
BRA SubLoop1
SubLoop1End JSR SUB32
CLRX
LDA BCDCnt ; 1st or 2nd line?
CMP #2 ; if BCDCnt=2->Final2
BEQ SecLine
LDA #4 ; else 1st line
STA Cnt
Loop2 LDA Cnt
CMP #0
BEQ Loop2End
LDA diff,X
STA Final1,X
INCX
DEC Cnt
BRA Loop2
Loop2End CLR Final1C
LDA TempAxC
AND #$80 ; ax<0 or ax>0
BEQ Final1plus ; if ax>0 jump
BSET 7,Final1C ; else ax<0
BRA After2
Final1plus BCLR 7,Final1C
After2 LDA TempAxC
AND #%01001111 ; We care only for the power and
; it's prefix
ORA Final1C
STA Final1C ; And put it in Final1C
BRA procEnd ; Go to end...
SecLine LDA #4
STA Cnt
Loop3 LDA Cnt
CMP #0
BEQ Loop3End
LDA diff,X
Κώδικας Assembly των δύο µικροελεγκτών - 57 -
STA Final2,X
INCX
DEC Cnt
BRA Loop3
Loop3End LDA TempAxC
AND #$80
BEQ Final2plus
BSET 7,Final2C
BRA After3
Final2plus BCLR 7,Final2C
After3 LDA TempAxC
AND #%01001111
ORA Final2C
STA Final2C
BRA procEnd ; Go to end...
bGreaterAx CLRX ; Same job...
LDA #4
STA Cnt
SubLoop2 LDA Cnt
CMP #0
BEQ SubLoop2End
LDA Tempb,X ; b->input1
STA input1,X
LDA TempAx,X ; ax-> input2
STA input2,X
INCX
DEC Cnt
BRA SubLoop2
SubLoop2End
LDA TempAxC
STA BCDout
LDA TempbC
STA TempAxC
LDA BCDout
STA TempbC
CLR BCDout
JMP SubLoop1End
procEnd
LDA BCDCnt ; Check for 2nd line
CMP #2
BEQ AllOk ; If BCDCnt=2 exit
LDX Temp2
INC BCDCnt
INC BCDCnt ; Make this counter 2 -> 2nd half of
line
JMP StoreABc ; Second line
AllOk CLR Cnt
CLR BCDCnt
LDX Temp1
RTS ; ComputeVals proc ends here
********************************************************
** ShowVals - proc (Show values to LCD) **
** input : Final1,Final1C | Final2,Final2C | LineCnt **
** output : LCD screen line 1 or 2 **
** Restores acca and X **
********************************************************
ShowVals
STA TEMP1 ; Storing acca
STX TEMP2 ; and X register
CLR TmpCnt2
Κώδικας Assembly των δύο µικροελεγκτών - 58 -
WhatLine LDA TmpCnt2
CMP #0
BNE Line2nd ; If LineCnt <> 0 it's line 2,so jump
LDA #4 ; else it's line No.1
STA Cnt
CLRX
Loop4 LDA Cnt
CMP #0
BEQ Loop4End
LDA Final1,X ; Moving Final1 to Tempb
STA Tempb,X ; to prepare for Bin2BCD32 proc
INCX
DEC Cnt
BRA Loop4
Loop4End LDA Final1C ; Control byte also included
STA TempbC
BRA PrepBCD
Line2nd LDA #4 ; Same with second line
STA Cnt
CLRX
Loop5 LDA Cnt
CMP #0
BEQ Loop5End
LDA Final2,X ; Moving Final2 to Tempb
STA Tempb,X ; to prepare for Bin2BCD32 proc
INCX
DEC Cnt
BRA Loop5
Loop5End LDA Final2C ; Control byte also included
STA TempbC
LDA #192
JSR WCTRL ; Next line in LCD display
LDA #20 ; 20 right shifts of cursor
STA Cnt
ShftLp LDA Cnt
CMP #0
BEQ ShftLpEnd
LDA #%00010100 ; Shift cursor to the right 1 char
JSR WCTRL
DEC Cnt
BRA ShftLp ; Now the screen is ready to show
ShftLpEnd ; the first number
PrepBCD ; All data ready for Bin2BCD32 proc
JSR Bin2BCD32
LDA TmpCnt2 ; Check for LineCnt
CMP #1 ; If it is 1 both of lines are ok...
BEQ LinesOk1 ; and exit
INC TmpCnt2 ; else LineCnt++
BRA WhatLine ; and jump up
LinesOk1
LDA #2
JSR WCTRL ; Reset cursor
LDX TEMP2
LDA TEMP1
RTS ; ShowVals proc ends here
Κώδικας Assembly των δύο µικροελεγκτών - 59 -
*********************************************************
** Bin2BCD32 - proc **
** input : Tempb,TempbC **
** output : LCD display **
** Proc uses Bytes (10 bytes) as temporary **
** storage of 10 decimal digits, because maximum hex **
** number is FFFFFFFF(16) = 4294967295(10) which has **
** 10 digits length **
** Format : ± number·10(±power) where : **
** number -> 4 higher digits of Final1 **
** power -> 2 digits(4 bits of TempbC) **
** TempCnt is used to indicate the number of digits **
** of the BCD number **
** Does NOT restore acca or X **
** Base logix : x' = x - 10*(x(div32)10) **
*********************************************************
Bin2BCD32
CLR Flag ; Flag will be used for end signal
LDA #10
STA Cnt
CLRX
Loop6 LDA Cnt
CMP #0
BEQ Loop6End
LDA #0 ; Moving 0 to Bytes(first 10 positions)
STA Bytes,X
INCX
DEC Cnt
BRA Loop6
Loop6End
CLR TempCnt
Startpoint LDA #$0A
STA multp+3 ; multp has always 10
CLR multp+2
CLR multp+1
CLR multp
LDA #$0A
STA divisor+3 ; divisor has always 10 also
CLR divisor+2
CLR divisor+1
CLR divisor
CLR quo+3
CLR quo+2
CLR quo+1
CLR quo
Div10Loop LDA #4
STA Cnt
CLRX
Loop7 LDA Cnt
CMP #0
BEQ Loop7End
LDA Tempb,X ; Moving Tempb to dvdnd
STA dvdnd,X ; to prepare for DIV32 proc
STA input1,X ; also moving it to input1 for
; the next subtraction
INCX
DEC Cnt
BRA Loop7
Loop7End
JSR DIV32
LDA quo
CMP #0
Κώδικας Assembly των δύο µικροελεγκτών - 60 -
BNE NotYet ; Check if quo < 10
LDA quo+1 ; Same for other bytes
CMP #0
BNE NotYet
LDA quo+2
CMP #0
BNE NotYet
LDA quo+3 ; If the higher order bytes are zero
CMP #$09 ; then check if quo < 10
BHI NotYet ; if it is, jump
INC Flag ; else Flag->"1" no more divisions
NotYet ; continue with other operations
LDA #4
STA Cnt
CLRX
Loop8 LDA Cnt
CMP #0
BEQ Loop8End
LDA quo,X ; Moving quo to mulcan
STA mulcan,X ; to prepare for MUL32 proc
INCX
DEC Cnt
BRA Loop8
Loop8End
JSR MUL32
LDA #4 ; Now I have to move mulcan to input2
STA Cnt
CLRX
Loop9 LDA Cnt
CMP #0
BEQ Loop9End
LDA mulcan,X ; Moving mulcan to input2
STA input2,X ; to prepare for SUB32 proc
INCX
DEC Cnt
BRA Loop9
Loop9End
JSR SUB32
LDA diff+3 ; Loading the difference
LDX TempCnt
STA Bytes,X ; and store it in Bytes+X position
; digits in Bytes is up-down
; i.e. Bytes[0] has the last BCD
; digit of the number
INC TempCnt ; Total digits ++
LDA Flag
CMP #0 ; Check Flag.If "1" exit
BNE ExitBCD32
LDA #4 ; Now I have to move diff to Tempb
STA Cnt
CLRX
Loop10 LDA Cnt
CMP #0
BEQ Loop10End
LDA quo,X ; Moving diff to Tempb
STA Tempb,X ; to prepare for next loop
INCX
DEC Cnt
BRA Loop10
Loop10End JMP Startpoint ; All over again...
ExitBCD32
Κώδικας Assembly των δύο µικροελεγκτών - 61 -
LDA quo+3
LDX TempCnt
STA Bytes,X ; Last digit in que...
ShowBCDLCD
LDA TempbC ; Load control
AND #$80 ; Number (+) or (-)
BEQ ContBCD1 ; (+) write nothing
LDA #$2D ; "-" character
JSR WDAT ; Write it
ContBCD1
LDA TempCnt ; How many digits?
STA Cnt
LDX TempCnt ; Backwards...
Loop11 LDA Cnt
CMP #0
BEQ Loop11End
LDA Bytes,X ; Moving Bytes to acca
ADD #$30 ; Make it visible digit
JSR WDAT ; Write it
DECX
DEC Cnt
BRA Loop11
Loop11End
LDA Bytes,X
ADD #$30
JSR WDAT ; Last digit
LDA TempbC ; Power check
AND #$0F ; Last 4 bits
CMP #0 ; Is power = 0?
BEQ ExitRout ; Yes, we have finished
LDA #$A5 ; "·" character
JSR WDAT
LDA #$31 ; "1" character
JSR WDAT
LDA #$30 ; "0" character
JSR WDAT
LDA #$28 ; "(" character
JSR WDAT
LDA TempbC ; power prefix
AND #%01000000 ; + or - power?
BEQ PlusWrite ; +, Do not write anything
LDA #$2D ; "-" character
JSR WDAT
PlusWrite LDA TempbC
AND #$0F ; Power number
JSR Bin2BCD
LDA BCDout
AND #$F0 ; 4 higher bits
ASRA
ASRA
ASRA
ASRA ; 4 bits shift
AND #$0F ; Just for insurance...
ADD #$30 ; number + $30 = LCD number digit
JSR WDAT
LDA BCDout
AND #$0F ; Last 4 bits
ADD #$30
JSR WDAT ; Power Ok...
LDA #$29 ; ")" character
JSR WDAT
ExitRout CLR Flag ; Clear Flag for future use
RTS ; Bin2BCD32 proc ends here
Κώδικας Assembly των δύο µικροελεγκτών - 62 -
**********************************************
** ADD32 - 32 bit addition **
** Inputs : input1, input2 **
** Output : sum (4 bytes) = input1 + input2 **
** sum + 3 -> low byte of result **
** Restores original value of acca **
**********************************************
ADD32
STA tempA
LDA input1+3 ; low byte addition
ADD input2+3
STA sum+3
LDA input1+2 ; medium low byte addition
ADC input2+2 ; add with carry
STA sum+2
LDA input1+1 ; medium high byte addition
ADC input2+1 ; add with carry
STA sum+1
LDA input1 ; high byte addition
ADC input2 ; add with carry
STA sum
LDA tempA
RTS ; ADD32 proc ends here
**********************************************
** SUB32 - 32 bit subtraction **
** Inputs : input1, input2 **
** Output : diff(4 bytes) = input1 - input2 **
** diff + 3 -> low byte of result **
** Restores original value of acca **
**********************************************
SUB32
STA tempA
LDA input1+3 ; low byte subtraction
SUB input2+3
STA diff+3
LDA input1+2 ; medium low byte subtraction
SBC input2+2 ; sub with carry
STA diff+2
LDA input1+1 ; medium high byte subtraction
SBC input2+1 ; sub with carry
STA diff+1
LDA input1 ; low byte subtraction
SBC input2 ; sub with carry
STA diff
LDA tempA
RTS ; SUB32 proc ends here
********************************************
** MUL32 - 32 bit multiplication **
** Inputs : multp, mulcan **
** Output : mtemp:mulcan = multp * mulcan **
** Restores original value of acca and X **
********************************************
MUL32
STA tempA
STX tempX
LDX #32
CLR mtemp
Κώδικας Assembly των δύο µικροελεγκτών - 63 -
CLR mtemp+1
CLR mtemp+2
CLR mtemp+3 ; clearing temporary variables for sure
ROR mulcan
ROR mulcan+1
ROR mulcan+2
ROR mulcan+3
Mnext BCC Rotate ; if carry is clear jump to rotate
LDA mtemp+3
ADD multp+3 ; addition
STA mtemp+3
LDA mtemp+2
ADC multp+2 ; addition with carry
STA mtemp+2
LDA mtemp+1
ADC multp+1 ; addition with carry
STA mtemp+1
LDA mtemp
ADC multp ; addition with carry
STA mtemp
Rotate ROR mtemp ; low bit->carry.All the other to the
right
ROR mtemp+1
ROR mtemp+2
ROR mtemp+3
ROR mulcan
ROR mulcan+1
ROR mulcan+2
ROR mulcan+3
DECX ; X = X - 1
BNE Mnext ; if X (not) 0 jump to Mnext
LDX tempX
LDA tempA
RTS ; MUL32 proc ends here
*************************************
** DIV32 - 32 bit division **
** Inputs : dvdnd, dvsor **
** Output : quo = dvdnd / dvsor **
** Restores original value of acca **
*************************************
DIV32
STA tempA
CLR quo
CLR quo+1
CLR quo+2
CLR quo+3
LDA #1 ; initial loop count
TST divisor ; if the high order bit is set there is
; no need to shift divisor (dvsor)
BMI Div153
Div151 INCA
ASL divisor+3
ROL divisor+2
ROL divisor+1
ROL divisor
BMI Div153
CMP #33
BNE Div151 ; if we haven't shifted all possible
; bits in the divisor jump to Div151
Div153 STA Cnt ; Save the loop counter
Div163 LDA dvdnd+3
Κώδικας Assembly των δύο µικροελεγκτών - 64 -
SUB divisor+3
STA dvdnd+3
LDA dvdnd+2
SBC divisor+2
STA dvdnd+2
LDA dvdnd+1
SBC divisor+1
STA dvdnd+1
LDA dvdnd
SBC divisor
STA dvdnd
BCC Div165 ; carry is clear if dvsor was larger
than dvdnd
LDA dvdnd+3 ; add the divisor back.It was larger
than the divident
ADD divisor+3
STA dvdnd+3
LDA dvdnd+2
ADC divisor+2
STA dvdnd+2
LDA dvdnd+1
ADC divisor+1
STA dvdnd+1
LDA dvdnd
ADC divisor
STA dvdnd
CLC ; this will clear the respective bit in
quo
; due to the need to add dvsor to dvdnd
BRA Div167
Div165 SEC
Div167 ROL quo+3 ; set or clear the low order bit in quo
based on above
ROL quo+2
ROL quo+1
ROL quo
LSR divisor
ROR divisor+1
ROR divisor+2
ROR divisor+3
DEC Cnt
BNE Div163
LDA TempA
RTS ; DIV32 proc ends here
ORG $1B36 ; String table starts here (200 bytes)
; Water level: | cm
; Conductivity: | -
; pH: | -
; Oxygen: | mg/lt
; Water temperature: | °C
; Air temperature: | °C
; System temperature: | °C
; Battery voltage: | V
Κώδικας Assembly των δύο µικροελεγκτών - 65 -
MaskTbl FCB
$57,$61,$74,$65,$72,$20,$6C,$65,$76,$65,$6C,$3A,$20,$20,$20,$20,$20,$20,$20,$20
FCB $63,$6D,$20,$20,$20 ; Water level:cm
FCB
$43,$6F,$6E,$64,$75,$63,$74,$69,$76,$69,$74,$79,$3A,$20,$20,$20,$20,$20,$20,$20
FCB $20,$20,$20,$20,$20 ; Conductivity:
FCB
$70,$48,$3A,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20
FCB $20,$20,$20,$20,$20 ; pH:
FCB
$4F,$78,$79,$67,$65,$6E,$3A,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20
FCB $6D,$67,$2F,$6C,$74 ; Oxygen:mg/lt
FCB
$57,$61,$74,$65,$72,$20,$74,$65,$6d,$70,$65,$72,$61,$74,$75,$72,$65,$3A,$20,$20
FCB $DF,$43,$20,$20,$20 ; Water temperature:°C
FCB
$41,$69,$72,$20,$74,$65,$6d,$70,$65,$72,$61,$74,$75,$72,$65,$3A,$20,$20,$20,$20
FCB $DF,$43,$20,$20,$20 ; Air temperature:°C
FCB
$53,$79,$73,$74,$65,$6D,$20,$74,$65,$6d,$70,$65,$72,$61,$74,$75,$72,$65,$3A,$20
FCB $DF,$43,$20,$20,$20 ; System temperature:°C
FCB
$42,$61,$74,$74,$65,$72,$79,$20,$76,$6F,$6C,$74,$61,$67,$65,$3A,$20,$20,$20,$20
FCB $56,$20,$20,$20,$20 ; Battery voltage:V
; Mesologi stations' data
ORG $1BFF ; Data table starts here (768 bytes)
DataTable FCB $02,$CC,$C1,$00,$F4,$00 ; Station 1
FCB $02,$ED,$44,$00,$7D,$44 ; Total : 48 bytes
FCB $00,$6B,$44,$00,$C7,$42
FCB $00,$D5,$44,$01,$64,$45
FCB $02,$15,$44,$01,$F3,$C2
FCB $00,$01,$41,$00,$1E,$80
FCB $00,$01,$41,$00,$1E,$80
FCB $01,$8F,$45,$03,$D9,$42
FCB $02,$C9,$C1,$00,$F3,$00 ; Station 2
FCB $02,$EA,$44,$02,$6E,$45 ; Total : 48 bytes
FCB $00,$6B,$44,$00,$02,$00
FCB $00,$D6,$44,$00,$8E,$C4
FCB $02,$16,$44,$01,$F3,$C2
FCB $00,$01,$41,$00,$1E,$80
FCB $00,$01,$41,$00,$1E,$80
FCB $01,$8F,$45,$00,$62,$41
FCB $02,$BF,$C1,$00,$F2,$00 ; Station 3
FCB $02,$EB,$44,$03,$AF,$46 ; Total : 48 bytes
FCB $00,$6B,$44,$00,$02,$00
FCB $00,$D5,$44,$00,$B2,$45
FCB $02,$17,$44,$01,$F3,$C2
FCB $00,$01,$41,$00,$1E,$80
FCB $00,$01,$41,$00,$1E,$80
FCB $01,$8C,$45,$03,$D2,$42
FCB $02,$BA,$C1,$00,$F1,$00 ; Station 4
FCB $00,$93,$43,$00,$7B,$42 ; Total : 48 bytes
FCB $00,$DB,$44,$00,$02,$00
FCB $01,$B7,$44,$00,$24,$44
FCB $00,$0B,$42,$01,$FF,$C2
FCB $01,$91,$43,$00,$60,$80
FCB $01,$8A,$43,$00,$90,$C1
FCB $01,$6B,$43,$01,$CD,$C3
Κώδικας Assembly των δύο µικροελεγκτών - 66 -
FCB $02,$7F,$C1,$00,$F0,$00 ; Station 5
FCB $01,$06,$43,$01,$E8,$C1 ; Total : 48 bytes
FCB $00,$6A,$42,$00,$02,$00
FCB $00,$C0,$44,$00,$00,$00
FCB $02,$15,$42,$00,$05,$C0
FCB $00,$01,$41,$00,$1E,$80
FCB $00,$01,$41,$00,$1E,$80
FCB $01,$88,$42,$03,$C6,$42
FCB $02,$41,$C1,$00,$E9,$00 ; Station 6
FCB $00,$02,$41,$00,$00,$00 ; Total : 48 bytes
FCB $00,$00,$20,$00,$00,$20
FCB $00,$01,$42,$00,$00,$00
FCB $00,$00,$20,$00,$00,$20
FCB $00,$01,$41,$00,$1E,$80
FCB $00,$01,$41,$00,$1E,$80
FCB $01,$88,$42,$03,$C6,$42
FCB $00,$00,$20,$00,$00,$20 ; Station 7
FCB $00,$00,$20,$00,$00,$20 ; Total : 48 bytes
FCB $00,$00,$20,$00,$00,$20
FCB $00,$00,$20,$00,$00,$20
FCB $00,$00,$20,$00,$00,$20
FCB $00,$00,$20,$00,$00,$20
FCB $00,$00,$20,$00,$00,$20
FCB $00,$00,$20,$00,$00,$20
FCB $00,$00,$20,$00,$00,$20 ; Station 8
FCB $00,$00,$20,$00,$00,$20 ; Total : 48 bytes
FCB $00,$00,$20,$00,$00,$20
FCB $00,$00,$20,$00,$00,$20
FCB $00,$00,$20,$00,$00,$20
FCB $00,$00,$20,$00,$00,$20
FCB $00,$00,$20,$00,$00,$20
FCB $00,$00,$20,$00,$00,$20
FCB $00,$00,$20,$00,$00,$20 ; Station 9
FCB $00,$00,$20,$00,$00,$20 ; Total : 48 bytes
FCB $00,$00,$20,$00,$00,$20
FCB $00,$00,$20,$00,$00,$20
FCB $00,$00,$20,$00,$00,$20
FCB $00,$00,$20,$00,$00,$20
FCB $00,$00,$20,$00,$00,$20
FCB $00,$00,$20,$00,$00,$20
FCB $00,$00,$20,$00,$00,$20 ; Station 10
FCB $00,$00,$20,$00,$00,$20 ; Total : 48 bytes
FCB $00,$00,$20,$00,$00,$20
FCB $00,$00,$20,$00,$00,$20
FCB $00,$00,$20,$00,$00,$20
FCB $00,$00,$20,$00,$00,$20
FCB $00,$00,$20,$00,$00,$20
FCB $00,$00,$20,$00,$00,$20
FCB $00,$00,$20,$00,$00,$20 ; Station 11
FCB $00,$00,$20,$00,$00,$20 ; Total : 48 bytes
FCB $00,$00,$20,$00,$00,$20
FCB $00,$00,$20,$00,$00,$20
FCB $00,$00,$20,$00,$00,$20
FCB $00,$00,$20,$00,$00,$20
FCB $00,$00,$20,$00,$00,$20
FCB $00,$00,$20,$00,$00,$20
Κώδικας Assembly των δύο µικροελεγκτών - 67 -
FCB $00,$00,$20,$00,$00,$20 ; Station 12
FCB $00,$00,$20,$00,$00,$20 ; Total : 48 bytes
FCB $00,$00,$20,$00,$00,$20
FCB $00,$00,$20,$00,$00,$20
FCB $00,$00,$20,$00,$00,$20
FCB $00,$00,$20,$00,$00,$20
FCB $00,$00,$20,$00,$00,$20
FCB $00,$00,$20,$00,$00,$20
FCB $00,$00,$20,$00,$00,$20 ; Station 13
FCB $00,$00,$20,$00,$00,$20 ; Total : 48 bytes
FCB $00,$00,$20,$00,$00,$20
FCB $00,$00,$20,$00,$00,$20
FCB $00,$00,$20,$00,$00,$20
FCB $00,$00,$20,$00,$00,$20
FCB $00,$00,$20,$00,$00,$20
FCB $00,$00,$20,$00,$00,$20
FCB $00,$00,$20,$00,$00,$20 ; Station 14
FCB $00,$00,$20,$00,$00,$20 ; Total : 48 bytes
FCB $00,$00,$20,$00,$00,$20
FCB $00,$00,$20,$00,$00,$20
FCB $00,$00,$20,$00,$00,$20
FCB $00,$00,$20,$00,$00,$20
FCB $00,$00,$20,$00,$00,$20
FCB $00,$00,$20,$00,$00,$20
FCB $00,$00,$20,$00,$00,$20 ; Station 15
FCB $00,$00,$20,$00,$00,$20 ; Total : 48 bytes
FCB $00,$00,$20,$00,$00,$20
FCB $00,$00,$20,$00,$00,$20
FCB $00,$00,$20,$00,$00,$20
FCB $00,$00,$20,$00,$00,$20
FCB $00,$00,$20,$00,$00,$20
FCB $00,$00,$20,$00,$00,$20
FCB $00,$00,$20,$00,$00,$20 ; Station 16
FCB $00,$00,$20,$00,$00,$20 ; Total : 48 bytes
FCB $00,$00,$20,$00,$00,$20
FCB $00,$00,$20,$00,$00,$20
FCB $00,$00,$20,$00,$00,$20
FCB $00,$00,$20,$00,$00,$20
FCB $00,$00,$20,$00,$00,$20
FCB $00,$00,$20,$00,$00,$20
; End of stations' data
ORG $1FF0
FDB $0000
ORG $1FFE ; RESET vector
FDB INIT
END ; File ends here
Αναλυτική παρουσίαση των ρουτινών του προγράµµατος - 68 -
Αναλυτική παρουσίαση των ρουτινών του προγράµµατος
Στο κεφάλαιο αυτό της εργασίας δίνονται αναλυτικά τα διαγράµµατα ροής των ρουτινών
του συστήµατος. Αρχικά εξηγείται το πρωτόκολλο επικοινωνίας των δύο µικροελεγκτών. Το
διάγραµµα ροής του πρωτοκόλλου δίνεται στην επόµενη σελίδα. Σκοπός αυτής της διαδικα-
σίας είναι η µεταφορά των 15 bytes δεδοµένων από τον πρώτο στον δεύτερο µικροελεγκτή.
Αρχικά ο πρώτος µικροελεγκτής περιµένει το σήµα έναρξης µέσω της PortB.[4]. Μόλις το
λάβει ακολουθεί ένα άλµα στην διαδικασία Measure, η οποία αποτελεί την κύρια ρουτίνα του
προγράµµατος. Αν υπάρχει απάντηση από τον σωστό σταθµό ακολουθεί η διαδικασία της
αποστολής των δεδοµένων στον δεύτερο µικροελεγκτή ( σελ.14, SendDataLoop ). Το αντί-
στοιχο κοµµάτι κώδικα που αφορά τη λήψη των δεδοµένων από το δεύτερο µικροελεγκτή
βρίσκεται στη σελίδα 32 ( Receive ). Το διάγραµµα ροής της επόµενης σελίδας δίνει περιλη-
πτικά τη διαδικασία αυτή.
Αναλυτική παρουσίαση των ρουτινών του προγράµµατος - 69 -
Σχήµα 2. ∆ιάγραµµα ροής του πρωτοκόλλου επικοινωνίας των δύο µικροελεγκτών
BSc
BSc
BSc
BSc
BSc
BSc
BSc
BSc
BSc
BSc
BSc
BSc
BSc
BSc
BSc

More Related Content

Viewers also liked

O título e a compreensão textual
O título e a compreensão textualO título e a compreensão textual
O título e a compreensão textual
ma.no.el.ne.ves
 
Laporan Bulan Mei
Laporan Bulan MeiLaporan Bulan Mei
Laporan Bulan Mei
BBPP_Batu
 
Environmental and social disclosure policies in China
Environmental and social disclosure policies in ChinaEnvironmental and social disclosure policies in China
Environmental and social disclosure policies in China
IIED
 
Prova de Língua Portuguesa da UFOP 2008/1 resolvida e comentada
Prova de Língua Portuguesa da UFOP 2008/1 resolvida e comentadaProva de Língua Portuguesa da UFOP 2008/1 resolvida e comentada
Prova de Língua Portuguesa da UFOP 2008/1 resolvida e comentada
ma.no.el.ne.ves
 
Hardware in Loop System Design
Hardware in Loop System DesignHardware in Loop System Design
Hardware in Loop System Design
parulo123
 
Dimensi dan struktur ips
Dimensi dan struktur ips Dimensi dan struktur ips
Dimensi dan struktur ips
dewi retnani kintari putri
 
Pancasila sebagai ideologi terbuka
Pancasila sebagai ideologi terbuka Pancasila sebagai ideologi terbuka
Pancasila sebagai ideologi terbuka
dewi retnani kintari putri
 
Sistem informasi 0rganisasi dan strategi
Sistem informasi 0rganisasi dan strategiSistem informasi 0rganisasi dan strategi
Sistem informasi 0rganisasi dan strategi
Novita J Akerina
 
Sistem ekonomi kapitalisme
Sistem ekonomi kapitalismeSistem ekonomi kapitalisme
Sistem ekonomi kapitalisme
Deni Irawan
 
Macam macam ideologi
Macam macam ideologi Macam macam ideologi
Macam macam ideologi
Nurul Arifin S
 
2016 05-23 corso-formazione-ds-firenze-snv
2016 05-23 corso-formazione-ds-firenze-snv2016 05-23 corso-formazione-ds-firenze-snv
2016 05-23 corso-formazione-ds-firenze-snv
Luca Salvini - MI
 
Perigrafia
PerigrafiaPerigrafia
Perigrafia
ma.no.el.ne.ves
 

Viewers also liked (12)

O título e a compreensão textual
O título e a compreensão textualO título e a compreensão textual
O título e a compreensão textual
 
Laporan Bulan Mei
Laporan Bulan MeiLaporan Bulan Mei
Laporan Bulan Mei
 
Environmental and social disclosure policies in China
Environmental and social disclosure policies in ChinaEnvironmental and social disclosure policies in China
Environmental and social disclosure policies in China
 
Prova de Língua Portuguesa da UFOP 2008/1 resolvida e comentada
Prova de Língua Portuguesa da UFOP 2008/1 resolvida e comentadaProva de Língua Portuguesa da UFOP 2008/1 resolvida e comentada
Prova de Língua Portuguesa da UFOP 2008/1 resolvida e comentada
 
Hardware in Loop System Design
Hardware in Loop System DesignHardware in Loop System Design
Hardware in Loop System Design
 
Dimensi dan struktur ips
Dimensi dan struktur ips Dimensi dan struktur ips
Dimensi dan struktur ips
 
Pancasila sebagai ideologi terbuka
Pancasila sebagai ideologi terbuka Pancasila sebagai ideologi terbuka
Pancasila sebagai ideologi terbuka
 
Sistem informasi 0rganisasi dan strategi
Sistem informasi 0rganisasi dan strategiSistem informasi 0rganisasi dan strategi
Sistem informasi 0rganisasi dan strategi
 
Sistem ekonomi kapitalisme
Sistem ekonomi kapitalismeSistem ekonomi kapitalisme
Sistem ekonomi kapitalisme
 
Macam macam ideologi
Macam macam ideologi Macam macam ideologi
Macam macam ideologi
 
2016 05-23 corso-formazione-ds-firenze-snv
2016 05-23 corso-formazione-ds-firenze-snv2016 05-23 corso-formazione-ds-firenze-snv
2016 05-23 corso-formazione-ds-firenze-snv
 
Perigrafia
PerigrafiaPerigrafia
Perigrafia
 

Similar to BSc

Sensorless motor control1
Sensorless motor control1Sensorless motor control1
Sensorless motor control1
Dimitrios Nikolaidis
 
Τυπολόγιο Συστημάτων Ψηφιακών Ηλεκτρονικών
Τυπολόγιο Συστημάτων Ψηφιακών ΗλεκτρονικώνΤυπολόγιο Συστημάτων Ψηφιακών Ηλεκτρονικών
Τυπολόγιο Συστημάτων Ψηφιακών Ηλεκτρονικών
Theodoros Leftheroudis
 
ΝΕΟΤΕΡΕΣ ΕΞΕΛΙΞΕΙΣ ΣΤΗΝ ΚΑΤΑΣΚΕΥΗ ΚΑΙ ΛΕΙΤΟΥΡΓΙΑ ΜΕΤΑΣΧΗΜΑΤΙΣΤΩΝ ΔΙΑΝΟΜΗΣ ΜΕ...
 ΝΕΟΤΕΡΕΣ ΕΞΕΛΙΞΕΙΣ ΣΤΗΝ ΚΑΤΑΣΚΕΥΗ ΚΑΙ ΛΕΙΤΟΥΡΓΙΑ ΜΕΤΑΣΧΗΜΑΤΙΣΤΩΝ ΔΙΑΝΟΜΗΣ ΜΕ... ΝΕΟΤΕΡΕΣ ΕΞΕΛΙΞΕΙΣ ΣΤΗΝ ΚΑΤΑΣΚΕΥΗ ΚΑΙ ΛΕΙΤΟΥΡΓΙΑ ΜΕΤΑΣΧΗΜΑΤΙΣΤΩΝ ΔΙΑΝΟΜΗΣ ΜΕ...
ΝΕΟΤΕΡΕΣ ΕΞΕΛΙΞΕΙΣ ΣΤΗΝ ΚΑΤΑΣΚΕΥΗ ΚΑΙ ΛΕΙΤΟΥΡΓΙΑ ΜΕΤΑΣΧΗΜΑΤΙΣΤΩΝ ΔΙΑΝΟΜΗΣ ΜΕ...
ιωαννης αληφραγκης
 
Roof-top Solar PV System Project
Roof-top Solar PV System ProjectRoof-top Solar PV System Project
Roof-top Solar PV System Project
KonstantinosChristod10
 
Διανεμημένη Παραγωγή_final
Διανεμημένη Παραγωγή_finalΔιανεμημένη Παραγωγή_final
Διανεμημένη Παραγωγή_finalGiorgos Smaragdis
 
Labnotes 2922
Labnotes 2922Labnotes 2922
Labnotes 2922
Manolis Doudounakis
 
εισαγωγη στην εξοικονομηση ενεργειας στο
εισαγωγη στην εξοικονομηση ενεργειας στοεισαγωγη στην εξοικονομηση ενεργειας στο
εισαγωγη στην εξοικονομηση ενεργειας στο
ιωαννης αληφραγκης
 
Themata psifiakon systimaton 2016
Themata psifiakon systimaton 2016Themata psifiakon systimaton 2016
Themata psifiakon systimaton 2016
Theodoros Leftheroudis
 
Σχεδίαση Instrumentation Amplifier για ενίσχυση ηλεκτρικού σήματος σε φορητό ...
Σχεδίαση Instrumentation Amplifier για ενίσχυση ηλεκτρικού σήματος σε φορητό ...Σχεδίαση Instrumentation Amplifier για ενίσχυση ηλεκτρικού σήματος σε φορητό ...
Σχεδίαση Instrumentation Amplifier για ενίσχυση ηλεκτρικού σήματος σε φορητό ...chiliharry
 
Electric Circuits: Final experiment
Electric Circuits: Final experimentElectric Circuits: Final experiment
Electric Circuits: Final experiment
ntsormpa
 
Πτυχιακή Εργασία
Πτυχιακή ΕργασίαΠτυχιακή Εργασία
Πτυχιακή ΕργασίαVangelis Verbis
 
αφαιρεση θορυβου και εντοπισμος συμβαντων ακουστικης εκπομπης
αφαιρεση θορυβου και εντοπισμος συμβαντων ακουστικης εκπομπηςαφαιρεση θορυβου και εντοπισμος συμβαντων ακουστικης εκπομπης
αφαιρεση θορυβου και εντοπισμος συμβαντων ακουστικης εκπομπης
Georgios Petrou
 
Protipo g gimnasioy
Protipo g gimnasioyProtipo g gimnasioy
Protipo g gimnasioy
Dimitrios Nikolaidis
 
158 - Ομαλή κυκλική κίνηση με φωτοπύλη.
158 - Ομαλή κυκλική κίνηση με φωτοπύλη.158 - Ομαλή κυκλική κίνηση με φωτοπύλη.
158 - Ομαλή κυκλική κίνηση με φωτοπύλη.
Stathis Gourzis
 
Αξιοποίηση της Τεχνολογίας των Μεταϋλικών για Αποδο- τικότερη Ασύρματη Μεταφο...
Αξιοποίηση της Τεχνολογίας των Μεταϋλικών για Αποδο- τικότερη Ασύρματη Μεταφο...Αξιοποίηση της Τεχνολογίας των Μεταϋλικών για Αποδο- τικότερη Ασύρματη Μεταφο...
Αξιοποίηση της Τεχνολογίας των Μεταϋλικών για Αποδο- τικότερη Ασύρματη Μεταφο...
technology_forum
 
Συλλογή Μεταφορά και Έλεγχος Δεδομένων Θεωρία ΚΕΦ 2
Συλλογή Μεταφορά και Έλεγχος Δεδομένων Θεωρία ΚΕΦ 2Συλλογή Μεταφορά και Έλεγχος Δεδομένων Θεωρία ΚΕΦ 2
Συλλογή Μεταφορά και Έλεγχος Δεδομένων Θεωρία ΚΕΦ 2
Theodoros Leftheroudis
 
ΔΙΠΛΩΜΑΤΙΚΗ ΕΡΓΑΣΙΑ ΚΑΤΣΙΔΟΝΙΩΤΑΚΗ ΕΙΡΗΝΗ
ΔΙΠΛΩΜΑΤΙΚΗ ΕΡΓΑΣΙΑ ΚΑΤΣΙΔΟΝΙΩΤΑΚΗ ΕΙΡΗΝΗΔΙΠΛΩΜΑΤΙΚΗ ΕΡΓΑΣΙΑ ΚΑΤΣΙΔΟΝΙΩΤΑΚΗ ΕΙΡΗΝΗ
ΔΙΠΛΩΜΑΤΙΚΗ ΕΡΓΑΣΙΑ ΚΑΤΣΙΔΟΝΙΩΤΑΚΗ ΕΙΡΗΝΗEIRINI KATSIDONIOTAKI
 

Similar to BSc (20)

Sensorless motor control1
Sensorless motor control1Sensorless motor control1
Sensorless motor control1
 
Τυπολόγιο Συστημάτων Ψηφιακών Ηλεκτρονικών
Τυπολόγιο Συστημάτων Ψηφιακών ΗλεκτρονικώνΤυπολόγιο Συστημάτων Ψηφιακών Ηλεκτρονικών
Τυπολόγιο Συστημάτων Ψηφιακών Ηλεκτρονικών
 
ΝΕΟΤΕΡΕΣ ΕΞΕΛΙΞΕΙΣ ΣΤΗΝ ΚΑΤΑΣΚΕΥΗ ΚΑΙ ΛΕΙΤΟΥΡΓΙΑ ΜΕΤΑΣΧΗΜΑΤΙΣΤΩΝ ΔΙΑΝΟΜΗΣ ΜΕ...
 ΝΕΟΤΕΡΕΣ ΕΞΕΛΙΞΕΙΣ ΣΤΗΝ ΚΑΤΑΣΚΕΥΗ ΚΑΙ ΛΕΙΤΟΥΡΓΙΑ ΜΕΤΑΣΧΗΜΑΤΙΣΤΩΝ ΔΙΑΝΟΜΗΣ ΜΕ... ΝΕΟΤΕΡΕΣ ΕΞΕΛΙΞΕΙΣ ΣΤΗΝ ΚΑΤΑΣΚΕΥΗ ΚΑΙ ΛΕΙΤΟΥΡΓΙΑ ΜΕΤΑΣΧΗΜΑΤΙΣΤΩΝ ΔΙΑΝΟΜΗΣ ΜΕ...
ΝΕΟΤΕΡΕΣ ΕΞΕΛΙΞΕΙΣ ΣΤΗΝ ΚΑΤΑΣΚΕΥΗ ΚΑΙ ΛΕΙΤΟΥΡΓΙΑ ΜΕΤΑΣΧΗΜΑΤΙΣΤΩΝ ΔΙΑΝΟΜΗΣ ΜΕ...
 
Roof-top Solar PV System Project
Roof-top Solar PV System ProjectRoof-top Solar PV System Project
Roof-top Solar PV System Project
 
Διανεμημένη Παραγωγή_final
Διανεμημένη Παραγωγή_finalΔιανεμημένη Παραγωγή_final
Διανεμημένη Παραγωγή_final
 
Labnotes 2922
Labnotes 2922Labnotes 2922
Labnotes 2922
 
εισαγωγη στην εξοικονομηση ενεργειας στο
εισαγωγη στην εξοικονομηση ενεργειας στοεισαγωγη στην εξοικονομηση ενεργειας στο
εισαγωγη στην εξοικονομηση ενεργειας στο
 
Themata psifiakon systimaton 2016
Themata psifiakon systimaton 2016Themata psifiakon systimaton 2016
Themata psifiakon systimaton 2016
 
Σχεδίαση Instrumentation Amplifier για ενίσχυση ηλεκτρικού σήματος σε φορητό ...
Σχεδίαση Instrumentation Amplifier για ενίσχυση ηλεκτρικού σήματος σε φορητό ...Σχεδίαση Instrumentation Amplifier για ενίσχυση ηλεκτρικού σήματος σε φορητό ...
Σχεδίαση Instrumentation Amplifier για ενίσχυση ηλεκτρικού σήματος σε φορητό ...
 
Greenfilm presentation
Greenfilm presentationGreenfilm presentation
Greenfilm presentation
 
Electric Circuits: Final experiment
Electric Circuits: Final experimentElectric Circuits: Final experiment
Electric Circuits: Final experiment
 
Πτυχιακή Εργασία
Πτυχιακή ΕργασίαΠτυχιακή Εργασία
Πτυχιακή Εργασία
 
αφαιρεση θορυβου και εντοπισμος συμβαντων ακουστικης εκπομπης
αφαιρεση θορυβου και εντοπισμος συμβαντων ακουστικης εκπομπηςαφαιρεση θορυβου και εντοπισμος συμβαντων ακουστικης εκπομπης
αφαιρεση θορυβου και εντοπισμος συμβαντων ακουστικης εκπομπης
 
Presentation__
Presentation__Presentation__
Presentation__
 
MSc
MScMSc
MSc
 
Protipo g gimnasioy
Protipo g gimnasioyProtipo g gimnasioy
Protipo g gimnasioy
 
158 - Ομαλή κυκλική κίνηση με φωτοπύλη.
158 - Ομαλή κυκλική κίνηση με φωτοπύλη.158 - Ομαλή κυκλική κίνηση με φωτοπύλη.
158 - Ομαλή κυκλική κίνηση με φωτοπύλη.
 
Αξιοποίηση της Τεχνολογίας των Μεταϋλικών για Αποδο- τικότερη Ασύρματη Μεταφο...
Αξιοποίηση της Τεχνολογίας των Μεταϋλικών για Αποδο- τικότερη Ασύρματη Μεταφο...Αξιοποίηση της Τεχνολογίας των Μεταϋλικών για Αποδο- τικότερη Ασύρματη Μεταφο...
Αξιοποίηση της Τεχνολογίας των Μεταϋλικών για Αποδο- τικότερη Ασύρματη Μεταφο...
 
Συλλογή Μεταφορά και Έλεγχος Δεδομένων Θεωρία ΚΕΦ 2
Συλλογή Μεταφορά και Έλεγχος Δεδομένων Θεωρία ΚΕΦ 2Συλλογή Μεταφορά και Έλεγχος Δεδομένων Θεωρία ΚΕΦ 2
Συλλογή Μεταφορά και Έλεγχος Δεδομένων Θεωρία ΚΕΦ 2
 
ΔΙΠΛΩΜΑΤΙΚΗ ΕΡΓΑΣΙΑ ΚΑΤΣΙΔΟΝΙΩΤΑΚΗ ΕΙΡΗΝΗ
ΔΙΠΛΩΜΑΤΙΚΗ ΕΡΓΑΣΙΑ ΚΑΤΣΙΔΟΝΙΩΤΑΚΗ ΕΙΡΗΝΗΔΙΠΛΩΜΑΤΙΚΗ ΕΡΓΑΣΙΑ ΚΑΤΣΙΔΟΝΙΩΤΑΚΗ ΕΙΡΗΝΗ
ΔΙΠΛΩΜΑΤΙΚΗ ΕΡΓΑΣΙΑ ΚΑΤΣΙΔΟΝΙΩΤΑΚΗ ΕΙΡΗΝΗ
 

BSc

  • 1. ΑΡΙΣΤΟΤΕΛΕΙΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΟΝΙΚΗΣ ΣΧΟΛΗ ΘΕΤΙΚ Ν ΕΠΙΣΤΗΜ Ν ΤΜΗΜΑ ΦΥΣΙΚΗΣ ΤΟΜΕΑΣ ΗΛΕΚΤΡΟΝΙΚΗΣ ∆ιπλωµατική εργασία ΑΥΤΟΜΑΤΟΠΟΙΗΜΕΝΗ ΛΗΨΗ ΑΣΥΡΜΑΤΟΥ ΣΗΜΑΤΟΣ ΚΑΙ ΕΠΕΞΕΡΓΑΣΙΑ ΤΟΥ Επιβλέπων καθηγητής : Κ. Κοσµατόπουλος Αποστόλης Σταυρακούδης Θεσσαλονίκη 2000
  • 2. Περιεχόµενα - 1 - ΕΙΣΑΓ ΓΗ...................................................................................................................................2 ΘΕ ΡΗΤΙΚΗ ΕΞΗΓΗΣΗ ΤΗΣ ΚΑΤΑΣΚΕΥΗΣ ......................................................................3 Επεξήγηση της τοπολογίας των σταθµών του προγράµµατος REMOS..........................................6 Κ ∆ΙΚΑΣ ASSEMBLY Τ Ν ΜΙΚΡΟΕΛΕΓΚΤ Ν ..................................................................9 Λίστα assembly 1ου µικροελεγκτή ..............................................................................................9 1ο αρχείο : REGISTER.H...............................................................................................................................9 2ο αρχείο : RECEIVE.H.............................................................................................................................. 10 3ο αρχείο : TRANSMIT.H .......................................................................................................................... 12 4ο αρχείο : ALLBASE.H............................................................................................................................. 13 Λίστα assembly 2ου µικροελεγκτή ............................................................................................31 5ο αρχείο : MINILCD.H.............................................................................................................................. 31 6ο αρχείο : MAINLCD.H............................................................................................................................ 37 ΑΝΑΛΥΤΙΚΗ ΠΑΡΟΥΣΙΑΣΗ Τ Ν ΡΟΥΤΙΝ Ν ΤΟΥ ΠΡΟΓΡΑΜΜΑΤΟΣ..........................68 Η διαδικασία Εqualize.............................................................................................................71 Η διαδικασία ComputeVals......................................................................................................73 Η διαδικασία Bin2BCD32 .......................................................................................................74 ∆Ε∆ΟΜΕΝΑ ΚΑΙ ΣΤΑΘΕΡΕΣ Τ Ν ΣΤΑΘΜ Ν ...................................................................76 ΠΛΑΚΕΤΕΣ PCB ΣΥΣΚΕΥ Ν ...............................................................................................79 DATA SHEETS.........................................................................................................................83 ΒΙΒΛΙΟΓΡΑΦΙΑ.......................................................................................................................84
  • 3. Εισαγωγή - 2 - Εισαγωγή Η εργασία αυτή πραγµατοποιήθηκε για να βοηθήσει στην δοκιµή και βαθµονόµηση των σταθµών του συστήµατος REMOS το οποίο έχει αναπτυχθεί από τον τοµέα ηλεκτρονικής. Το σύστηµα REMOS µετρά κάποια φυσικά δεδοµένα και φροντίζει για τη αποστολή τους µέσω FFSK διαµόρφωσης σε υπολογιστές που λαµβάνουν τα σήµατα αυτά και τα επεξεργάζονται. Σκοπός της εργασίας αυτής ήταν η κατασκευή συσκευών, ώστε η λήψη αυτών των δεδοµέ- νων να γίνεται κοντά στο σταθµό αποστολής, βοηθώντας µε αυτό τον τρόπο την διεκπεραίω- ση των µετρήσεων εύκολα και γρήγορα, χωρίς να απαιτείται η επικοινωνία µε τον κεντρικό υπολογιστή που συχνά είναι δύσκολη, λόγω της θέσης των σταθµών αποστολής σε δυσπρόσι- τα σηµεία. Η εργασία χωρίζεται σε έξι µέρη. Το πρώτο µέρος περιλαµβάνει τη λειτουργία των συ- σκευών και τα σχηµατικά διαγράµµατά τους. Το δεύτερο περιέχει τον κώδικα assembly των δύο µικροελεγκτών που χρησιµοποιήθηκαν και το τρίτο αναλύει τις ρουτίνες διεξοδικά. Στο τέταρτο τµήµα περιέχονται κάποιες σταθερές που είναι απαραίτητες για την ανάλυση των δε- δοµένων αποστολής και το λογισµικό µε το οποίο γίνεται η µεταγλώττιση των σταθερών αυ- τών σε µορφή κατάλληλη για εγγραφή τους στην µνήµη EPROM του µικροελεγκτή. Το πέ- µπτο µέρος περιλαµβάνει τα σχέδια των πλακετών των δύο συσκευών και το έκτο και τελευ- ταίο περιέχει τα φυλλάδια πληροφοριών των υλικών που χρησιµοποιήθηκαν. Στο σηµείο αυτό θα ήθελα να ευχαριστήσω τους Κώστα Κοσµατόπουλο και Χρήστο Πα- παγεωργίου για τη βοήθειά τους.
  • 4. Θεωρητική επεξήγηση της κατασκευής - 3 - Θεωρητική εξήγηση της κατασκευής Στο κοµµάτι αυτό περιλαµβάνονται τα σχηµατικά διαγράµµατα των συσκευών και τα λο- γικά διαγράµµατα των προγραµµάτων των µικροελεγκτών. Στα πλαίσια της διπλωµατικής κατασκευάστηκαν δύο συσκευές, µία µε µικρή οθόνη υγρών κρυστάλλων (LCD) δύο γραµµών και µία µε µεγάλη οθόνη των τεσσάρων γραµµών. Στην εργασία αυτή παρουσιάζεται η συσκευή µε τη µεγάλη οθόνη, η οποία εµπεριέχει όλες τις ρουτίνες της µικρής. Από εδώ και στο εξής οποιαδήποτε αναφορά γίνεται θεωρείται ότι γίνε- ται για τη µεγάλη οθόνη εκτός αν αναφέρεται ρητά το αντίθετο. Παρακάτω δίνεται το γενικό διάγραµµα ροής της συσκευής. Έναρξη Έναρξη διαδικασίας ; No Yes Αποστολή και λήψη δεδοµένων Επεξεργασία δεδοµένων Απεικόνιση δεδοµένων Σχήµα 1. ∆ιάγραµµα ροής της συνολικής διεργασίας Στις επόµενες δύο σελίδες δίνονται τα σχηµατικά διαγράµµατα της συσκευής.
  • 5. A A B B C C D D E E 4 4 3 3 2 2 1 1 Station selection (binary) Microcontroller 1 Microcontroller 2 Start operation ( 2 > 1) Receive next byte ( 1 > 2) PortB0 PortB1 PortB3 PortB2 ReceiveNet StartOpNet PortA1 PortA3 PortA5 PortA7 PortA6 PortA4 PortA2 PortA0 UHFIn UHFOut -9 Volt VSS VDD +9 Volt UHF Start signal VDD VDD VDD VDD VDD VDD VDD VDD VDD U2 68HC805C4 39 38 1 2 29 34 36 37 3 11 10 9 8 7 6 5 4 12 13 14 15 16 17 18 19 28 27 26 25 24 23 22 21 30 31 32 33 35 OSC1 OSC2 RESET IRQ PD0 PD5 PD7 TCAP VPP PA0 PA1 PA2 PA3 PA4 PA5 PA6 PA7 PB0 PB1 PB2 PB3 PB4 PB5 PB6 PB7 PC0 PC1 PC2 PC3 PC4 PC5 PC6 PC7 PD1 PD2 PD3 PD4 TCMP S2 START S1 SW DIP-4 1 2 3 4 8 7 6 5 U1 68HC805C4 39 38 1 2 29 34 36 37 3 11 10 9 8 7 6 5 4 12 13 14 15 16 17 18 19 28 27 26 25 24 23 22 21 30 31 32 33 35 OSC1 OSC2 RESET IRQ PD0 PD5 PD7 TCAP VPP PA0 PA1 PA2 PA3 PA4 PA5 PA6 PA7 PB0 PB1 PB2 PB3 PB4 PB5 PB6 PB7 PC0 PC1 PC2 PC3 PC4 PC5 PC6 PC7 PD1 PD2 PD3 PD4 TCMP U4 MC34064 1 2 3 Reset In GND U3MC34064 1 2 3 Reset In GND C1 18p R10 10MC2 18p C3 18p R11 10M C4 18p C6 100n C5 100n Y2 4 MHz Y1 4 MHz JP1 Voltages 1 2 3 4 U5 UA78L05AQ/TO3 1 2 3 OUT COM IN R1 10k S5 Down line S4 Up line R4 10k R2 10k R3 10k R6 10k R8 10k R7 10k C7 1u C8 100n R12 4.7k R13 4.7k J1ResPack1 1 2 3 4 5 6 7 8 9 R25 10k J2 LCD Connector 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 S3 RESET R14 4.7k R15 4.7k R922k E2 RW RS E1 E2 E1RW RS Reset Reset Reset Reset -9 Volt +9 Volt Reset
  • 6. A A B B C C D D E E 4 4 3 3 2 2 1 1 Page 2 (Microcontroller wireless system) - Analog part A 2 2Sunday, February 20, 2000 Title Size Document Number Rev Date: Sheet of +9 Volt -9 Volt VDD VSS UHFOut UHFIn UHF Start signal VDD C10 10n C9 100n Q2 2N3904 3 2 1 Q1 2N3904 3 2 1 R16 18k R17 2.2k R1847k R19 10k R20 100k R21 10k R22 1k R23 22k + - U6 LF356 3 2 6 7 1 4 5 R24 22k +9 Volt -9 Volt VDD VSS UHF mic out UHF Out +9 Volt -9 Volt
  • 7. Θεωρητική επεξήγηση της κατασκευής - 6 - Η εργασία στηρίχθηκε στον µικροελεγκτή MC68HC805C8 της Motorola ο οποίος διαθέτει τρεις θύρες εισόδου – εξόδου και µία για σειριακή επικοινωνία. Σε αυτό το σηµείο πρέπει να τονιστεί ότι το κοµµάτι του προγράµµατος του πρώτου µικροελεγκτή που αφορά την αποστο- λή και λήψη των δεδοµένων στο φάσµα των UHF συχνοτήτων αποτελεί εργασία του Χρή- στου Παπαγεωργίου. Η δική µου επέµβαση στο πρόγραµµα του πρώτου µικροελεγκτή ήταν η δηµιουργία της ρουτίνας που είναι υπεύθυνη για την επικοινωνία των δύο µικροελεγκτών. Η λειτουργία της συσκευής έχει ως εξής : Αρχικά πιέζουµε το διακόπτη S2 (Start). Ο δεύτερος µικροελεγκτής στέλνει ένα σήµα έναρξης µέτρησης στον πρώτο µικροελεγκτή, ενώ ο ίδιος παραµένει ανενεργός και περιµένει σήµα για να αρχίσει να λαµβάνει δεδοµένα. Ο δεύ- τερος µικροελεγκτής στέλνει ένα σήµα έναρξης µέτρησης στον σταθµό µέσω UHF και περι- µένει να λάβει απάντηση. Όταν έρχεται η απάντηση ο πρώτος µικροελεγκτής µεταφέρει τα δεδοµένα που έλαβε από τον σταθµό - τα οποία είναι 15 bytes - στον δεύτερο και η λειτουρ- γία του τελειώνει σε αυτό το σηµείο. Ο δεύτερος µικροελεγκτής µε τη σειρά του, αφού λάβει τα 15 αυτά bytes, αρχικά τα αποκωδικοποιεί και αποθηκεύει τα δεδοµένα των µετρήσεων σε µεταβλητές. Τα δεδοµένα προέρχονται από A/D µετατροπείς οι οποίοι βρίσκονται στους σταθµούς. Κάθε µέτρηση αποτελείται από 10 bits εκτός από τα δεδοµένα της µέτρησης της στάθµης των υδάτων η οποία καταλαµβάνουν 12 bits. Στη συνέχεια γίνονται πράξεις πάνω στη µέτρηση αυτή ώστε να προκύψει κατανοητό αποτέλεσµα. Η πράξη που γίνεται είναι η εξής : Υ = α·x + β, όπου α και β σταθερές οι οποίες είναι διαφορετικές για κάθε σταθµό και x η τιµή της µέτρησης του σταθµού. Επειδή τα δεδοµένα είναι 10 και 12 bits αναγκαστικά χρη- σιµοποιούνται αλγόριθµοι πράξεων των 32 bit. Τελικά στην οθόνη υγρών κρυστάλλων απει- κονίζονται τα αποτελέσµατα. Στις δύο τελευταίες γραµµές δίνονται τα 15 bytes που έστειλε ο σταθµός καθώς και κάποιες πληροφορίες για τη σωστή λειτουργία κάποιων αισθητηρίων. Στις δύο πρώτες γραµµές απεικονίζονται ανά δύο τα δεδοµένα των µετρήσεων. Η κύλιση από γραµµή σε γραµµή γίνεται µε δύο κουµπιά τα οποία βρίσκονται στο επάνω µέρος της συ- σκευής. Για την καλύτερη κατανόηση της λειτουργίας της συσκευής απαιτείται η εξήγηση της τοπολογίας των σταθµών, η οποία ακολουθεί παρακάτω. Επεξήγηση της τοπολογίας των σταθµών του προγράµµατος REMOS Οι σταθµοί αυτοί βρίσκονται τοποθετηµένοι σε διάφορες τοποθεσίες. Στη µνήµη EPROM του µικροελεγκτή της εργασίας είναι τοποθετηµένα τα δεδοµένα των σταθερών α και β της περιο- χής της λιµνοθάλασσας του Μεσολογγίου. Ο µέγιστος αριθµός σταθµών µιας περιοχής είναι 16. Τα δεδοµένα που απεικονίζονται στην οθόνη LCD είναι 8. Σε κάθε σταθµό υπάρχουν ε- πτά κανάλια (A/D µετατροπείς) δεδοµένων των 10 bits και ένα σύστηµα µέτρησης της στάθ- µης του νερού το οποίο στέλνει 3 bytes δεδοµένων. Τα δεδοµένα στάθµης του νερού είναι
  • 8. Θεωρητική επεξήγηση της κατασκευής - 7 - δύο των 12 bit το καθένα. Το πρώτο δεδοµένο είναι η πραγµατική µέτρηση και το δεύτερο µία µέτρηση αναφοράς. Η πράξη που γίνεται για να εξαχθεί η τιµή της στάθµης του νερού εί- ναι διαφορετική από τις άλλες και έχει ως εξής : Υ = α · αναφοράςΜέτρηση µέτρησηΠραγµατική + β, όπου α και β οι σταθερές. Οι σταθερές α και β χρησιµεύουν στην εξαγωγή της µέτρησης σε µορφή που είναι αντιληπτή από το χρήστη. Οι A/D µετατροπείς στέλνουν σαν δεδοµένα ακέραιους αριθµούς µεταξύ των τιµών 0 – 1024 για δεδοµένο των 10 bit και 0 – 4096 για δεδοµένο των 12 bit. Ο χρήστης όµως τη στάθµη του νερού τη µετράει σε cm και στο LCD display πρέπει να εµφανίζεται ένας αριθµός της µορφής π.χ. 102.5 cm. Αυτή η απαίτηση οδήγησε σε ανά- πτυξη ρουτινών για πράξεις µε αριθµούς κινητής υποδιαστολής (floating point). Η καθεµιά από τις σταθερές α και β, που βρίσκονται σε πίνακες στην EPROM του µικροελεγκτή, κατα- λαµβάνει 3 bytes. Η διαµόρφωση της δοµής της κάθε σταθεράς έχει ως εξής : 1ο byte byte χαµηλής τάξης της σταθεράς 2ο byte byte υψηλής τάξης της σταθεράς 3ο byte byte ελέγχου 1ο – 4ο bit : δύναµη στην οποία είναι υψωµένη η σταθερά 5ο – 6ο bit : δεν χρησιµοποιούνται 7ο bit : πρόσηµο της δύναµης που είναι υψωµένη η σταθερά 8ο bit : πρόσηµο της σταθεράς Τα πρόσηµα (7ο και 8ο bit) δείχνουν θετικό αριθµό αν η τιµή τους είναι 0 και αρνητικό αν η τιµή τους είναι 1. Για παράδειγµα η τιµή –71.6 στην διαµόρφωση των τριών byte έχει την ε- ξής µορφή : 02 CC C1, όπου 2CC16 είναι ο αριθµός 716 και C116 το byte ελέγχου (11000001)2. Παρακάτω ακολουθεί µια περίληψη της δοµής του πίνακα των σταθερών. 1. Συνολικά κανάλια : 8 2. Αριθµός σταθερών ανά µέτρηση : 2 3. Αριθµός bytes ανά σταθερά : 3 4. Αριθµός bytes ανά κανάλι : 6 5. Συνολικός αριθµός bytes ανά σταθµό : 48 6. Συνολικός αριθµός σταθµών ανά µικροελεγκτή : 16 7. Συνολικός αριθµός bytes στην µνήµη του µικροελεγκτή : 768 Στην EPROM του µικροελεγκτή υπάρχει ακόµη ένας πίνακας µε τα αλφαριθµητικά (strings) που θα εµφανιστούν στην οθόνη LCD. Τα αλφαριθµητικά αυτά είναι τα ονόµατα που δίνο- νται σε κάθε κανάλι ανάλογα µε τα δεδοµένα που µετράει και δεν µπορούν να αλλάξουν από σταθµό σε σταθµό. Τόσο ο πίνακας σταθερών όσο και ο πίνακας αλφαριθµητικών γίνονται
  • 9. Θεωρητική επεξήγηση της κατασκευής - 8 - ευκολότερα κατανοητοί στο επόµενο µέρος της εργασίας, στη λίστα assembly του προγράµ- µατος (σελ. 64-67).
  • 10. Κώδικας Assembly των δύο µικροελεγκτών - 9 - Κώδικας Assembly των δύο µικροελεγκτών Στο κεφάλαιο αυτό δίνονται τα προγράµµατα σε γλώσσα assembly για τον 6805. Η πρώ- τη λίστα αφορά το πρόγραµµα του πρώτου µικροελεγκτή το οποίο είναι κοινό και στις δύο εκδόσεις, µε τη µικρή και µε τη µεγάλη οθόνη. Η δεύτερη λίστα αποτελεί το πρόγραµµα του 2ου µικροελεγκτή για τη µικρή οθόνη των δύο γραµµών. Τέλος η τρίτη λίστα αφορά το πρό- γραµµα του 2ου µικροελεγκτή στην έκδοση µε τη µεγάλη οθόνη. Λίστα assembly 1ου µικροελεγκτή 1ο αρχείο : REGISTER.H. Το αρχείο αυτό περιέχει τις διευθύνσεις των καταχωρητών του µικροελεγκτή και επισυνάπτεται στο κυρίως αρχείο. * Portions to Motorola Inc * (c) 16/01/95 by Nick & Chris Firmware House PortA.Data EQU $0000 PortB.Data EQU $0001 PortC.Data EQU $0002 PortD.Data EQU $0003 PortA.Direction EQU $0004 PortB.Direction EQU $0005 PortC.Direction EQU $0006 Syn.Control EQU $000A Syn.Status EQU $000B Syn.Data EQU $000C Asyn.Baud EQU $000D Asyn.Control1 EQU $000E Asyn.Control2 EQU $000F Asyn.Status EQU $0010 Asyn.Data EQU $0011 Timer.Control EQU $0012 Timer.Status EQU $0013 InpCap.HighByte EQU $0014 InpCap.LowByte EQU $0015 OutCom.HighByte EQU $0016 OutCom.LowByte EQU $0017 Count.HighByte EQU $0018 Count.LowByte EQU $0019 AlCnt.HighByte EQU $001A AlCnt.LowByte EQU $001B Program EQU $001C CompOK.Reset EQU $001D CompOK.Control EQU $001E Option EQU $1FDF
  • 11. Κώδικας Assembly των δύο µικροελεγκτών - 10 - 2ο αρχείο : RECEIVE.H. Το αρχείο αυτό περιέχει µεταβλητές. Όπως το προηγούµενο έτσι και αυτό επισυνάπτεται στο κυρίως αρχείο. $base 10t FSK0L RMB 1 FSK0H RMB 1 FSK1L RMB 1 FSK1H RMB 1 FSKL RMB 1 FSKH RMB 1 TIMERL RMB 1 TIMERH RMB 1 OCMPLOTEMP1 RMB 1 OCMPLOTEMP2 RMB 1 TEMPCAPT1H RMB 1 TEMPCAPT1L RMB 1 TEMPCAPT2H RMB 1 TEMPCAPT2L RMB 1 DIFFH RMB 1 DIFFL RMB 1 TEMP3 RMB 1 TEMP4 RMB 1 TEMP5 RMB 1 TEMP6 RMB 1 COUNTLOOP1 RMB 1 COUNTLOOP2 RMB 1 COUNTLOOP3 RMB 1 COUNTLOOP4 RMB 1 COUNTLOOP5 RMB 1 CODE RMB 1 NUMBEROFOVERFLOWS RMB 1 RECEIVEDBYTE0 RMB 1 RECEIVEDBYTE1 RMB 1 RECEIVEDBYTE2 RMB 1 RECEIVEDBYTE3 RMB 1 RECEIVEDBYTE4 RMB 1 RECEIVEDBYTE5 RMB 1 RECEIVEDBYTE6 RMB 1 RECEIVEDBYTE7 RMB 1 RECEIVEDBYTE8 RMB 1 RECEIVEDBYTE9 RMB 1 RECEIVEDBYTE10 RMB 1 RECEIVEDBYTE11 RMB 1 RECEIVEDBYTE12 RMB 1 RECEIVEDBYTE13 RMB 1 CORRECT0 RMB 1 CORRECT1 RMB 1 CORRECT2 RMB 1 CORRECT3 RMB 1 CORRECT4 RMB 1 CORRECT5 RMB 1 CORRECT6 RMB 1 CORRECT7 RMB 1 CORRECT8 RMB 1 CORRECT9 RMB 1 CORRECT10 RMB 1 CORRECT11 RMB 1 CORRECT12 RMB 1 CORRECT13 RMB 1 SAMEVALUEPAIRS RMB 1
  • 12. Κώδικας Assembly των δύο µικροελεγκτών - 11 - CORRECTPAIRSCOUNT RMB 1 CORRECTROLLEDVALUE RMB 1 TEMP66 RMB 1 RECEIVESTATUS RMB 1 COUNTLOOP7 RMB 1 COUNTLOOP8 RMB 1 COUNTLOOP9 RMB 1 TEMPX RMB 1 DELAYL RMB 1 DELAYH RMB 1 COUNT.HIGHBYTE~ RMB 1 TEMPX1 RMB 1 TEMPX2 RMB 1 FIRSTVALUE0 RMB 1 FIRSTVALUE1 RMB 1 FIRSTVALUE2 RMB 1 FIRSTVALUE3 RMB 1 FIRSTVALUE4 RMB 1 FIRSTVALUE5 RMB 1 FIRSTVALUE6 RMB 1 FIRSTVALUE7 RMB 1 FIRSTVALUE8 RMB 1 FIRSTVALUE9 RMB 1 FIRSTVALUE10 RMB 1 FIRSTVALUE11 RMB 1 FIRSTVALUE12 RMB 1 FIRSTVALUE13 RMB 1 SECONDVALUE0 RMB 1 SECONDVALUE1 RMB 1 SECONDVALUE2 RMB 1 SECONDVALUE3 RMB 1 SECONDVALUE4 RMB 1 SECONDVALUE5 RMB 1 SECONDVALUE6 RMB 1 SECONDVALUE7 RMB 1 SECONDVALUE8 RMB 1 SECONDVALUE9 RMB 1 SECONDVALUE10 RMB 1 SECONDVALUE11 RMB 1 SECONDVALUE12 RMB 1 SECONDVALUE13 RMB 1 THIRDVALUE0 RMB 1 THIRDVALUE1 RMB 1 THIRDVALUE2 RMB 1 THIRDVALUE3 RMB 1 THIRDVALUE4 RMB 1 THIRDVALUE5 RMB 1 THIRDVALUE6 RMB 1 THIRDVALUE7 RMB 1 THIRDVALUE8 RMB 1 THIRDVALUE9 RMB 1 THIRDVALUE10 RMB 1 THIRDVALUE11 RMB 1 THIRDVALUE12 RMB 1 THIRDVALUE13 RMB 1
  • 13. Κώδικας Assembly των δύο µικροελεγκτών - 12 - FIRSTVALUECOUNT RMB 1 SECONDVALUECOUNT RMB 1 THIRDVALUECOUNT RMB 1 SECONDTIME RMB 1 INTERPACKETCOUNT RMB 1 FGT1400&FLT1640C RMB 1 FLT700HZCOUNT RMB 1 FGT2440HZCOUNT RMB 1 SYNCPULSESLT60 RMB 1 ERRORSTATUS RMB 1 SYNCSTATUS RMB 1 3ο αρχείο : TRANSMIT.H. Το αρχείο αυτό περιέχει µεταβλητές. Το αρχείο αυτό επισυ- νάπτεται στο κυρίως αρχείο. $BASE 10T BitsToBeSend RMB 1 * Το σύνολο των bits τα οποία θα εκπεµφθούν (από βάση 8, από τερµατικό 80) ShiftedBits RMB 1 * Ο αριθµός των bits τα οποία εκπέµφθησαν PulseW.Status RMB 1 * Το byte αυτό χρησιµοποιείται µε τον καταχωρητή X για να αποδώσει τιµή * στον καταχωρητή Output Compare. Αν έχει τιµή 0 ο χρόνος για τον * Output Compare φορτώνεται µέσω των Counts και έχει τιµή 01F4 ενώ για * το 1 ο Output Compare παίρνει την τιµή 00FA OutCom.LowByte~ RMB 1 * Προσωρινό byte αποθήκευσης του χαµηλού byte του Output Compare ByteToBeSend0~ RMB 1 ByteToBeSend1~ RMB 1 ByteToBeSend2~ RMB 1 ByteToBeSend0 RMB 1 ByteToBeSend1 RMB 1 ByteToBeSend2 RMB 1 * Το σύνολο των bytes που ολισθαίνουν. Στην περίπτωση της βάσης έχουµε * 8 bit ολίσθηση ενώ στην περίπτωση του τερµατικού έχουµε 80 bit ολίσθηση SynPul.Num RMB 1 * Κρατά το σύνολο των παλµών συγχρονισµού (150 για την περίπτωση της βάσης * και 150 για την περίπτωση του τερµατικού) SynPul.Counter RMB 1 * Μας δίνει τον αριθµό των συγχρονιστικών παλµών που έχουν ήδη εκπεµφθεί SynPul.Level RMB 1 * Μας δίνει το επίπεδο του συγχρονιστικού παλµού (0 για τη βάση και 1 * για το τερµατικό) Pulsepackets.Num RMB 1 *It is the number of transmitions
  • 14. Κώδικας Assembly των δύο µικροελεγκτών - 13 - 4ο αρχείο : ALLBASE.ASM. Το αρχείο αυτό περιέχει το πρόγραµµα του 1ου µικροελε- γκτή. Το αρχείο αυτό είναι το βασικό αρχείο κώδικα. Σχόλια στον κώδικα υπάρχουν µόνο στα σηµεία που επενέβηκα. $BASE 10T $INCLUDE "REGISTER.H" ORG $30 $INCLUDE "RECEIVE.H" $INCLUDE "TRANSMIT.H" StationNo RMB 1 ; 1 byte for station number TEMPA RMB 1 ; Temporary acca MyTEMPX RMB 1 ; Temporary X register MyCnt RMB 1 ; Temporary Counter TempXcounter RMB 1 ; Temporary X counter SendByte EQU CORRECT0 ; Located in RECEIVE.H ORG $180 INIT LDA #%11001010 STA OPTION RSP CLR SECONDTIME CLR INTERPACKETCOUNT CLR FGT1400&FLT1640C CLR FLT700HZCOUNT CLR FGT2440HZCOUNT CLR SYNCPULSESLT60 CLR SYNCSTATUS LDA #$00 STA PortB.Direction CLR PORTC.DATA CLR RECEIVESTATUS Initialization LDA #9 STA BitsToBeSend LDA #101 STA SynPul.Num CLR SynPul.Level ExecutionStart LDA #$00 STA PortA.Direction ; All inputs LDA #%11000000 ; PB0 - PB3 : StationNo (IN) ; PB4 : Start operation (IN) ; PB5 : Finished with previous byte ; PB6 : Send next byte to second microc. (OUT) STA PortB.Direction ; Port B direction LDA #0 STA PortB.Data NOP NOP NOP LDA PortB.Data ; Load PortB
  • 15. Κώδικας Assembly των δύο µικροελεγκτών - 14 - AND #$0F ; Only the lower 4 bits STA StationNo ; Station number StartOpLoop LDA PortB.Data ; Get data from Port B AND #%00010000 ; Check if Start operation signal has been sent BEQ StartOpLoop ; No ? Loop until it has. StartMeasure LDA #$FF ; Port C all outputs STA PortC.Direction LDA #0 NOP NOP STA PortC.Data ; PortC data all zero's LDA StationNo ; Station number ORA #%11110000 ; OR $F0 for relays STA Code BSET 0,PortC.Data ; Start bit to UHF BSET 1,PortC.Data ; Test led on JSR Measure LDA #$FF STA PortA.Direction ; Port A out for sending Data SendDataProc CLR MyCnt ; Clear Counter STX MyTEMPX STA TEMPA CLRX ; Clearing X for address SendDataLoop LDA SendByte,X ; SendByte address NOP STA PortA.Data ; Data to 1st mic. NOP NOP NOP BSET 6,PortB.Data ; Ready to send byte NOP NOP NOP NOP NOP NOP NOP NOP NOP ; Delay (2cycles x 10) BCLR 6,PortC.Data ; Send next byte --> 0 INCX INC MyCnt ; +1 to Counter and X LDA #15 CMP MyCnt BEQ EndDataLoop ; If Counter = 15 loop to END JSR Dlay50ms ; Make a delay JMP SendDataLoop ; Jump to SendDataLoop ; for next byte... EndDataLoop LDA TEMPA LDA MyTEMPX ; Initial data to acca abnd X
  • 16. Κώδικας Assembly των δύο µικροελεγκτών - 15 - LDA #$00 STA PortA.Direction ; Port A is input ExitTransfer BRA ExitTransfer Measure JSR MAIN START CLR TEMP4 CLR TEMP5 CLR TEMP6 CLR TEMP66 CLRX CLR COUNTLOOP1 CLR COUNTLOOP2 CLR COUNTLOOP7 CLR COUNTLOOP8 CLR COUNTLOOP9 CLR CORRECTPAIRSCOUNT CLR SAMEVALUEPAIRS CLR FIRSTVALUECOUNT CLR SECONDVALUECOUNT CLR THIRDVALUECOUNT CLR CORRECTROLLEDVALUE BSET 1,TIMER.CONTROL LDA TIMER.STATUS LDA INPCAP.LOWBYTE LOOP1000 * BRCLR 7,TIMER.STATUS,LOOP10000 BRCLR 7,TIMER.STATUS,LOOP1000 LDA INPCAP.HIGHBYTE STA TEMPCAPT1H LDA TIMER.STATUS LDA INPCAP.LOWBYTE STA TEMPCAPT1L JMP LOOP2 LOOP10000 INC COUNTLOOP7 LDA COUNTLOOP7 CMP #255 BEQ SHUTDOWN1 * BEQ NEXTTIME1 BRA LOOP1000 NEXTTIME1 INC COUNTLOOP8 LDA COUNTLOOP8 CMP #255 BEQ NEXTTIME2 BRA LOOP1000 NEXTTIME2 INC COUNTLOOP9 LDA COUNTLOOP9 CMP #1 BEQ SHUTDOWN11 BRA LOOP1000 SHUTDOWN1 LDA RECEIVESTATUS CMP #$FF BEQ TESTCONTROL1 * JMP START LDA SYNCSTATUS CMP #0
  • 17. Κώδικας Assembly των δύο µικροελεγκτών - 16 - BEQ CONTINUE0 LDA INTERPACKETCOUNT CMP #$FF BNE CONTINUE10 LDA #$FE STA INTERPACKETCOUNT CONTINUE10 INC INTERPACKETCOUNT CONTINUE0 CPX #0 BEQ START JMP EXIT TESTCONTROL1 BSET 1,PORTC.DATA BRA AFTERDELAY DELAY JSR DELAY50MS JSR DELAY50MS JSR DELAY50MS JSR DELAY50MS JSR DELAY50MS JSR DELAY50MS JSR DELAY50MS JSR DELAY50MS JSR DELAY50MS JSR DELAY50MS JSR DELAY50MS JSR DELAY50MS JSR DELAY50MS JSR DELAY50MS JSR DELAY50MS JSR DELAY50MS JSR DELAY50MS JSR DELAY50MS JSR DELAY50MS JSR DELAY50MS RTS SHUTDOWN11 BRA SHUTDOWN1 AFTERDELAY JMP TESTCONTROL LOOP0 CLR TEMP6 CLR TEMP66 LOOP000 BSET 1,TIMER.CONTROL CLR COUNTLOOP1 CLR TEMP5 CLR COUNTLOOP3 LDA TIMER.STATUS LDA INPCAP.LOWBYTE LOOP101 BRCLR 7,TIMER.STATUS,LOOP100 BRA CONTINUE100 LOOP100 INC COUNTLOOP3 LDA COUNTLOOP3 CMP #255 BNE LOOP101 BRA SHUTDOWN11
  • 18. Κώδικας Assembly των δύο µικροελεγκτών - 17 - CONTINUE100 LDA INPCAP.HIGHBYTE STA TEMPCAPT1H LDA TIMER.STATUS LDA INPCAP.LOWBYTE STA TEMPCAPT1L LOOP3 LDA TIMER.STATUS LDA INPCAP.LOWBYTE LOOP2 CLR TEMP5 LOOP11 BRCLR 7,TIMER.STATUS,LOOP10 BRA CONTINUE LOOP10 INC TEMP5 LDA TEMP5 CMP #255 BNE LOOP11 BRA SHUTDOWN11 CONTINUE LDA INPCAP.HIGHBYTE STA TEMPCAPT2H LDA TIMER.STATUS LDA INPCAP.LOWBYTE STA TEMPCAPT2L CLC LDA TEMPCAPT2L SUB TEMPCAPT1L STA DIFFL LDA TEMPCAPT2H SBC TEMPCAPT1H STA DIFFH CMP #1 BLO TEST205255 BEQ TEST256305 BHI TEST512562TEMP TEST205255 LDA DIFFL CMP #205 BLO FGT2440HZ * BLO ERROR JMP BITONE TEST256305 LDA DIFFL CMP #49 BHI TEST306461TEMP JMP BITONE FGT1400&FLT1640H LDA SYNCSTATUS CMP #0 BEQ CONTINUE90 LDA FGT1400&FLT1640C CMP #$FF BNE CONTINUE20 LDA #$FE STA FGT1400&FLT1640C CONTINUE20 INC FGT1400&FLT1640C CONTINUE90 CPX #0
  • 19. Κώδικας Assembly των δύο µικροελεγκτών - 18 - BEQ START000 JMP LOOP77 FLT700HZ LDA SYNCSTATUS CMP #0 BEQ CONTINUE80 LDA FLT700HZCOUNT CMP #$FF BNE CONTINUE30 LDA #$FE STA FLT700HZCOUNT CONTINUE30 INC FLT700HZCOUNT CONTINUE80 CPX #0 BEQ START000 JMP LOOP77 FGT2440HZ LDA SYNCSTATUS CMP #0 BEQ CONTINUE70 LDA FGT2440HZCOUNT CMP #$FF BNE CONTINUE40 LDA #$FE STA FGT2440HZCOUNT CONTINUE40 INC FGT2440HZCOUNT CONTINUE70 CPX #0 BEQ START000 JMP LOOP77 TEST306461TEMP BRA TEST306461 TEST512562TEMP BRA TEST512562 START000 JMP START SYNCPULSESLT60L LDA SYNCSTATUS CMP #0 BEQ CONTINUE60 LDA SYNCPULSESLT60 CMP #$FF BNE CONTINUE50 LDA #$FE STA SYNCPULSESLT60 CONTINUE50 INC SYNCPULSESLT60 CONTINUE60 CPX #0 BEQ START000 JMP LOOP77 LOOP33 JMP LOOP3 NEXT30 LDA TEMP66 CMP #1 BLO NEXT31 * INCX * JMP LOOP77 INC ERRORSTATUS RTS NEXT31 CPX #1
  • 20. Κώδικας Assembly των δύο µικροελεγκτών - 19 - BLO NEXT32 * INCX * JMP LOOP77 INC ERRORSTATUS NEXT32 RTS TEST306461 CMP #102 BLO FGT1400&FLT1640 * BLO ERROR BRA BITZERO TEST512562 LDA DIFFH CMP #2 BHI FLT700HZ LDA DIFFL CMP #202 BHI FLT700HZ * BHI ERROR BRA BITZERO FGT1400&FLT1640 JMP FGT1400&FLT1640H BITONE INC TEMP6 LDA COUNTLOOP1 CMP #1 BLO TELOS0 BRA BEFORETELOS LOOP770 JMP LOOP77 LOOP00 JMP LOOP0 BITZERO INC TEMP66 LDA TEMP6 CMP #60 BLS SYNCPULSESLT60L * BLS ERROR LDA SYNCSTATUS CMP #$FF BNE CONTINUE110 LDA #$FE STA SYNCSTATUS CONTINUE110 INC SYNCSTATUS CLC INC COUNTLOOP1 BRA TELOS BEFORETELOS INC COUNTLOOP1 TELOS0 SEC TELOS ROL RECEIVEDBYTE0 ROL RECEIVEDBYTE1
  • 21. Κώδικας Assembly των δύο µικροελεγκτών - 20 - ROL RECEIVEDBYTE2 ROL RECEIVEDBYTE3 ROL RECEIVEDBYTE4 ROL RECEIVEDBYTE5 ROL RECEIVEDBYTE6 ROL RECEIVEDBYTE7 ROL RECEIVEDBYTE8 ROL RECEIVEDBYTE9 ROL RECEIVEDBYTE10 ROL RECEIVEDBYTE11 ROL RECEIVEDBYTE12 ROL RECEIVEDBYTE13 LDA TEMPCAPT2H STA TEMPCAPT1H LDA TEMPCAPT2L STA TEMPCAPT1L LDA COUNTLOOP1 CMP #113 BLO LOOP33 INCX INC CORRECTROLLEDVALUE CPX #2 BHS CONTINUE1 CONTINUE3 JMP LOOP4000 CONTINUE1 LDA CORRECTROLLEDVALUE CMP #2 BLO CONTINUE3 LDA RECEIVEDBYTE0 CMP FIRSTVALUE0 BNE LOOP3900 LDA RECEIVEDBYTE1 CMP FIRSTVALUE1 BNE LOOP3900 LDA RECEIVEDBYTE2 CMP FIRSTVALUE2 BNE LOOP3900 LDA RECEIVEDBYTE3 CMP FIRSTVALUE3 BNE LOOP3900 LDA RECEIVEDBYTE4 CMP FIRSTVALUE4 BNE LOOP3900 LDA RECEIVEDBYTE5 CMP FIRSTVALUE5 BNE LOOP3900 LDA RECEIVEDBYTE6 CMP FIRSTVALUE6 BNE LOOP3900 LDA RECEIVEDBYTE7 CMP FIRSTVALUE7 BNE LOOP3900 LDA RECEIVEDBYTE8 CMP FIRSTVALUE8 BNE LOOP3900 LDA RECEIVEDBYTE9 CMP FIRSTVALUE9
  • 22. Κώδικας Assembly των δύο µικροελεγκτών - 21 - BNE LOOP3900 LDA RECEIVEDBYTE10 CMP FIRSTVALUE10 BNE LOOP3900 LDA RECEIVEDBYTE11 CMP FIRSTVALUE11 BNE LOOP3900 LDA RECEIVEDBYTE12 CMP FIRSTVALUE12 BNE LOOP3900 LDA RECEIVEDBYTE13 CMP FIRSTVALUE13 BNE LOOP3900 INC FIRSTVALUECOUNT LDA FIRSTVALUECOUNT CMP #31 BEQ FIRSTVALUEMAX JMP LOOP77 LOOP3900 JMP LOOP39000 FIRSTVALUEMAX LDA FIRSTVALUECOUNT STA CORRECTPAIRSCOUNT STA SAMEVALUEPAIRS LDA FIRSTVALUE0 STA CORRECT0 LDA FIRSTVALUE1 STA CORRECT1 LDA FIRSTVALUE2 STA CORRECT2 LDA FIRSTVALUE3 STA CORRECT3 LDA FIRSTVALUE4 STA CORRECT4 LDA FIRSTVALUE5 STA CORRECT5 LDA FIRSTVALUE6 STA CORRECT6 LDA FIRSTVALUE7 STA CORRECT7 LDA FIRSTVALUE8 STA CORRECT8 LDA FIRSTVALUE9 STA CORRECT9 LDA FIRSTVALUE10 STA CORRECT10 LDA FIRSTVALUE11 STA CORRECT11 LDA FIRSTVALUE12 STA CORRECT12 LDA FIRSTVALUE13 STA CORRECT13 JMP EXIT1 SHUTDOWN2 CPX #20 BLO START0000 BSET 5,SECONDTIME START0000 JMP START LOOP4000 LDA RECEIVEDBYTE0 STA FIRSTVALUE0 LDA RECEIVEDBYTE1 STA FIRSTVALUE1 LDA RECEIVEDBYTE2 STA FIRSTVALUE2
  • 23. Κώδικας Assembly των δύο µικροελεγκτών - 22 - LDA RECEIVEDBYTE3 STA FIRSTVALUE3 LDA RECEIVEDBYTE4 STA FIRSTVALUE4 LDA RECEIVEDBYTE5 STA FIRSTVALUE5 LDA RECEIVEDBYTE6 STA FIRSTVALUE6 LDA RECEIVEDBYTE7 STA FIRSTVALUE7 LDA RECEIVEDBYTE8 STA FIRSTVALUE8 LDA RECEIVEDBYTE9 STA FIRSTVALUE9 LDA RECEIVEDBYTE10 STA FIRSTVALUE10 LDA RECEIVEDBYTE11 STA FIRSTVALUE11 LDA RECEIVEDBYTE12 STA FIRSTVALUE12 LDA RECEIVEDBYTE13 STA FIRSTVALUE13 INC FIRSTVALUECOUNT JMP LOOP77 LOOP39000 LDA SECONDVALUECOUNT CMP #1 BLO LOOP3910 LDA RECEIVEDBYTE0 CMP SECONDVALUE0 BNE LOOP3920 LDA RECEIVEDBYTE1 CMP SECONDVALUE1 BNE LOOP3920 LDA RECEIVEDBYTE2 CMP SECONDVALUE2 BNE LOOP3920 LDA RECEIVEDBYTE3 CMP SECONDVALUE3 BNE LOOP3920 LDA RECEIVEDBYTE4 CMP SECONDVALUE4 BNE LOOP3920 LDA RECEIVEDBYTE5 CMP SECONDVALUE5 BNE LOOP3920 LDA RECEIVEDBYTE6 CMP SECONDVALUE6 BNE LOOP3920 LDA RECEIVEDBYTE7 CMP SECONDVALUE7 BNE LOOP3920 LDA RECEIVEDBYTE8 CMP SECONDVALUE8 BNE LOOP3920 LDA RECEIVEDBYTE9 CMP SECONDVALUE9 BNE LOOP3920 LDA RECEIVEDBYTE10 CMP SECONDVALUE10 BNE LOOP3920 LDA RECEIVEDBYTE11 CMP SECONDVALUE11
  • 24. Κώδικας Assembly των δύο µικροελεγκτών - 23 - BNE LOOP3920 LDA RECEIVEDBYTE12 CMP SECONDVALUE12 BNE LOOP3920 LDA RECEIVEDBYTE13 CMP SECONDVALUE13 BNE LOOP3920 INC SECONDVALUECOUNT LDA SECONDVALUECOUNT CMP #31 BEQ SECONDVALUEMAX JMP LOOP77 LOOP3910 BRA LOOP39100 LOOP3920 BRA LOOP39200 SECONDVALUEMAX LDA SECONDVALUECOUNT STA CORRECTPAIRSCOUNT STA SAMEVALUEPAIRS LDA SECONDVALUE0 STA CORRECT0 LDA SECONDVALUE1 STA CORRECT1 LDA SECONDVALUE2 STA CORRECT2 LDA SECONDVALUE3 STA CORRECT3 LDA SECONDVALUE4 STA CORRECT4 LDA SECONDVALUE5 STA CORRECT5 LDA SECONDVALUE6 STA CORRECT6 LDA SECONDVALUE7 STA CORRECT7 LDA SECONDVALUE8 STA CORRECT8 LDA SECONDVALUE9 STA CORRECT9 LDA SECONDVALUE10 STA CORRECT10 LDA SECONDVALUE11 STA CORRECT11 LDA SECONDVALUE12 STA CORRECT12 LDA SECONDVALUE13 STA CORRECT13 JMP EXIT1 LOOP39100 LDA RECEIVEDBYTE0 STA SECONDVALUE0 LDA RECEIVEDBYTE1 STA SECONDVALUE1 LDA RECEIVEDBYTE2 STA SECONDVALUE2 LDA RECEIVEDBYTE3 STA SECONDVALUE3 LDA RECEIVEDBYTE4 STA SECONDVALUE4 LDA RECEIVEDBYTE5 STA SECONDVALUE5 LDA RECEIVEDBYTE6 STA SECONDVALUE6 LDA RECEIVEDBYTE7
  • 25. Κώδικας Assembly των δύο µικροελεγκτών - 24 - STA SECONDVALUE7 LDA RECEIVEDBYTE8 STA SECONDVALUE8 LDA RECEIVEDBYTE9 STA SECONDVALUE9 LDA RECEIVEDBYTE10 STA SECONDVALUE10 LDA RECEIVEDBYTE11 STA SECONDVALUE11 LDA RECEIVEDBYTE12 STA SECONDVALUE12 LDA RECEIVEDBYTE13 STA SECONDVALUE13 INC SECONDVALUECOUNT JMP LOOP77 LOOP39200 LDA THIRDVALUECOUNT CMP #1 BLO LOOP3930 LDA RECEIVEDBYTE0 CMP THIRDVALUE0 BNE LOOP77 LDA RECEIVEDBYTE1 CMP THIRDVALUE1 BNE LOOP77 LDA RECEIVEDBYTE2 CMP THIRDVALUE2 BNE LOOP77 LDA RECEIVEDBYTE3 CMP THIRDVALUE3 BNE LOOP77 LDA RECEIVEDBYTE4 CMP THIRDVALUE4 BNE LOOP77 LDA RECEIVEDBYTE5 CMP THIRDVALUE5 BNE LOOP77 LDA RECEIVEDBYTE6 CMP THIRDVALUE6 BNE LOOP77 LDA RECEIVEDBYTE7 CMP THIRDVALUE7 BNE LOOP77 LDA RECEIVEDBYTE8 CMP THIRDVALUE8 BNE LOOP77 LDA RECEIVEDBYTE9 CMP THIRDVALUE9 BNE LOOP77 LDA RECEIVEDBYTE10 CMP THIRDVALUE10 BNE LOOP77 LDA RECEIVEDBYTE11 CMP THIRDVALUE11 BNE LOOP77 LDA RECEIVEDBYTE12 CMP THIRDVALUE12 BNE LOOP77 LDA RECEIVEDBYTE13 CMP THIRDVALUE13 BNE LOOP77 INC THIRDVALUECOUNT LDA THIRDVALUECOUNT
  • 26. Κώδικας Assembly των δύο µικροελεγκτών - 25 - CMP #31 BEQ THIRDVALUEMAX BRA LOOP77 LOOP77 BRA LOOP777 LOOP3930 JMP LOOP39300 THIRDVALUEMAX LDA THIRDVALUECOUNT STA CORRECTPAIRSCOUNT STA SAMEVALUEPAIRS LDA THIRDVALUE0 STA CORRECT0 LDA THIRDVALUE1 STA CORRECT1 LDA THIRDVALUE2 STA CORRECT2 LDA THIRDVALUE3 STA CORRECT3 LDA THIRDVALUE4 STA CORRECT4 LDA THIRDVALUE5 STA CORRECT5 LDA THIRDVALUE6 STA CORRECT6 LDA THIRDVALUE7 STA CORRECT7 LDA THIRDVALUE8 STA CORRECT8 LDA THIRDVALUE9 STA CORRECT9 LDA THIRDVALUE10 STA CORRECT10 LDA THIRDVALUE11 STA CORRECT11 LDA THIRDVALUE12 STA CORRECT12 LDA THIRDVALUE13 STA CORRECT13 JMP EXIT1 LOOP39300 LDA RECEIVEDBYTE0 STA THIRDVALUE0 LDA RECEIVEDBYTE1 STA THIRDVALUE1 LDA RECEIVEDBYTE2 STA THIRDVALUE2 LDA RECEIVEDBYTE3 STA THIRDVALUE3 LDA RECEIVEDBYTE4 STA THIRDVALUE4 LDA RECEIVEDBYTE5 STA THIRDVALUE5 LDA RECEIVEDBYTE6 STA THIRDVALUE6 LDA RECEIVEDBYTE7 STA THIRDVALUE7 LDA RECEIVEDBYTE8 STA THIRDVALUE8 LDA RECEIVEDBYTE9 STA THIRDVALUE9 LDA RECEIVEDBYTE10 STA THIRDVALUE10
  • 27. Κώδικας Assembly των δύο µικροελεγκτών - 26 - LDA RECEIVEDBYTE11 STA THIRDVALUE11 LDA RECEIVEDBYTE12 STA THIRDVALUE12 LDA RECEIVEDBYTE13 STA THIRDVALUE13 INC THIRDVALUECOUNT LOOP777 CPX #20 BLO NEXT40 BRA EXIT EXIT LDA FIRSTVALUECOUNT CMP SECONDVALUECOUNT BHI FIRSTGTSECOND BLO SECONDGTFIRST BRA FIRSTEQSECOND FIRSTGTSECOND CMP THIRDVALUECOUNT BHI FVMAX BLO TVMAX BRA FIRSTEQTHIRD FVMAX JMP FIRSTVALUEMAX SECONDGTFIRST LDA SECONDVALUECOUNT CMP THIRDVALUECOUNT BHI SVMAX BLO TVMAX BRA SECONDEQTHIRD SVMAX JMP SECONDVALUEMAX TVMAX JMP THIRDVALUEMAX FIRSTEQSECOND LDA FIRSTVALUECOUNT CMP THIRDVALUECOUNT BHI SHUTDOWN3 BLO TVMAX BRA SHUTDOWN3 SECONDEQTHIRD LDA FIRSTVALUECOUNT CMP THIRDVALUECOUNT BHI FVMAX BLO SHUTDOWN3 BRA SHUTDOWN3 FIRSTEQTHIRD LDA SECONDVALUECOUNT CMP THIRDVALUECOUNT BHI SVMAX BLO SHUTDOWN3 BRA SHUTDOWN3 SHUTDOWN3 BRA ALLERRORDISPLAY EXIT1 LDA CORRECTPAIRSCOUNT CMP #3 BHI NEXT3 ALLERRORDISPLAY LDA RECEIVESTATUS CMP #$FF BNE GOSTART BSET 1,PORTC.DATA
  • 28. Κώδικας Assembly των δύο µικροελεγκτών - 27 - GOSTART JMP SHUTDOWN2 INIT2 JMP INIT CORPAIRDISPL JMP CORPAIRDISPLAY NEXT40 JMP LOOP0 NEXT3 LDA RECEIVESTATUS CMP #$FF BEQ CORPAIRDISPL CMP #0 BNE INIT2 LDA SAMEVALUEPAIRS ORA SECONDTIME STA SAMEVALUEPAIRS BRCLR 3,CODE,OUTWAY LDA FIRSTVALUECOUNT ORA SECONDTIME STA CORRECT8 LDA SECONDVALUECOUNT ORA SECONDTIME STA CORRECT9 LDA THIRDVALUECOUNT ORA SECONDTIME STA CORRECT10 LDA INTERPACKETCOUNT STA CORRECT11 LDA SYNCPULSESLT60 STA CORRECT12 LDA FGT2440HZCOUNT STA CORRECT13 LDA FGT1400&FLT1640C STA SAMEVALUEPAIRS OUTWAY RTS ************************ MAIN CLR PULSEPACKETS.NUM AGAIN2 JSR Synchronization LDA CODE STA BYTETOBESEND0 JSR Send INC PULSEPACKETS.NUM LDA PULSEPACKETS.NUM CMP #50 BEQ PULSEDOWN CLRA AGAIN3 INCA CMP #1 BEQ AGAIN2 BRA AGAIN3 PULSEDOWN BSET 0,TIMER.CONTROL JSR TIMEWAIT
  • 29. Κώδικας Assembly των δύο µικροελεγκτών - 28 - NOP NOP NOP NOP BCLR 0,PortC.Data NOP NOP RTS Send CLR ShiftedBits Send1 LDA ShiftedBits INCA CMP BitsToBeSend BLO Send2 BRA ExitSend Send2 STA ShiftedBits JSR ShiftBit JSR TimeWait JSR TimeWait BRA Send1 ExitSend RTS ShiftBit LSL ByteToBeSend0 CLRX ROLX STX PulseW.Status RTS TimeWait LDX PulseW.Status LDA Timer.Status LDA Timer.Control EOR #%00000001 STA Timer.Control LDA Counts.LowByte,X ADD OutCom.LowByte STA OutCom.LowByte~ LDX PulseW.Status LDA Counts.HighByte,X ADC OutCom.HighByte STA OutCom.HighByte LDA OutCom.LowByte~ STA OutCom.LowByte OutComFlag.Clr BRCLR 6,Timer.Status,OutComFlag.Clr LDA Timer.Status RTS Synchronization LDA SynPul.Level STA PulseW.Status BCLR 0,Timer.Control JSR TimeWait JSR TimeWait JSR TimeWait CLR SynPul.Counter Synchronization1 LDA SynPul.Counter INCA CMP SynPul.Num BLO Synchronization2 BRA ExitSynchron1
  • 30. Κώδικας Assembly των δύο µικροελεγκτών - 29 - Synchronization2 STA SynPul.Counter JSR TimeWait JSR TimeWait BRA Synchronization1 ExitSynchron1 LDA PulseW.Status EOR #%00000001 STA PulseW.Status JSR TimeWait JSR TimeWait ExitSynchronize RTS TESTCONTROL LDA PORTD.DATA AND #%00000011 CMP #0 BEQ OUT0 CMP #1 BEQ OUT1 CMP #3 BEQ OUT3 CMP #2 BEQ OUT2 BRA TESTCONTROL OUT0 CLR RECEIVESTATUS JMP INIT OUT1 BRA RXD OUT2 BRA TXD1 OUT3 BRA TXD TXD BCLR 1,PORTC.DATA LDA #9 STA BITSTOBESEND LDA #201 STA SYNPUL.NUM CLR SYNPUL.LEVEL LDA #%00000000 STA CODE JSR MAIN BRA TESTCONTROL TXD1 BCLR 1,PORTC.DATA LDA #9 STA BITSTOBESEND LDA #101 STA SYNPUL.NUM CLR SYNPUL.LEVEL LDA #%00110011 STA CODE JSR MAIN BRA TESTCONTROL RXD LDA #$FF STA RECEIVESTATUS JMP START CORPAIRDISPLAY LDX SAMEVALUEPAIRS CPX #20 BHS LEDOFF
  • 31. Κώδικας Assembly των δύο µικροελεγκτών - 30 - LEDONLOOP JSR LEDON BCLR 1,PORTC.DATA JSR LEDOFFTIMER JSR LEDOFFTIMER JSR LEDOFFTIMER JSR LEDOFFTIMER JSR LEDOFFTIMER JSR LEDOFFTIMER JSR LEDOFFTIMER JSR LEDOFFTIMER JSR LEDOFFTIMER INCX CPX #20 BEQ LEDOFF BRA LEDONLOOP LEDOFF BCLR 1,PORTC.DATA JMP TESTCONTROL LEDON BSET 1,PORTC.DATA LEDOFFTIMER JSR DELAY50MS RTS DELAY50MS LDA TIMER.STATUS LDA TIMER.CONTROL LDA COUNT.HIGHBYTE STA COUNT.HIGHBYTE~ LDA COUNT.LOWBYTE ADD #$A8 STA OUTCOM.LOWBYTE~ LDA COUNT.HIGHBYTE~ ADC #$61 STA OUTCOM.HIGHBYTE LDA OUTCOM.LOWBYTE~ STA OUTCOM.LOWBYTE TIMERLOOP3 BRCLR 6,TIMER.STATUS,TIMERLOOP3 RTS * * Dlay50ms : 50 ms delay routine * Dlay50ms STA TEMPA STX TEMPX LDA #32 OutLoop CLRX InLoop DECX BNE InLoop DECA BNE OutLoop LDX TEMPX LDA TEMPA RTS ;End of Delay50ms routine
  • 32. Κώδικας Assembly των δύο µικροελεγκτών - 31 - * * Delay1-5ms : 1.5 ms delay * Delay1-5ms STX TEMPX CLRX InLoop2 DECX BNE InLoop2 RTS ; End of Delay1-5ms routine ORG $1EE0 Counts.LowByte FDB $FA7D Counts.HighByte FDB $0000 ORG $1FF0 FDB $0000 ORG $1FFE FDB INIT END Λίστα assembly 2ου µικροελεγκτή 5ο αρχείο : MINILCD.ASM. Το αρχείο αυτό αποτελεί την έκδοση του προγράµµατος του 2ου µικροελεγκτή για την µικρή οθόνη. * MiniLCD.asm - Mini LCD controller program . * Tolis Stavrakoudis * * Port A --> LCD output (out) & Data input from 1st microc. (in) * * Port B : bits 0-3 --> Get station number from dip switches (in) * * Port B : bit 4 --> LCD R/W pin (out) * Port B : bit 5 --> LCD RS pin (out) * Port B : bit 6 --> LCD E1 pin (enable 1) (out) * Port B : bit 7 --> LCD E2 pin (enable 2) (out) * * Port C : bit 0 --> Get start signal from push button (in) * Port C : bit 1 --> Send start receiving data to 1st microc. (out) * Port C : bit 2 --> Ready to receive next byte from 1st microc. (out) * Port C : bit 3 --> (1st microc.) Sending next byte. Get ready ! (in) $BASE 10T ; Decimal notation PORTA EQU $00 ; PORT A DDRA EQU $04 ; PORT A direction PORTB EQU $01 ; PORT B DDRB EQU $05 ; PORT B direction PORTC EQU $02 ; PORT C DDRC EQU $06 ; PORT C direction ORG $A0 ; Variables TEMPA RMB 1 ; Temporary accumulator TEMPX RMB 1 ; Temporary X register TEMP1 RMB 1 ; Temporary byte 1 (general porpose) TEMP2 RMB 1 ; Temporary byte 2 (general porpose) Station RMB 1 ; Station number ( 1 - 16)
  • 33. Κώδικας Assembly των δύο µικροελεγκτών - 32 - Cnt RMB 1 ; Counter for bytes that come in BCDCnt RMB 1 ; BCD Counter used in Bin2BCD proc BCDout RMB 1 ; Byte in BCD format written from Bin2BCD proc Bytes RMB 15 ; All the data bytes together ORG $100 ; Starting program at position 100h INIT ; Initialization proc LDA #$00 STA DDRA ; Port A is INPUT LDA #$F0 ; Port B : PB0 - PB3 : IN STA DDRB ; PB4 - PB7 : OUT BCLR 4,PORTB ; R/W = 0 BCLR 5,PORTB ; RS = 0 BCLR 6,PORTB ; E1 = 0 BCLR 7,PORTB ; E2 = 0 LDA #%11110110 STA DDRC ; Port C : PC0 : IN ; PC1 : OUT ; PC2 : OUT ; PC3 : IN ( From 1st microcontroller) BCLR 1,PORTC ; PC1 = 0 (Start operation) BCLR 2,PORTC ; PC2 = 0 (Send next byte) BCLR 4,PORTC CLR TEMPA ; Clearing all temporary bytes CLR TEMPX CLR TEMP1 CLR TEMP2 CLR Station ; Clearing station number CLR Cnt ; Clear counter START ; Program starts here LDA PORTC ; Wait for start signal AND #1 BEQ START BEGIN ; Begin operation LDA PORTB ; Load Port B into accumulator AND #$0F ; Only the PB0 - PB3 is active STA Station ; Store station number to Station BSET 1,PORTC ; PC1 = 1.Start operation signal send to 1st microc. NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP ; Just a delay BCLR 1,PORTC ; PC1 = 0 . Start operation = 0 Receive ; Receive data from 1st microc. STX TEMPX ; Store X to TEMPX CLRX CLR Cnt
  • 34. Κώδικας Assembly των δύο µικροελεγκτών - 33 - BytesIn NOP NOP NOP NOP NOP ; Delay in order to get next byte properly LDA PORTC ; Check if PC3 = 1 AND #%00001000 BEQ BytesIn ; If PC3 = 0 goto ByteIn BSET 4,PORTC ; Test LED on NOP NOP NOP NOP LDA PORTA ; Get byte in STA Bytes,X ; Store to Bytes table + X possition INC Cnt ; Increase Counter INCX ; Increase X register memory shift in Bytes table LDA #15 CMP Cnt ; Compare Cnt with 15 BEQ RecEnd ; If Cnt = 15 leave JMP BytesIn ; Go up for next byte... RecEnd ; End of data exchange LDX TEMPX ; Restore old X value LDA #$FF STA DDRA ; Port A is exit now for the LCD display LDA #0 STA PORTA ; Port A = 0 CLR Cnt ; Clear Counter BSET 4,PORTC ; Test bit -> 1 JSR InitLCD ; Initialize the LCD JSR WriteData ; Write Bytes data to 3rd line of the LCD JSR InitLCD2 ; Second row JSR DataStation ; Write Station in line 1 HERE BRA HERE ; Ready to receive new operation for another station ******************************************************* * WriteData : Write Bytes data to 3rd line of the LCD * * Write Bytes to 3rd line * * Format is XX XX XX XX-XX XX XX XX (where XX in hex) * ******************************************************* WriteData STX TEMPX STA TEMPA CLR Cnt ; Clear counter CLRX MainLoop LDA Bytes,X ; Load acca with Bytes[X] data each time STA TEMP1 AND #$F0 ; Upper 4 bits ASRA ASRA
  • 35. Κώδικας Assembly των δύο µικροελεγκτών - 34 - ASRA ASRA AND #$0F ; Bit 7 is sure 0 CMP #9 ; Is a number? BHI AF ; No.Then it's a letter A to F (Jump AF) ADD #48 ; Make it ASCII number JSR WDAT ; And write it... JMP Dig1 AF ADD #55 ; Make it ASCII letter A-F JSR WDAT ; And write it Dig1 LDA TEMP1 ; Go for second hex digit AND #$0F ; 4 lower bits only CMP #9 ; Is a number? BHI AF2 ; No.Then it's a letter A to F (Jump AF) ADD #48 ; Make it ASCII number JSR WDAT ; And write it... JMP Dig2 AF2 ADD #55 ; Make it ASCII letter A-F JSR WDAT ; And write it Dig2 LDA #$20 JSR WDAT ; Write a space INC Cnt ; Bytes written INCX ; Also X register LDA Cnt CMP #8 ; If display on 6th byte -> 1 line down BNE Next LDA #%11000000 JSR WCTRL LDA Cnt Next CMP #15 ; Bytes = 15 ? BEQ NoLoop ; Exit... JMP MainLoop ; Next byte... NoLoop LDA TEMPA LDX TEMPX CLR Cnt CLR TEMP1 ; All temporary variables to old values... RTS ; Exit WriteData proc *************************************************************************** * DataStation : Write Station : xx (xx = 1-16) to the first line of the LCD * Input : Station byte (binary) * Accumulator unchanged *************************************************************************** DataStation ; Procedure starts here STA TEMPA ; Store accu to TEMPA ; Start writing 'Station : ' LDA #$53 JSR WDAT2 ; 'S' LDA #$74 JSR WDAT2 ; 't' LDA #$61 JSR WDAT2 ; 'a' LDA #$74 JSR WDAT2 ; 't' LDA #$69 JSR WDAT2 ; 'i' LDA #$6F JSR WDAT2 ; 'o'
  • 36. Κώδικας Assembly των δύο µικροελεγκτών - 35 - LDA #$6E JSR WDAT2 ; 'n' LDA #$20 JSR WDAT2 ; ' ' LDA #$3A JSR WDAT2 ; ':' LDA #$20 JSR WDAT2 ; ' ' ; Procced with station number LDA Station JSR Bin2BCD ; Convert station to readable format LDA BCDout ; Output to acca AND #$F0 ; First 4 bits (If exist) CMP #0 BEQ Digit2 ASRA ; 4 bits to the right ASRA ASRA ASRA AND #$0F ; Eliminate bit7 from being 1, if any... ADD #48 ; number + 48 --> ASCII number in LCD JSR WDAT2 ; And write it to the LCD Digit2 LDA BCDout ; Load BCDout again for second digit (main) AND #$0F ; 4 lower bits only ADD #48 ; Same procedure again... JSR WDAT2 ; And write it to the LCD LDA TEMPA ; Restore acca old value RTS ; Leave DataStation proc ************************************************* * InitLCD : Initialize LCD display's first line * * Just sending commands... * * Acca remains as was * ************************************************* InitLCD STA TEMPA ; Store acca LDA #$01 JSR WCTRL ; Send clear LDA #$02 JSR WCTRL ; Send Home LDA #$38 JSR WCTRL ; Function Set : 8 bit, 2 line, 5x7 font LDA #$0C JSR WCTRL ; Display on, Cursor off LDA #$06 JSR WCTRL ; Entry mode : Increase address, no shift LDA TEMPA RTS ; Leave InitLCD proc ************************************************ * WCTRL : Write control word to LCD (1st line) * * Input : accu * ************************************************ WCTRL STX TEMPX ; Store X register STA PORTA ; Data out BSET 6,PORTB ; E1 --> 1 BCLR 6,PORTB ; E1 --> 0
  • 37. Κώδικας Assembly των δύο µικροελεγκτών - 36 - LDX #20 ; 60 µsec delay L120u DECX BNE L120u CMP #$02 ; If command > $02 BHI ARN5m ; then goto ARN5m L5m JSR ANRTS ; else jump to an RTS command DECX BNE L5m ; 2.5 msec delay ARN5M LDX TEMPX CLR TEMPX ANRTS RTS ; Return to program (exit WCTRL proc) ******************************************** * WDAT : Write data word to LCD (1st line) * * Input : acca * ******************************************** WDAT STX TEMPX ; Store X register STA TEMPA ; Store accu STA PORTA ; Data out BSET 5,PORTB ; RS --> 1 BSET 6,PORTB ; E1 --> 1 BCLR 6,PORTB ; E1 --> 0 BCLR 5,PORTB ; RS --> 0 LDX #20 ; 60 µsec delay L120 DECX BNE L120 LDA TEMPA ; Initial value to acca and X registers CLR TEMPA LDX TEMPX CLR TEMPX RTS ; Return to program (exit WDAT proc) ******************************************* * Bin2BCD proc : Binary to BCD conversion * * Input : accu / output : BCDout * * 2 digits maximum * ******************************************* Bin2BCD STA TEMP2 ; Store accu to TEMP2 CLR BCDCnt ; Zero BCDCounter MainBCD CMP #9 ; Load accu into Val and compare with 9 BHI Subtract ; One decade down if Val > 9 STA TEMP1 LDA BCDCnt ; Load number of decades into accu ASLA ; and shift left 4 times to get the ASLA ; decades digit ASLA ASLA ORA TEMP1 ; MSB (or) LSB --> BCD out STA BCDout ; BCDout is the result in BCD format LDA TEMP2 ; Store initial value to accu CLR TEMP2 ; and clear TEMP2 RTS ; Return from Bin2BCD proc Subtract SUB #10 ; Subtract 10 INC BCDCnt JMP MainBCD
  • 38. Κώδικας Assembly των δύο µικροελεγκτών - 37 - ORG $1FF0 FDB $0000 ORG $1FFE ; RESET vector FDB INIT 6ο αρχείο : MAINLCD.ASM. Το αρχείο αυτό αποτελεί την έκδοση του προγράµµατος του 2ου µικροελεγκτή για την µεγάλη οθόνη. ************************************************************************* ** MainLCD.asm - LCD controller program (FINAL VERSION). ** Tolis Stavrakoudis ** ** Port A : bits 0-7 --> LCD output(out), Data input from 1st microc.(in) ** ** Port B : bits 0-3 --> Get station number from dip switches (in) ** Port B : bit 4 --> LCD R/W pin (out) ** Port B : bit 5 --> LCD RS pin (out) ** Port B : bit 6 --> LCD E1 pin (enable 1) (out) ** Port B : bit 7 --> LCD E2 pin (enable 2) (out) ** ** Port C : bit 0 --> Get start signal from push button (in) ** Port C : bit 1 --> Send start receiving data to 1st microc. (out) ** Port C : bit 2 --> Ready to receive next byte from 1st microc. (out) ** Port C : bit 3 --> (1st microc.) Sending next byte (in) ** Port C : bit 4 --> Line up button (in) ** Port C : bit 5 --> Line down button (in) ************************************************************************* $BASE 10T ; Decimal notation PortA EQU $00 PortB EQU $01 PortC EQU $02 DDRA EQU $04 ; Direction of portA DDRB EQU $05 ; Direction of PortB DDRC EQU $06 ; Direction of portC RamLoop EQU $65 ; RAM code (5 bytes) ORG $50 ; Variables LineCnt RMB 1 ; Used in data selection (0,1,2,3) TempCnt RMB 1 Temp RMB 1 TempA RMB 1 TempX RMB 1 Temp1 RMB 1 Temp2 RMB 1 Cnt RMB 1 ; Used in DIV32 proc & for data in BCDout RMB 1 ; Out number from Bin2BCD proc BCDCnt RMB 1 Station RMB 1 ; Station number ( 1 - 16) Bytes RMB 15 ; Received bytes RefMeasure RMB 2 ; Ultrasonic reference measurement RealMeasure RMB 2 ; Ultrasonic real measurement Channel0 RMB 2 ; Conductivity Channel1 RMB 2 ; pH Channel2 RMB 2 ; Oxygen Channel3 RMB 2 ; Water temperature Channel2_0 RMB 2 ; Air temperature
  • 39. Κώδικας Assembly των δύο µικροελεγκτών - 38 - Channel2_1 RMB 2 ; System temperature Channel2_2 RMB 2 ; Battery voltage Flag RMB 1 ; flag input1 RMB 4 ; 32 bit addition and subtraction input2 RMB 4 sum RMB 4 diff RMB 4 multp RMB 4 ; 32 bit multiplication mulcan RMB 4 mtemp RMB 4 dvdnd RMB 4 ; 32 bit division divisor RMB 4 quo RMB 4 TempAx RMB 4 ; Temp ax Tempb RMB 4 ; Temp b constant TempBc RMB 1 TempAxc RMB 1 ; Temporary Control bytes Final1 RMB 4 Final2 RMB 4 ; Final results for both lines Final1C RMB 1 Final2C RMB 1 ; Final results' control bytes PStation RMB 2 ; Pointer to station's relative address Alarm RMB 1 ; Alarm control byte TmpCnt2 RMB 1 ; Temporary Cnt * Variables ends here ORG $100 ; Program starts here INIT NOP NOP NOP NOP ; Delays in case of RESET signal LDA #$FF STA DDRA ; Port A is output LDA #$F0 ; Port B : PB0 - PB3 : IN STA DDRB ; PB4 - PB7 : OUT BCLR 4,PORTB ; R/W = 0 BCLR 5,PORTB ; RS = 0 BCLR 6,PORTB ; E1 = 0 BCLR 7,PORTB ; E2 = 0 LDA #%11000110 STA DDRC ; Port C : in/out CLR PORTC CLR PORTB CLR TEMPA ; Clearing all temporary bytes CLR TEMPX CLR TEMP1 CLR TEMP2 CLR Station ; Clearing station number CLR Cnt ; Clear counter LDA #0 STA LineCnt ; Clear line counter (Line = 0) CLR TempAx
  • 40. Κώδικας Assembly των δύο µικροελεγκτών - 39 - CLR TempAx+1 CLR TempAx+2 CLR TempAx+3 CLR Tempb CLR Tempb+1 CLR Tempb+2 CLR Tempb+3 CLR mulcan CLR mulcan+1 CLR mulcan+2 CLR mulcan+3 CLR Final1 CLR Final1+1 CLR Final1+2 CLR Final1+3 CLR Final2 CLR Final2+1 CLR Final2+2 CLR Final2+3 JSR InitLCD ; LCD initialization LDA #00 STA DDRA ; PortA is now input START ; Staring program LDA PORTC ; Wait for start signal AND #1 BEQ START BEGIN ; Begin operation LDA PORTB ; Load Port B nto accumulator AND #$0F ; Only the PB0 - PB3 is active STA Station ; Store station number to Station BSET 1,PORTC ; PC1 = 1 . Start operation signal send to 1st microc. NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP ; Delay for signal to be understood BCLR 1,PORTC ; PC1 = 0 . Start operation = 0 Receive STX TEMPX ; Receive data from 1st microc. CLRX ; Store X to TEMPX CLR Cnt BytesIn NOP NOP NOP NOP NOP LDA PORTC ; Check if PC3 = 1 AND #%00001000 BEQ BytesIn ; If PC3 = 0 goto ByteIn BSET 6,PORTC ; Test LED on
  • 41. Κώδικας Assembly των δύο µικροελεγκτών - 40 - NOP NOP NOP NOP LDA PORTA ; Get byte in STA Bytes,X ; Store to Bytes table + X possition INC Cnt ; Increase Counter INCX ; Increase X register memory shift in Bytes table LDA #15 CMP Cnt ; Compare Cnt with 15 BEQ RecEnd ; If Cnt = 15 leave JMP BytesIn ; Go up for next byte... RecEnd ; End of data exchange LDX TEMPX ; Restore old X value LDA #$FF STA DDRA ; Port A is exit now for the LCD display LDA #0 STA PORTA ; Port A = 0 CLR Cnt ; Clear Counter BSET 7,PORTC ; Test bit -> 1 JSR DecodeData ; Data decoding proc JSR WriteData ; Write hex data bits LineShow ; Show appropriate line in LCD 1st row LDA #3 ; CMP LineCnt ; 3 - LineCnt = ? BHS OkLine1 ; If LineCnt <= 3 continue SUB LineCnt ; Subtract it AND #$7 ; Only 3 lower bits * Now acca has the value 4 (Line up button on line 0) * or the value 7 (Line down on line 3 gives FF -> 7 with AND) CMP #4 BEQ OkLine2 LDA #3 STA LineCnt ; LineCnt has the value 3 again BRA OkLine1 ; Jump to avoid zeroing OkLine2 LDA #0 STA LineCnt ; LineCnt has the value 0 again OkLine1 ; Line is ok...CONTINUE JSR ShowMask ; Write mask on LCD CLR Final1C ; Zero all these variables CLR Final2C CLR TempAxC CLR TempbC JSR ComputeVals ; Compute values JSR ShowVals ; Print values on LCD LineButton LDA PortC ; Get up-down signal STA TempA ; Storing acca AND #%00100000 ; Check for line down BNE LineDown LDA TempA ; Initial value AND #%00010000 ; Check for line up BNE LineUp BRA LineButton ; If both signals are zero wait for key LineDown INC LineCnt LDA #10 ; 0.5 sec delay STA Cnt
  • 42. Κώδικας Assembly των δύο µικροελεγκτών - 41 - Del1 LDA Cnt CMP #0 BEQ Del1End JSR Delay25ms ; Delay for button release DEC Cnt BRA Del1 ; Now the screen is ready to show Del1End ; the first number BRA LineShow ; Up to LineShow LineUp DEC LineCnt LDA #10 ; 0.5 sec delay STA Cnt Del2 LDA Cnt CMP #0 BEQ Del2End JSR Delay25ms DEC Cnt BRA Del2 ; Now the screen is ready to show Del2End ; the first number BRA LineShow ; Decrease LineCnt and show again HERE BRA HERE ; Never ending loop (Program termination) ********************************* ** Delay25ms : 25 msec delay ** ** Restores acca & X registers ** ********************************* Delay25ms STA input1 STX input1+1 LDA #32 OutLoop CLRX InLoop DECX BNE InLoop ; 256 TIMES (768 µsec) DECA BNE OutLoop LDA input1 LDX input1+1 ; Total 24.7 msec RTS ; End of Delay25ms proc **************************************************** ** WCTRL - Write control byte to LCD (1st line) ** ** Input : acca -> control byte ** ** Restores original values to acca and X ** **************************************************** WCTRL STX TEMPX STA PORTA BSET 6,PORTB ; E1 -> 1 BCLR 6,PORTB ; E1 -> 0 LDX #100 L120U DECX ; 60 µsec delay BNE L120U CMP #$02 BHI ARN5M L5M JSR ARNTS ; 2.5 msec delay DECX BNE L5M ARN5M LDX TEMPX ARNTS RTS
  • 43. Κώδικας Assembly των δύο µικροελεγκτών - 42 - **************************************************** ** WCTRL2 - Write control byte to LCD(2nd line) *** ** Input : acca -> control byte *** ** Restores original values to acca and X *** **************************************************** WCTRL2 STX TEMPX STA PORTA BSET 7,PORTB ; E2 -> 1 BCLR 7,PORTB ; E2 -> 0 LDX #100 L120U2 DECX BNE L120U2 ; 60 µsec delay CMP #$02 BHI ARN5M2 L5M2 JSR ARNTS2 DECX BNE L5M2 ; 2.5 msec delay ARN5M2 LDX TEMPX ARNTS2 RTS *********************************************** ** WDAT - Write data byte to LCD(1st line) *** ** Input : acca -> control byte *** ** Restores original values to acca and X *** *********************************************** WDAT STX TEMPX STA TEMPA STA PORTA BSET 5,PORTB ; RS -> 1 BSET 6,PORTB ; E1 -> 1 BCLR 6,PORTB ; E1 -> 0 BCLR 5,PORTB ; RS -> 0 LDX #100 L120 DECX BNE L120 LDA TEMPA LDX TEMPX RTS ************************************************ ** WDAT2 - Write data byte to LCD(2nd line) *** ** Input : acca -> control byte *** ** Restores original values to acca and X *** ************************************************ WDAT2 STX TEMPX STA TEMPA STA PORTA BSET 5,PORTB ; RS -> 1 BSET 7,PORTB ; E2 -> 1 BCLR 7,PORTB ; E2 -> 0 BCLR 5,PORTB ; RS -> 0 LDX #100 L1202 DECX BNE L1202 LDA TEMPA LDX TEMPX RTS
  • 44. Κώδικας Assembly των δύο µικροελεγκτών - 43 - *************************************************** ** InitLCD : Initialize LCD display's first line ** ** Just sending commands... ** ** Accu remains as was ** *************************************************** InitLCD STA TEMPA ; Store accu LDA #$01 JSR WCTRL ; Send clear JSR WCTRL2 LDA #$02 JSR WCTRL ; Send Home JSR WCTRL2 LDA #$38 JSR WCTRL ; Function Set : 8 bit, 2 line, 5x7 font JSR WCTRL2 LDA #$0C JSR WCTRL ; Display on, Cursor off JSR WCTRL2 LDA #$06 JSR WCTRL ; Entry mode : Increase address, no shift JSR WCTRL2 LDA TEMPA RTS ; End of InitLCD proc ********************************************************* ** WriteData : Write Bytes data to 3rd line of the LCD ** ** Write Bytes to 3rd line ** ** Format is XX XX XX XX-XX XX XX XX (where XX in hex) ** ********************************************************* WriteData STX TEMPX STA TEMPA CLR Cnt ; Clear counter CLRX MainLoop LDA Bytes,X ; Load accu with Bytes[X] data STA TEMP1 AND #$F0 ; Upper 4 bits ASRA ASRA ASRA ASRA AND #$0F ; Bit 7 is sure 0 CMP #9 ; Is a number? BHI AF ; No.Then it's a letter A to F(Jump AF) ADD #48 ; Make it ASCII number JSR WDAT2 ; And write it... JMP Dig1 AF ADD #55 ; Make it ASCII letter A-F JSR WDAT2 ; And write it Dig1 LDA TEMP1 ; Go for second hex digit AND #$0F ; 4 lower bits only CMP #9 ; Is a number? BHI AF2 ; No.It's a letter A to F(Jump AF2) ADD #48 ; Make it ASCII number JSR WDAT2 ; And write it... JMP Dig2
  • 45. Κώδικας Assembly των δύο µικροελεγκτών - 44 - AF2 ADD #55 ; Make it ASCII letter A-F JSR WDAT2 ; And write it Dig2 LDA #$20 JSR WDAT2 ; Write a space INC Cnt ; Bytes written INCX LDA Cnt CMP #8 ; If display on 6th byte -> 1 line down BNE Next LDA #192 JSR WCTRL2 LDA Cnt Next CMP #15 ; Bytes = 15 ? BEQ NoLoop ; Exit... JMP MainLoop ; Next byte... NoLoop LDA #5 ; 8 right shifts of cursor STA Cnt ShiftLp2 LDA Cnt CMP #0 BEQ ShiftLp2End LDA #%00010100 ; Shift cursor to the right 1 char JSR WCTRL2 DEC Cnt BRA ShiftLp2 ; Now the screen is ready to show ShiftLp2End ; the first number LDA #$70 ; Write "pH:" JSR WDAT2 LDA #$48 JSR WDAT2 LDA #$3A JSR WDAT2 LDA Alarm AND #$1 ; Check pH alarm BEQ pHoff LDA #$31 JSR WDAT2 ; Write 1 if on BRA phAfter pHoff LDA #$30 JSR WDAT2 ; Write 0 if off phAfter LDA #$2C JSR WDAT2 ; Write comma LDA #$20 JSR WDAT2 ; Write 1 space LDA #$6F ; Write "oxy:" JSR WDAT2 LDA #$78 JSR WDAT2 LDA #$79 JSR WDAT2 LDA #$3A JSR WDAT2 LDA Alarm AND #$2 ; Check oxygen alarm BEQ oxyOff LDA #$31 JSR WDAT2 ; Write 1 if on BRA oxyAfter oxyOff LDA #$30 JSR WDAT2 ; Write 0 if off
  • 46. Κώδικας Assembly των δύο µικροελεγκτών - 45 - oxyAfter LDA TEMPA LDX TEMPX CLR Cnt CLR TEMP1 ; All temporary variables to old values... RTS ; Exit WriteData proc ********************************************* ** Bin2BCD proc : Binary to BCD conversion ** ** Input : acca ** ** Output : BCDout ** ** 2 digits maximum ** ** Restores original values to acca ** ********************************************* Bin2BCD STA sum+3 ; Store accu to TEMP2 CLR BCDCnt ; Zero BCDCounter MainBCD CMP #9 ; Load accu into Val and compare with 9 BHI Subtract ; One decade down if Val > 9 STA sum+2 LDA BCDCnt ; Load number of decades into accu ASLA ; and shift left 4 times to get the ASLA ; decades digit ASLA ASLA ORA sum+2 ; MSB (or) LSB --> BCD out STA BCDout ; BCDout is the result in BCD format LDA sum+3 ; Store initial value to accu RTS ; Return from Bin2BCD proc Subtract SUB #10 ; Subtract 10 INC BCDCnt BRA MainBCD ; Bin2BCD proc ends here * This function is NOT used in that version of the program. ************************************** ** Bin2Hex - proc : Binary to hex *** ** LCD output *** ** Input : acca *** ** Output : LCD screen *** ** Restores original value to acca *** ************************************** Bin2Hex STA Temp1 AND #$F0 ; Upper 4 bits ASRA ASRA ASRA ASRA AND #$0F ; Bit 7 is sure 0 CMP #9 ; Is a number? BHI AFT ; No.It's a letter A to F(Jump AFT) ADD #48 ; Make it ASCII number JSR WDAT ; And write it... AFT ADD #65 ; Make it ASCII letter A-F JSR WDAT ; And write it LDA Temp1 ; Go for second hex digit AND #$0F ; 4 lower bits only CMP #9 ; Is a number? BHI AF2T ; No.It's a letter A to F(Jump AF2T)
  • 47. Κώδικας Assembly των δύο µικροελεγκτών - 46 - ADD #48 ; Make it ASCII number JSR WDAT ; And write it... AF2T ADD #65 ; Make it ASCII letter A-F JSR WDAT ; And write it LDA Temp1 RTS ; Leave Bin2Hex proc ***************************************** ** DecodeData proc - Decodes data from ** ** 15 received bytes ** ** Input : Bytes ** ** Output : 16bit variables ** ** Restores original values to acca ** ***************************************** DecodeData STA TEMPA LDA Bytes+6 ; Byte 7 : bits 0-7 STA Channel0+1 LDA Bytes+7 ; Byte 8 : bits 0-7 STA Channel1+1 LDA Bytes+8 ; Byte 9 : bits 0-7 STA Channel2+1 LDA Bytes+9 ; Byte 10 : bits 0-7 STA Channel3+1 LDA Bytes+5 ; Higher bits of channels 0-3 STA Temp AND #$C0 ; 2 higher bits of acca ASRA ASRA ASRA ASRA ASRA ASRA ; 6 bits shift AND #$03 ; Make sure all other bits are zero's STA Channel0 LDA Temp AND #$30 ; Bits 4 & 5 of acca ASRA ASRA ASRA ASRA ; 4 bits shift AND #$03 STA Channel1 LDA Temp AND #$0C ; Bits 2 & 3 of acca ASRA ASRA ; 2 bits shift AND #$03 STA Channel2 LDA Temp AND #$03 ; Bits 0 & 1 of acca STA Channel3 LDA Bytes+11 STA Channel2_0+1 LDA Bytes+12 STA Channel2_1+1 LDA Bytes+13 STA Channel2_2+1 LDA Bytes+10 STA Temp ; Original value
  • 48. Κώδικας Assembly των δύο µικροελεγκτών - 47 - AND #$30 ; Bits 4 & 5 of acca ASRA ASRA ASRA ASRA ; 4 bits shift AND #$03 STA Channel2_0 ; 2 higher bits LDA Temp AND #$0C ; Bits 2 & 3 of acca ASRA ASRA AND #$03 STA Channel2_1 ; 2 higher bits LDA Temp AND #$03 STA Channel2_2 ; 2 higher bits LDA Bytes+3 STA RealMeasure+1 ; Low byte of real measurement LDA Bytes+4 STA RefMeasure+1 ; Low byte of reference measurement LDA Bytes+2 AND #$0F ; 4 lower bits STA RefMeasure ; 4 higher bits of RefMeasurement LDA Bytes+2 AND #$F0 ; 4 higher bits of byte ASRA ASRA ASRA ASRA STA RealMeasure ; 4 higher bits of real measurement CLR Alarm ; Alarm byte clear LDA Bytes+1 ; Get 2nd byte (Terminal received correct pairs) BIT #$80 ; Is bit7 1? BEQ Alarm2 ; No check the other... BSET 0,Alarm ; Yes, pH alarm on Alarm2 BIT #$40 ; Is bit6 1? BEQ AlarmEnd ; No ,exit. BSET 1,Alarm ; Yes, oxygen alarm on AlarmEnd CLR Temp LDA TEMPA RTS ; DecodeData proc ends here ******************************************* ** ShowMask - proc ** ** input : LineCnt ** ** output : LCD display ** ** Restores acca, X ** ** Mask : "Data name", number, "unit" ** ** | | | ** ** 20 bytes 15 spaces 5 bytes ** ******************************************* ShowMask STA input1 ; Temporary storage of acca STX input1+1 ; Temporary storage of X LDA LineCnt ; Get Line CLR BCDCnt ; BCDCnt(0->line 1 | 1 -> line 2) LDX #50 MUL ; acca = LineCnt·50 CLR Cnt STA Temp2 ; Temp2 has the relative address LDX Temp2 ; Relative address to X LDA #2
  • 49. Κώδικας Assembly των δύο µικροελεγκτών - 48 - JSR WCTRL ; Go home BeforeMask LDA #20 STA Cnt MaskLoop LDA MaskTbl,X ; Load MaskTable data JSR WDAT ; Now writing "Data name" DEC Cnt BEQ MaskEnd1 ; Is Cnt=0? INCX ; No.Increase address BRA MaskLoop ; and jump up to MaskLoop MaskEnd1 LDA #15 ; Write number's 10 spaces STA Cnt SpaceLoop1 LDA #$20 ; Space character JSR WDAT DEC Cnt BNE SpaceLoop1 ; Cnt>0? -> Up to SpaceLoop1 INCX ; Continue with units LDA #5 STA Cnt UnitLoop1 LDA MaskTbl,X ; Load "unit" JSR WDAT DEC Cnt BEQ UnitEnd1 ; Cnt=0? -> Exit INCX BRA UnitLoop1 UnitEnd1 INC BCDCnt LDA BCDCnt CMP #2 BEQ StrMaskEnd INCX LDA #192 ; Change line to LCD JSR WCTRL BRA BeforeMask ; All over again... StrMaskEnd LDA #2 JSR WCTRL ; Return display and cursor to original ; position (1st line : 1st character) LDA #20 ; 20 right shifts of cursor STA Cnt ShiftLp LDA Cnt CMP #0 BEQ ShiftLpEnd LDA #%00010100 ; Shift cursor to the right 1 char JSR WCTRL DEC Cnt BRA ShiftLp ; Now the screen is ready to show ShiftLpEnd ; the first number LDA input1 LDX input1+1 CLR input1 CLR input1+1 CLR Cnt RTS ; ShowMask proc ends here ***************************************************************** ** AddThem - proc (Adds the final results) ** ** input : TempAx,TempAxC | Tempb,TempbC | BCDCnt ** ** output : Final1,Final1C or Final2,Final2C (BCDCnt depended) ** ** Does not restore acca ** *****************************************************************
  • 50. Κώδικας Assembly των δύο µικροελεγκτών - 49 - AddThem LDA TempAx STA input1 LDA TempAx+1 STA input1+1 LDA TempAx+2 STA input1+2 LDA TempAx+3 STA input1+3 LDA Tempb STA input2 LDA Tempb+1 STA input2+1 LDA Tempb+2 STA input2+2 LDA Tempb+3 STA input2+3 JSR ADD32 LDA BCDCnt CMP #2 ;BCDCnt-2=0? BEQ SecondLine ;Yes ->Jump to SecondLine LDA sum ; else 1st line STA Final1 LDA sum+1 STA Final1+1 LDA sum+2 STA Final1+2 LDA sum+3 STA Final1+3 LDA TempAxC STA Final1C ; Data transfer completed(1st line) BRA ExitAdd SecondLine LDA sum STA Final2 LDA sum+1 STA Final2+1 LDA sum+2 STA Final2+2 LDA sum+3 STA Final2+3 LDA TempAxC STA Final2C ; Data transfer completed(2nd line) ExitAdd RTS ; AddThem proc ends here ********************************************************************* ** Equalize - proc (Prepare real data format for addition ** ** input : ax->mulcan | b->Tempb | TempAxC | TempbC ** ** output : ax->TempAx,TempAxC | b->Tempb,TempbC ** ** Does not restore acca ** ** Using divisor for ax power's prefix(1 if (ax)10^<0 ** ** divisor+1 for b and ** ** divisor+2 to indicate the number ** ** to be multiplied (0 for ax and 1 for b) ** ********************************************************************* Equalize LDA BCDCnt STA TmpCnt2 ; Store BCDCnt to safe place... CLR divisor ; ax's power prefix CLR divisor+1 ; b's power prefix CLR divisor+2 ; if 0, ax is to be multiplied, 1:b LDA TempAxC ; Loading control byte
  • 51. Κώδικας Assembly των δύο µικροελεγκτών - 50 - AND #$40 ; Is ax's power (-)? BEQ BCheckpow ; 1. No,then ax's power (+) BSET 0,divisor ; 2. Yes,ax·10^N -> N(-) BCheckpow LDA TempbC AND #$40 ; Same job with b BEQ OkCheck ; b's power (+) BSET 0,divisor+1 OkCheck LDA divisor EOR divisor+1 ; divisor (xor) divisor+1 BEQ Samepow ; If '0' jump to same pow ; else powers are different LDA divisor ; Check for ax's power AND #$01 ; Is it negative? BEQ Bminuspow ; No,then b's power<0.Jump BSET 0,divisor+2 ; else ax's power<0 Bminuspow ; b must be multiplied in order to achive ax's power * In that point divisor and divisor+1 have the prefixes of ax's and * b's powers and divisor+2 indicates either ax or b is going to be * multiplied.No min-max chack required LDA divisor+2 ; Who is going to be multiplied? AND #$01 BEQ AxMul ; If "0" ax must be multiplied LDA TempAxC ; else b AND #$0F ; only 4 lowerbits of a control byte STA BCDCnt ; store temporalily LDA TempbC AND #$0F ; Same with b ADD BCDCnt ; Add the powers STA Cnt ; and store result in Cnt LDA TempAxC ; load control byte again AND #$40 ; and set same power to b BEQ Setplusbpow ; if ax's power (+) set same to b BSET 6,TempbC ; else b's power (-) BRA JumpTmp1 Setplusbpow BCLR 6,TempbC JumpTmp1 LDA TempAxC AND #$0F ; only power bits STA BCDCnt LDA TempbC AND #$F0 ; Keep only 4 higher bits of b control ORA BCDCnt ; now b's power is the same with ax's STA TempbC BRA StartMul AxMul LDA TempbC AND #$0F ; 4 lower bitsa of b control STA BCDCnt LDA TempAxC AND #$0F ; same with ax control byte ADD BCDCnt STA Cnt ; store to Cnt (Loops number) LDA TempbC AND #$40 ; set same power to ax BEQ SetplusApow BSET 6,TempAxC BRA JumpTmp2 SetplusApow BCLR 6,TempAxC ; setting ax's power plus (as shown up) JumpTmp2 LDA TempbC AND #$0F STA BCDCnt LDA TempAxC
  • 52. Κώδικας Assembly των δύο µικροελεγκτών - 51 - AND #$F0 ; 4 upper bits only ORA BCDCnt ; ax's power same with b's STA TempAxC BRA StartMul SamePow LDA TempAxC ; Same powers.Find max power AND #$0F STA BCDCnt ; store temporalily LDA TempbC AND #$0F ; b - ax powers comparison CMP BCDCnt BMI AxGreaterb ; If negative ax > b SUB BCDCnt ; else subtract them STA Cnt ; store it in Cnt BCLR 0,divisor+2 ; ax must bemultiplied LDA TempbC AND #$0F ; b's power STA BCDCnt LDA TempAxC AND #$F0 ORA BCDCnt STA TempAxC ; ax's power same with b's BRA StartMul AxGreaterb SUB BCDCnt ; b must be multiplied NEGA ; subtract b-ax powers and negate them STA Cnt ; Store it to Cnt BSET 0,divisor+2 ; b multiplication LDA TempAxC AND #$0F ; ax's power STA BCDCnt LDA TempbC AND #$F0 ORA BCDCnt STA TempbC StartMul LDA divisor+2 ; who is going to be multiplied? CMP #0 BEQ AxMul32 ; if divisor+2="0" then ax->MUL32 LDA mulcan ; else b->MUL32 STA TempAx LDA mulcan+1 ; exchange ax with b in mulcan... STA TempAx+1 LDA mulcan+2 STA TempAx+2 LDA mulcan+3 STA TempAx+3 LDA Tempb STA mulcan LDA Tempb+1 STA mulcan+1 LDA Tempb+2 STA mulcan+2 LDA Tempb+3 STA mulcan+3 ; b is in mulcan now LDA #$0A ; move 10 in multp STA multp+3 CLR multp+2 CLR multp+1 CLR multp CLR mtemp CLR mtemp+1 CLR mtemp+2 CLR mtemp+3 bMulLoop LDA Cnt ; Cnt times loop CMP #0 ; Compare with zero
  • 53. Κώδικας Assembly των δύο µικροελεγκτών - 52 - BEQ EndbMulLoop ; if zero end loop JSR MUL32 ; multiply b(x)10 DEC Cnt ; Counter-- BRA bMulLoop ; data is in mulcan,so if Cnt>0 multiply again EndbMulLoop LDA mulcan STA Tempb LDA mulcan+1 STA Tempb+1 LDA mulcan+2 STA Tempb+2 LDA mulcan+3 STA Tempb+3 ; Data all OK. LDA mtemp+3 ; If mtemp(NOT)0 there is overflow error AND #$FF BNE ErrorOver LDA mtemp+2 AND #$FF BNE ErrorOver LDA mtemp+1 AND #$FF BNE ErrorOver LDA mtemp AND #$FF BNE ErrorOver BRA ExitEq ; No overflow error.Exit... AxMul32 LDA #$0A STA multp+3 CLR multp+2 CLR multp+1 CLR multp AxMulLoop LDA Cnt CMP #0 BEQ EndAMulLoop ; Same with ax as above... JSR MUL32 DEC Cnt BRA AxMulLoop EndAMulLoop LDA mulcan STA TempAx LDA mulcan+1 STA TempAx+1 LDA mulcan+2 STA TempAx+2 LDA mulcan+3 STA TempAx+3 LDA mtemp+3 ; If mtemp(NOT)0 there is overflow error AND #$FF BNE ErrorOver LDA mtemp+2 AND #$FF BNE ErrorOver LDA mtemp+1 AND #$FF BNE ErrorOver LDA mtemp AND #$FF BNE ErrorOver BRA ExitEq ErrorOver LDA #$2A ; Char "*" JSR WDAT ; Write *OVER* in LCD display LDA #$4F ; Char "O"
  • 54. Κώδικας Assembly των δύο µικροελεγκτών - 53 - JSR WDAT LDA #$56 ; Char "V" JSR WDAT LDA #$45 ; Char "E" JSR WDAT LDA #$52 ; Char "R" JSR WDAT LDA #$2A ; Char "*" JSR WDAT ErrorHere ExitEq CLR Cnt CLR BCDCnt CLR divisor CLR divisor+1 CLR divisor+2 LDA TmpCnt2 STA BCDCnt ; BCDCnt has the number of the line(0 or 1) CLR TmpCnt2 RTS ; Equalize proc ends here ************************************************ ** ComputeVals - proc ( Compute final values) ** ** input : LineCnt, Station ** ** output : Final1,Final1C | Final2,Final2C ** ** Restores original values to X register ** ************************************************ ComputeVals CLR BCDCnt CLR mulcan CLR mulcan+1 CLR mulcan+2 CLR mulcan+3 CLR multp CLR multp+1 CLR multp+2 CLR multp+3 CLR Flag ; Clear flag bits STX Temp1 ; temp storage LDA Station STA Cnt CMP #0 ; If Cnt>0 BNE ADD32Loop ; jump to ADD32Loop LDA #$FF ; else move value $1BFF to PStation STA PStation+1 LDA #$1B STA PStation BRA ExitAddLp ; and jump to end ADD32Loop LDA #48 ; 1 station=48 bytes STA input1+3 ; move 48 to prepare for addition LDA #$FF STA sum+3 ; move $1BFF to sum variable LDA #$1B STA sum+2 CLR sum+1 CLR sum ADDlpCnt LDA sum+3 STA input2+3 LDA sum+2 STA input2+2 CLR input2+1 CLR input2
  • 55. Κώδικας Assembly των δύο µικροελεγκτών - 54 - JSR ADD32 ; sum=sum+48 DEC Cnt BNE ADDLpCnt ; If Cnt>0 jump up LDA sum+3 ; else move result in PStation STA PStation+1 LDA sum+2 STA PStation ; Now PStation has the address ; of DataTable of each station ExitAddLp LDA LineCnt CLRX LDX #12 MUL ; LineCnt*12->address pointer TAX ; moving it to X STX Temp2 LDA #$D6 STA RamLoop ; Hex code for LDA #$xxxx,X command LDA PStation ; Address follows STA RamLoop+1 LDA PStation+1 STA RamLoop+2 LDA #$81 ; Finally RTS command in machine code STA RamLoop+3 StoreABc JSR RamLoop STA TempAx+2 INCX JSR RamLoop STA TempAx+3 ; a constant is in TempAx variable INCX JSR RamLoop STA TempAxC ; Control byte of a constant CLR TempAx+1 CLR TempAx INCX JSR RamLoop STA Tempb+2 INCX JSR RamLoop STA Tempb+3 ; b constant is in Tempb variable INCX JSR RamLoop STA TempbC ; Control byte of b constant CLR Tempb+1 CLR Tempb INCX STX Temp2 ; Temp2 has the next line's address... LDA #4 LDX LineCnt ; acca(=address)=4*LineCnt MUL ADD BCDCnt ; acca=acca+BCDCnt TAX ; if BCDCnt=2 (2nd line) LDA RealMeasure,X STA mulcan+2 ; Storing x data to prepare for MUL32 INCX ; a*x LDA RealMeasure,X STA mulcan+3 LDA TempAx+2 STA multp+2 LDA TempAx+3 STA multp+3 JSR MUL32 ; Multiply them LDA LineCnt ; If LineCnt (OR) BCDCnt <> 0 continue ORA BCDCnt ; else do the division(Refmeasure)
  • 56. Κώδικας Assembly των δύο µικροελεγκτών - 55 - BNE ContDiv LDA mulcan STA dvdnd LDA mulcan+1 STA dvdnd+1 LDA mulcan+2 STA dvdnd+2 LDA mulcan+3 STA dvdnd+3 LDA RefMeasure STA divisor+2 LDA RefMeasure+1 STA divisor+3 CLR divisor+1 CLR divisor ; Data transfered and ready for DIV32 JSR DIV32 LDA quo STA mulcan LDA quo+1 STA mulcan+1 LDA quo+2 ; transfering data to mulcan in STA mulcan+2 ; order to have same protocol for LDA quo+3 ; all data lines STA mulcan+3 ; Continue... * Now mulcan has the resule a*x.Since x is an unsigned integer * the control byte of ax will be the same with a.b is now in * Tempb variable.b's control byte in TempbC ContDiv LDA TempbC AND #$80 ; Is last bit 1? (b(-)) BEQ Bplus ; No,then b>0.Jump LDA TempAxC ; Yes,b<0 . Check a AND #$80 ; Is last bit 1? (a(-)) BEQ AplusBminus ; No,then a>0 and b<0 . Jump BSET 7,Flag ; Yes, a<0 , b<0 . Continue BSET 6,Flag ; Set flags BSET 5,Flag ; Final="1" (<0) BRA ABsame ; Jump Bplus LDA TempAxC ; Check for ax (b<0) AND #$80 ; Is last bit 1? (a(-)) BNE AminusBplus ; No, a<0 and b>0 , Set flags BCLR 6,Flag BCLR 5,Flag ; Final="0" (>0) BRA ABsame AplusBminus BCLR 7,Flag ; a>0 BSET 6,Flag ; b<0 BRA ABdiff AminusBplus BSET 7,Flag ; a<0 BCLR 6,Flag ; b>0 BRA ABdiff ABsame JSR Equalize JSR AddThem JMP procEnd ; End of procedure... ABdiff JSR Equalize LDA #4 STA Cnt CLRX ; X=0
  • 57. Κώδικας Assembly των δύο µικροελεγκτών - 56 - MinMaxLoop1 LDA Cnt ; Prepare for down counter with Cnt CMP #0 ; Cnt-0=? BEQ LoadOk1 LDA Tempb,X CMP TempAx,X ; Tempb+x - TempAx+X = ? ( + or - ) BHI bGreatAx ; If b(i)>ax(i) *** CAREFULLY *** BNE LoadOk1 ; and the result is not zero then jump INCX ; X++ DEC Cnt ; Cnt=Cnt-1 BRA MinMaxLoop1 bGreatAx BSET 0,Flag ; |b|>|ax| BRA After1 LoadOk1 BCLR 0,Flag ; |ax|>|b| After1 LDA Flag ; If Flag[0]->"1" AND #1 BNE bGreaterAx ; |b|>|ax|.Jump CLRX ; else |ax|>|b| LDA #4 ; Cnt=4 STA Cnt SubLoop1 LDA Cnt CMP #0 BEQ SubLoop1End LDA TempAx,X ; Transfer data for subtraction STA input1,X LDA Tempb,X STA input2,X INCX DEC Cnt BRA SubLoop1 SubLoop1End JSR SUB32 CLRX LDA BCDCnt ; 1st or 2nd line? CMP #2 ; if BCDCnt=2->Final2 BEQ SecLine LDA #4 ; else 1st line STA Cnt Loop2 LDA Cnt CMP #0 BEQ Loop2End LDA diff,X STA Final1,X INCX DEC Cnt BRA Loop2 Loop2End CLR Final1C LDA TempAxC AND #$80 ; ax<0 or ax>0 BEQ Final1plus ; if ax>0 jump BSET 7,Final1C ; else ax<0 BRA After2 Final1plus BCLR 7,Final1C After2 LDA TempAxC AND #%01001111 ; We care only for the power and ; it's prefix ORA Final1C STA Final1C ; And put it in Final1C BRA procEnd ; Go to end... SecLine LDA #4 STA Cnt Loop3 LDA Cnt CMP #0 BEQ Loop3End LDA diff,X
  • 58. Κώδικας Assembly των δύο µικροελεγκτών - 57 - STA Final2,X INCX DEC Cnt BRA Loop3 Loop3End LDA TempAxC AND #$80 BEQ Final2plus BSET 7,Final2C BRA After3 Final2plus BCLR 7,Final2C After3 LDA TempAxC AND #%01001111 ORA Final2C STA Final2C BRA procEnd ; Go to end... bGreaterAx CLRX ; Same job... LDA #4 STA Cnt SubLoop2 LDA Cnt CMP #0 BEQ SubLoop2End LDA Tempb,X ; b->input1 STA input1,X LDA TempAx,X ; ax-> input2 STA input2,X INCX DEC Cnt BRA SubLoop2 SubLoop2End LDA TempAxC STA BCDout LDA TempbC STA TempAxC LDA BCDout STA TempbC CLR BCDout JMP SubLoop1End procEnd LDA BCDCnt ; Check for 2nd line CMP #2 BEQ AllOk ; If BCDCnt=2 exit LDX Temp2 INC BCDCnt INC BCDCnt ; Make this counter 2 -> 2nd half of line JMP StoreABc ; Second line AllOk CLR Cnt CLR BCDCnt LDX Temp1 RTS ; ComputeVals proc ends here ******************************************************** ** ShowVals - proc (Show values to LCD) ** ** input : Final1,Final1C | Final2,Final2C | LineCnt ** ** output : LCD screen line 1 or 2 ** ** Restores acca and X ** ******************************************************** ShowVals STA TEMP1 ; Storing acca STX TEMP2 ; and X register CLR TmpCnt2
  • 59. Κώδικας Assembly των δύο µικροελεγκτών - 58 - WhatLine LDA TmpCnt2 CMP #0 BNE Line2nd ; If LineCnt <> 0 it's line 2,so jump LDA #4 ; else it's line No.1 STA Cnt CLRX Loop4 LDA Cnt CMP #0 BEQ Loop4End LDA Final1,X ; Moving Final1 to Tempb STA Tempb,X ; to prepare for Bin2BCD32 proc INCX DEC Cnt BRA Loop4 Loop4End LDA Final1C ; Control byte also included STA TempbC BRA PrepBCD Line2nd LDA #4 ; Same with second line STA Cnt CLRX Loop5 LDA Cnt CMP #0 BEQ Loop5End LDA Final2,X ; Moving Final2 to Tempb STA Tempb,X ; to prepare for Bin2BCD32 proc INCX DEC Cnt BRA Loop5 Loop5End LDA Final2C ; Control byte also included STA TempbC LDA #192 JSR WCTRL ; Next line in LCD display LDA #20 ; 20 right shifts of cursor STA Cnt ShftLp LDA Cnt CMP #0 BEQ ShftLpEnd LDA #%00010100 ; Shift cursor to the right 1 char JSR WCTRL DEC Cnt BRA ShftLp ; Now the screen is ready to show ShftLpEnd ; the first number PrepBCD ; All data ready for Bin2BCD32 proc JSR Bin2BCD32 LDA TmpCnt2 ; Check for LineCnt CMP #1 ; If it is 1 both of lines are ok... BEQ LinesOk1 ; and exit INC TmpCnt2 ; else LineCnt++ BRA WhatLine ; and jump up LinesOk1 LDA #2 JSR WCTRL ; Reset cursor LDX TEMP2 LDA TEMP1 RTS ; ShowVals proc ends here
  • 60. Κώδικας Assembly των δύο µικροελεγκτών - 59 - ********************************************************* ** Bin2BCD32 - proc ** ** input : Tempb,TempbC ** ** output : LCD display ** ** Proc uses Bytes (10 bytes) as temporary ** ** storage of 10 decimal digits, because maximum hex ** ** number is FFFFFFFF(16) = 4294967295(10) which has ** ** 10 digits length ** ** Format : ± number·10(±power) where : ** ** number -> 4 higher digits of Final1 ** ** power -> 2 digits(4 bits of TempbC) ** ** TempCnt is used to indicate the number of digits ** ** of the BCD number ** ** Does NOT restore acca or X ** ** Base logix : x' = x - 10*(x(div32)10) ** ********************************************************* Bin2BCD32 CLR Flag ; Flag will be used for end signal LDA #10 STA Cnt CLRX Loop6 LDA Cnt CMP #0 BEQ Loop6End LDA #0 ; Moving 0 to Bytes(first 10 positions) STA Bytes,X INCX DEC Cnt BRA Loop6 Loop6End CLR TempCnt Startpoint LDA #$0A STA multp+3 ; multp has always 10 CLR multp+2 CLR multp+1 CLR multp LDA #$0A STA divisor+3 ; divisor has always 10 also CLR divisor+2 CLR divisor+1 CLR divisor CLR quo+3 CLR quo+2 CLR quo+1 CLR quo Div10Loop LDA #4 STA Cnt CLRX Loop7 LDA Cnt CMP #0 BEQ Loop7End LDA Tempb,X ; Moving Tempb to dvdnd STA dvdnd,X ; to prepare for DIV32 proc STA input1,X ; also moving it to input1 for ; the next subtraction INCX DEC Cnt BRA Loop7 Loop7End JSR DIV32 LDA quo CMP #0
  • 61. Κώδικας Assembly των δύο µικροελεγκτών - 60 - BNE NotYet ; Check if quo < 10 LDA quo+1 ; Same for other bytes CMP #0 BNE NotYet LDA quo+2 CMP #0 BNE NotYet LDA quo+3 ; If the higher order bytes are zero CMP #$09 ; then check if quo < 10 BHI NotYet ; if it is, jump INC Flag ; else Flag->"1" no more divisions NotYet ; continue with other operations LDA #4 STA Cnt CLRX Loop8 LDA Cnt CMP #0 BEQ Loop8End LDA quo,X ; Moving quo to mulcan STA mulcan,X ; to prepare for MUL32 proc INCX DEC Cnt BRA Loop8 Loop8End JSR MUL32 LDA #4 ; Now I have to move mulcan to input2 STA Cnt CLRX Loop9 LDA Cnt CMP #0 BEQ Loop9End LDA mulcan,X ; Moving mulcan to input2 STA input2,X ; to prepare for SUB32 proc INCX DEC Cnt BRA Loop9 Loop9End JSR SUB32 LDA diff+3 ; Loading the difference LDX TempCnt STA Bytes,X ; and store it in Bytes+X position ; digits in Bytes is up-down ; i.e. Bytes[0] has the last BCD ; digit of the number INC TempCnt ; Total digits ++ LDA Flag CMP #0 ; Check Flag.If "1" exit BNE ExitBCD32 LDA #4 ; Now I have to move diff to Tempb STA Cnt CLRX Loop10 LDA Cnt CMP #0 BEQ Loop10End LDA quo,X ; Moving diff to Tempb STA Tempb,X ; to prepare for next loop INCX DEC Cnt BRA Loop10 Loop10End JMP Startpoint ; All over again... ExitBCD32
  • 62. Κώδικας Assembly των δύο µικροελεγκτών - 61 - LDA quo+3 LDX TempCnt STA Bytes,X ; Last digit in que... ShowBCDLCD LDA TempbC ; Load control AND #$80 ; Number (+) or (-) BEQ ContBCD1 ; (+) write nothing LDA #$2D ; "-" character JSR WDAT ; Write it ContBCD1 LDA TempCnt ; How many digits? STA Cnt LDX TempCnt ; Backwards... Loop11 LDA Cnt CMP #0 BEQ Loop11End LDA Bytes,X ; Moving Bytes to acca ADD #$30 ; Make it visible digit JSR WDAT ; Write it DECX DEC Cnt BRA Loop11 Loop11End LDA Bytes,X ADD #$30 JSR WDAT ; Last digit LDA TempbC ; Power check AND #$0F ; Last 4 bits CMP #0 ; Is power = 0? BEQ ExitRout ; Yes, we have finished LDA #$A5 ; "·" character JSR WDAT LDA #$31 ; "1" character JSR WDAT LDA #$30 ; "0" character JSR WDAT LDA #$28 ; "(" character JSR WDAT LDA TempbC ; power prefix AND #%01000000 ; + or - power? BEQ PlusWrite ; +, Do not write anything LDA #$2D ; "-" character JSR WDAT PlusWrite LDA TempbC AND #$0F ; Power number JSR Bin2BCD LDA BCDout AND #$F0 ; 4 higher bits ASRA ASRA ASRA ASRA ; 4 bits shift AND #$0F ; Just for insurance... ADD #$30 ; number + $30 = LCD number digit JSR WDAT LDA BCDout AND #$0F ; Last 4 bits ADD #$30 JSR WDAT ; Power Ok... LDA #$29 ; ")" character JSR WDAT ExitRout CLR Flag ; Clear Flag for future use RTS ; Bin2BCD32 proc ends here
  • 63. Κώδικας Assembly των δύο µικροελεγκτών - 62 - ********************************************** ** ADD32 - 32 bit addition ** ** Inputs : input1, input2 ** ** Output : sum (4 bytes) = input1 + input2 ** ** sum + 3 -> low byte of result ** ** Restores original value of acca ** ********************************************** ADD32 STA tempA LDA input1+3 ; low byte addition ADD input2+3 STA sum+3 LDA input1+2 ; medium low byte addition ADC input2+2 ; add with carry STA sum+2 LDA input1+1 ; medium high byte addition ADC input2+1 ; add with carry STA sum+1 LDA input1 ; high byte addition ADC input2 ; add with carry STA sum LDA tempA RTS ; ADD32 proc ends here ********************************************** ** SUB32 - 32 bit subtraction ** ** Inputs : input1, input2 ** ** Output : diff(4 bytes) = input1 - input2 ** ** diff + 3 -> low byte of result ** ** Restores original value of acca ** ********************************************** SUB32 STA tempA LDA input1+3 ; low byte subtraction SUB input2+3 STA diff+3 LDA input1+2 ; medium low byte subtraction SBC input2+2 ; sub with carry STA diff+2 LDA input1+1 ; medium high byte subtraction SBC input2+1 ; sub with carry STA diff+1 LDA input1 ; low byte subtraction SBC input2 ; sub with carry STA diff LDA tempA RTS ; SUB32 proc ends here ******************************************** ** MUL32 - 32 bit multiplication ** ** Inputs : multp, mulcan ** ** Output : mtemp:mulcan = multp * mulcan ** ** Restores original value of acca and X ** ******************************************** MUL32 STA tempA STX tempX LDX #32 CLR mtemp
  • 64. Κώδικας Assembly των δύο µικροελεγκτών - 63 - CLR mtemp+1 CLR mtemp+2 CLR mtemp+3 ; clearing temporary variables for sure ROR mulcan ROR mulcan+1 ROR mulcan+2 ROR mulcan+3 Mnext BCC Rotate ; if carry is clear jump to rotate LDA mtemp+3 ADD multp+3 ; addition STA mtemp+3 LDA mtemp+2 ADC multp+2 ; addition with carry STA mtemp+2 LDA mtemp+1 ADC multp+1 ; addition with carry STA mtemp+1 LDA mtemp ADC multp ; addition with carry STA mtemp Rotate ROR mtemp ; low bit->carry.All the other to the right ROR mtemp+1 ROR mtemp+2 ROR mtemp+3 ROR mulcan ROR mulcan+1 ROR mulcan+2 ROR mulcan+3 DECX ; X = X - 1 BNE Mnext ; if X (not) 0 jump to Mnext LDX tempX LDA tempA RTS ; MUL32 proc ends here ************************************* ** DIV32 - 32 bit division ** ** Inputs : dvdnd, dvsor ** ** Output : quo = dvdnd / dvsor ** ** Restores original value of acca ** ************************************* DIV32 STA tempA CLR quo CLR quo+1 CLR quo+2 CLR quo+3 LDA #1 ; initial loop count TST divisor ; if the high order bit is set there is ; no need to shift divisor (dvsor) BMI Div153 Div151 INCA ASL divisor+3 ROL divisor+2 ROL divisor+1 ROL divisor BMI Div153 CMP #33 BNE Div151 ; if we haven't shifted all possible ; bits in the divisor jump to Div151 Div153 STA Cnt ; Save the loop counter Div163 LDA dvdnd+3
  • 65. Κώδικας Assembly των δύο µικροελεγκτών - 64 - SUB divisor+3 STA dvdnd+3 LDA dvdnd+2 SBC divisor+2 STA dvdnd+2 LDA dvdnd+1 SBC divisor+1 STA dvdnd+1 LDA dvdnd SBC divisor STA dvdnd BCC Div165 ; carry is clear if dvsor was larger than dvdnd LDA dvdnd+3 ; add the divisor back.It was larger than the divident ADD divisor+3 STA dvdnd+3 LDA dvdnd+2 ADC divisor+2 STA dvdnd+2 LDA dvdnd+1 ADC divisor+1 STA dvdnd+1 LDA dvdnd ADC divisor STA dvdnd CLC ; this will clear the respective bit in quo ; due to the need to add dvsor to dvdnd BRA Div167 Div165 SEC Div167 ROL quo+3 ; set or clear the low order bit in quo based on above ROL quo+2 ROL quo+1 ROL quo LSR divisor ROR divisor+1 ROR divisor+2 ROR divisor+3 DEC Cnt BNE Div163 LDA TempA RTS ; DIV32 proc ends here ORG $1B36 ; String table starts here (200 bytes) ; Water level: | cm ; Conductivity: | - ; pH: | - ; Oxygen: | mg/lt ; Water temperature: | °C ; Air temperature: | °C ; System temperature: | °C ; Battery voltage: | V
  • 66. Κώδικας Assembly των δύο µικροελεγκτών - 65 - MaskTbl FCB $57,$61,$74,$65,$72,$20,$6C,$65,$76,$65,$6C,$3A,$20,$20,$20,$20,$20,$20,$20,$20 FCB $63,$6D,$20,$20,$20 ; Water level:cm FCB $43,$6F,$6E,$64,$75,$63,$74,$69,$76,$69,$74,$79,$3A,$20,$20,$20,$20,$20,$20,$20 FCB $20,$20,$20,$20,$20 ; Conductivity: FCB $70,$48,$3A,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20 FCB $20,$20,$20,$20,$20 ; pH: FCB $4F,$78,$79,$67,$65,$6E,$3A,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20 FCB $6D,$67,$2F,$6C,$74 ; Oxygen:mg/lt FCB $57,$61,$74,$65,$72,$20,$74,$65,$6d,$70,$65,$72,$61,$74,$75,$72,$65,$3A,$20,$20 FCB $DF,$43,$20,$20,$20 ; Water temperature:°C FCB $41,$69,$72,$20,$74,$65,$6d,$70,$65,$72,$61,$74,$75,$72,$65,$3A,$20,$20,$20,$20 FCB $DF,$43,$20,$20,$20 ; Air temperature:°C FCB $53,$79,$73,$74,$65,$6D,$20,$74,$65,$6d,$70,$65,$72,$61,$74,$75,$72,$65,$3A,$20 FCB $DF,$43,$20,$20,$20 ; System temperature:°C FCB $42,$61,$74,$74,$65,$72,$79,$20,$76,$6F,$6C,$74,$61,$67,$65,$3A,$20,$20,$20,$20 FCB $56,$20,$20,$20,$20 ; Battery voltage:V ; Mesologi stations' data ORG $1BFF ; Data table starts here (768 bytes) DataTable FCB $02,$CC,$C1,$00,$F4,$00 ; Station 1 FCB $02,$ED,$44,$00,$7D,$44 ; Total : 48 bytes FCB $00,$6B,$44,$00,$C7,$42 FCB $00,$D5,$44,$01,$64,$45 FCB $02,$15,$44,$01,$F3,$C2 FCB $00,$01,$41,$00,$1E,$80 FCB $00,$01,$41,$00,$1E,$80 FCB $01,$8F,$45,$03,$D9,$42 FCB $02,$C9,$C1,$00,$F3,$00 ; Station 2 FCB $02,$EA,$44,$02,$6E,$45 ; Total : 48 bytes FCB $00,$6B,$44,$00,$02,$00 FCB $00,$D6,$44,$00,$8E,$C4 FCB $02,$16,$44,$01,$F3,$C2 FCB $00,$01,$41,$00,$1E,$80 FCB $00,$01,$41,$00,$1E,$80 FCB $01,$8F,$45,$00,$62,$41 FCB $02,$BF,$C1,$00,$F2,$00 ; Station 3 FCB $02,$EB,$44,$03,$AF,$46 ; Total : 48 bytes FCB $00,$6B,$44,$00,$02,$00 FCB $00,$D5,$44,$00,$B2,$45 FCB $02,$17,$44,$01,$F3,$C2 FCB $00,$01,$41,$00,$1E,$80 FCB $00,$01,$41,$00,$1E,$80 FCB $01,$8C,$45,$03,$D2,$42 FCB $02,$BA,$C1,$00,$F1,$00 ; Station 4 FCB $00,$93,$43,$00,$7B,$42 ; Total : 48 bytes FCB $00,$DB,$44,$00,$02,$00 FCB $01,$B7,$44,$00,$24,$44 FCB $00,$0B,$42,$01,$FF,$C2 FCB $01,$91,$43,$00,$60,$80 FCB $01,$8A,$43,$00,$90,$C1 FCB $01,$6B,$43,$01,$CD,$C3
  • 67. Κώδικας Assembly των δύο µικροελεγκτών - 66 - FCB $02,$7F,$C1,$00,$F0,$00 ; Station 5 FCB $01,$06,$43,$01,$E8,$C1 ; Total : 48 bytes FCB $00,$6A,$42,$00,$02,$00 FCB $00,$C0,$44,$00,$00,$00 FCB $02,$15,$42,$00,$05,$C0 FCB $00,$01,$41,$00,$1E,$80 FCB $00,$01,$41,$00,$1E,$80 FCB $01,$88,$42,$03,$C6,$42 FCB $02,$41,$C1,$00,$E9,$00 ; Station 6 FCB $00,$02,$41,$00,$00,$00 ; Total : 48 bytes FCB $00,$00,$20,$00,$00,$20 FCB $00,$01,$42,$00,$00,$00 FCB $00,$00,$20,$00,$00,$20 FCB $00,$01,$41,$00,$1E,$80 FCB $00,$01,$41,$00,$1E,$80 FCB $01,$88,$42,$03,$C6,$42 FCB $00,$00,$20,$00,$00,$20 ; Station 7 FCB $00,$00,$20,$00,$00,$20 ; Total : 48 bytes FCB $00,$00,$20,$00,$00,$20 FCB $00,$00,$20,$00,$00,$20 FCB $00,$00,$20,$00,$00,$20 FCB $00,$00,$20,$00,$00,$20 FCB $00,$00,$20,$00,$00,$20 FCB $00,$00,$20,$00,$00,$20 FCB $00,$00,$20,$00,$00,$20 ; Station 8 FCB $00,$00,$20,$00,$00,$20 ; Total : 48 bytes FCB $00,$00,$20,$00,$00,$20 FCB $00,$00,$20,$00,$00,$20 FCB $00,$00,$20,$00,$00,$20 FCB $00,$00,$20,$00,$00,$20 FCB $00,$00,$20,$00,$00,$20 FCB $00,$00,$20,$00,$00,$20 FCB $00,$00,$20,$00,$00,$20 ; Station 9 FCB $00,$00,$20,$00,$00,$20 ; Total : 48 bytes FCB $00,$00,$20,$00,$00,$20 FCB $00,$00,$20,$00,$00,$20 FCB $00,$00,$20,$00,$00,$20 FCB $00,$00,$20,$00,$00,$20 FCB $00,$00,$20,$00,$00,$20 FCB $00,$00,$20,$00,$00,$20 FCB $00,$00,$20,$00,$00,$20 ; Station 10 FCB $00,$00,$20,$00,$00,$20 ; Total : 48 bytes FCB $00,$00,$20,$00,$00,$20 FCB $00,$00,$20,$00,$00,$20 FCB $00,$00,$20,$00,$00,$20 FCB $00,$00,$20,$00,$00,$20 FCB $00,$00,$20,$00,$00,$20 FCB $00,$00,$20,$00,$00,$20 FCB $00,$00,$20,$00,$00,$20 ; Station 11 FCB $00,$00,$20,$00,$00,$20 ; Total : 48 bytes FCB $00,$00,$20,$00,$00,$20 FCB $00,$00,$20,$00,$00,$20 FCB $00,$00,$20,$00,$00,$20 FCB $00,$00,$20,$00,$00,$20 FCB $00,$00,$20,$00,$00,$20 FCB $00,$00,$20,$00,$00,$20
  • 68. Κώδικας Assembly των δύο µικροελεγκτών - 67 - FCB $00,$00,$20,$00,$00,$20 ; Station 12 FCB $00,$00,$20,$00,$00,$20 ; Total : 48 bytes FCB $00,$00,$20,$00,$00,$20 FCB $00,$00,$20,$00,$00,$20 FCB $00,$00,$20,$00,$00,$20 FCB $00,$00,$20,$00,$00,$20 FCB $00,$00,$20,$00,$00,$20 FCB $00,$00,$20,$00,$00,$20 FCB $00,$00,$20,$00,$00,$20 ; Station 13 FCB $00,$00,$20,$00,$00,$20 ; Total : 48 bytes FCB $00,$00,$20,$00,$00,$20 FCB $00,$00,$20,$00,$00,$20 FCB $00,$00,$20,$00,$00,$20 FCB $00,$00,$20,$00,$00,$20 FCB $00,$00,$20,$00,$00,$20 FCB $00,$00,$20,$00,$00,$20 FCB $00,$00,$20,$00,$00,$20 ; Station 14 FCB $00,$00,$20,$00,$00,$20 ; Total : 48 bytes FCB $00,$00,$20,$00,$00,$20 FCB $00,$00,$20,$00,$00,$20 FCB $00,$00,$20,$00,$00,$20 FCB $00,$00,$20,$00,$00,$20 FCB $00,$00,$20,$00,$00,$20 FCB $00,$00,$20,$00,$00,$20 FCB $00,$00,$20,$00,$00,$20 ; Station 15 FCB $00,$00,$20,$00,$00,$20 ; Total : 48 bytes FCB $00,$00,$20,$00,$00,$20 FCB $00,$00,$20,$00,$00,$20 FCB $00,$00,$20,$00,$00,$20 FCB $00,$00,$20,$00,$00,$20 FCB $00,$00,$20,$00,$00,$20 FCB $00,$00,$20,$00,$00,$20 FCB $00,$00,$20,$00,$00,$20 ; Station 16 FCB $00,$00,$20,$00,$00,$20 ; Total : 48 bytes FCB $00,$00,$20,$00,$00,$20 FCB $00,$00,$20,$00,$00,$20 FCB $00,$00,$20,$00,$00,$20 FCB $00,$00,$20,$00,$00,$20 FCB $00,$00,$20,$00,$00,$20 FCB $00,$00,$20,$00,$00,$20 ; End of stations' data ORG $1FF0 FDB $0000 ORG $1FFE ; RESET vector FDB INIT END ; File ends here
  • 69. Αναλυτική παρουσίαση των ρουτινών του προγράµµατος - 68 - Αναλυτική παρουσίαση των ρουτινών του προγράµµατος Στο κεφάλαιο αυτό της εργασίας δίνονται αναλυτικά τα διαγράµµατα ροής των ρουτινών του συστήµατος. Αρχικά εξηγείται το πρωτόκολλο επικοινωνίας των δύο µικροελεγκτών. Το διάγραµµα ροής του πρωτοκόλλου δίνεται στην επόµενη σελίδα. Σκοπός αυτής της διαδικα- σίας είναι η µεταφορά των 15 bytes δεδοµένων από τον πρώτο στον δεύτερο µικροελεγκτή. Αρχικά ο πρώτος µικροελεγκτής περιµένει το σήµα έναρξης µέσω της PortB.[4]. Μόλις το λάβει ακολουθεί ένα άλµα στην διαδικασία Measure, η οποία αποτελεί την κύρια ρουτίνα του προγράµµατος. Αν υπάρχει απάντηση από τον σωστό σταθµό ακολουθεί η διαδικασία της αποστολής των δεδοµένων στον δεύτερο µικροελεγκτή ( σελ.14, SendDataLoop ). Το αντί- στοιχο κοµµάτι κώδικα που αφορά τη λήψη των δεδοµένων από το δεύτερο µικροελεγκτή βρίσκεται στη σελίδα 32 ( Receive ). Το διάγραµµα ροής της επόµενης σελίδας δίνει περιλη- πτικά τη διαδικασία αυτή.
  • 70. Αναλυτική παρουσίαση των ρουτινών του προγράµµατος - 69 - Σχήµα 2. ∆ιάγραµµα ροής του πρωτοκόλλου επικοινωνίας των δύο µικροελεγκτών