Corporate social responsibility risks and responsible action of multinational...IIED
This bilingual English-Chinese presentation is by Mr. Sun Lihui, of the China Chamber of Commerce of Metals Minerals and Chemicals Importers and Exporters, on responsible operations and the social responsibility risks of multi-national companies.
The presentation was made at the third event of the China-Africa Forest Governance Learning Platform, held in Beijing 24-25 October 2016.
The event explored how China can help sustain Africa’s forests with a focus on the role of private sector actors and Chinese stakeholders in working with African stakeholders to promote pro-poor and sustainable investments and trade in Africa’s forests.
More details: www.iied.org/mists-china-africa-forests
They lost both their kids in 5 years, have to repay loan nowOther Mother
Dinesh Kumar lost both of his children to dengue fever - his son Ankit in 2010 and daughter Menaka last month. After losing Ankit, Dinesh's family took precautions like moving houses and using mosquito repellent, but Menaka contracted dengue while staying with her grandparents. She passed away at the hospital after her condition deteriorated rapidly. Dinesh now has to figure out how to repay the large medical bills incurred to treat Menaka, adding to his grief over losing both children to the mosquito-borne disease.
The document summarizes information about the textile and apparel industry and trading partners within the European Union. It is divided into four regions - Eastern, Northern, Southern, and Western. Germany, Italy, France, and Spain are highlighted as the top four textile producers. The Eastern region was formerly communist and faced economic struggles, while the Northern region has a large economy focused on exports. Southern Europe relies on agriculture and has faced economic instability. The Western region is the most diverse with varying languages and currencies.
Pancasila Sebagai Ideologi Pandangan Hidup Bangsa Indonesiametalujay
Dokumen tersebut membahas tentang Pancasila sebagai ideologi dan pandangan hidup bangsa Indonesia. Pancasila dijadikan dasar negara berdasarkan UUD 1945 dan memiliki peranan penting dalam mengatur kehidupan berbangsa dan bernegara. Pancasila juga berfungsi sebagai pandangan hidup yang mencerminkan jiwa bangsa dan menjadi pedoman dalam kehidupan masyarakat. Upaya pelestarian nilai-nilai Pancasila perlu dilakukan, antara lain
This document provides a template for students to write 5 sentences describing pictures by filling in blanks for the subject, verb, and description using a verb list sticker book as a reference. Spaces are left for students to add their own words to complete 5 sentences based on prompts from pictures.
Laporan ini membahas rencana dan realisasi program serta kegiatan Balai Besar Pelatihan Peternakan Batu selama bulan Agustus 2015, termasuk upaya peningkatan kompetensi peternak dan pengelolaan administrasi pelatihan.
O texto discute a violência contra a mulher no Brasil, citando pesquisas que mostram a gravidade do problema. Apesar de justificativas de alguns políticos, os dados indicam que a violência doméstica continua sendo uma realidade para muitas mulheres brasileiras.
Corporate social responsibility risks and responsible action of multinational...IIED
This bilingual English-Chinese presentation is by Mr. Sun Lihui, of the China Chamber of Commerce of Metals Minerals and Chemicals Importers and Exporters, on responsible operations and the social responsibility risks of multi-national companies.
The presentation was made at the third event of the China-Africa Forest Governance Learning Platform, held in Beijing 24-25 October 2016.
The event explored how China can help sustain Africa’s forests with a focus on the role of private sector actors and Chinese stakeholders in working with African stakeholders to promote pro-poor and sustainable investments and trade in Africa’s forests.
More details: www.iied.org/mists-china-africa-forests
They lost both their kids in 5 years, have to repay loan nowOther Mother
Dinesh Kumar lost both of his children to dengue fever - his son Ankit in 2010 and daughter Menaka last month. After losing Ankit, Dinesh's family took precautions like moving houses and using mosquito repellent, but Menaka contracted dengue while staying with her grandparents. She passed away at the hospital after her condition deteriorated rapidly. Dinesh now has to figure out how to repay the large medical bills incurred to treat Menaka, adding to his grief over losing both children to the mosquito-borne disease.
The document summarizes information about the textile and apparel industry and trading partners within the European Union. It is divided into four regions - Eastern, Northern, Southern, and Western. Germany, Italy, France, and Spain are highlighted as the top four textile producers. The Eastern region was formerly communist and faced economic struggles, while the Northern region has a large economy focused on exports. Southern Europe relies on agriculture and has faced economic instability. The Western region is the most diverse with varying languages and currencies.
Pancasila Sebagai Ideologi Pandangan Hidup Bangsa Indonesiametalujay
Dokumen tersebut membahas tentang Pancasila sebagai ideologi dan pandangan hidup bangsa Indonesia. Pancasila dijadikan dasar negara berdasarkan UUD 1945 dan memiliki peranan penting dalam mengatur kehidupan berbangsa dan bernegara. Pancasila juga berfungsi sebagai pandangan hidup yang mencerminkan jiwa bangsa dan menjadi pedoman dalam kehidupan masyarakat. Upaya pelestarian nilai-nilai Pancasila perlu dilakukan, antara lain
This document provides a template for students to write 5 sentences describing pictures by filling in blanks for the subject, verb, and description using a verb list sticker book as a reference. Spaces are left for students to add their own words to complete 5 sentences based on prompts from pictures.
Laporan ini membahas rencana dan realisasi program serta kegiatan Balai Besar Pelatihan Peternakan Batu selama bulan Agustus 2015, termasuk upaya peningkatan kompetensi peternak dan pengelolaan administrasi pelatihan.
O texto discute a violência contra a mulher no Brasil, citando pesquisas que mostram a gravidade do problema. Apesar de justificativas de alguns políticos, os dados indicam que a violência doméstica continua sendo uma realidade para muitas mulheres brasileiras.
O documento discute brevemente dois tópicos importantes da prova do ENEM: 1) a importância do título na compreensão do texto e 2) a compreensão textual como um todo.
Laporan ini memberikan informasi mengenai pelaksanaan program dan kegiatan Balai Besar Pelatihan Peternakan Batu pada bulan Mei 2015. Laporan ini mencakup latar belakang, tujuan, organisasi, tugas pokok dan fungsi unit organisasi BBPP Batu serta rencana dan realisasi kegiatan pelatihan yang dilaksanakan pada bulan tersebut.
Environmental and social disclosure policies in ChinaIIED
This is a presentation by Ms. Sun Xiufang from Forest Trends on environmental and social disclosure policies in China with a focus on Chinese company commitments and stock exchange requirements in land-based sectors.
The presentation was made at the third event of the China-Africa Forest Governance Learning Platform, held in Beijing 24-25 October 2016.
The event explored how China can help sustain Africa’s forests with a focus on the role of private sector actors and Chinese stakeholders in working with African stakeholders to promote pro-poor and sustainable investments and trade in Africa’s forests.
More details: www.iied.org/mists-china-africa-forests
Prova de Língua Portuguesa da UFOP 2008/1 resolvida e comentadama.no.el.ne.ves
O autor critica a atuação dos políticos brasileiros após o acidente aéreo em Congonhas, apontando que eles agem de acordo com seus interesses em vez de se preocuparem com o sentimento público. Ele também critica o sumiço do presidente Lula e a atitude do político Marco Aurélio Garcia.
This document discusses the multidisciplinary product development cycle and deployment of NI-PXI real-time hardware in hardware-in-the-loop simulations. It describes the typical phases of product development including concept, design and development, and validation and verification. It also provides details about using digital prototyping, model-in-the-loop and hardware-in-the-loop simulations using NI-PXI real-time hardware to test control algorithms and identify issues before full deployment. A case study on developing effective flight control systems for an aircraft is presented as an example.
Dokumen tersebut membahas tentang dimensi dan struktur ilmu pengetahuan sosial. Terdapat empat dimensi ilmu pengetahuan sosial yaitu pengetahuan, keterampilan, nilai dan sikap, serta tindakan. Dokumen juga menjelaskan struktur ilmu pengetahuan sosial meliputi fakta, konsep, dan generalisasi yang saling berhubungan untuk membentuk pengetahuan siswa.
Perencanaan strategis sistem informasi dan teknologi informasi (SI/TI) bertujuan untuk menyelaraskan strategi bisnis dan SI/TI agar investasi TI mendukung tujuan organisasi. Metodologi perencanaan strategis Ward dan Peppard digunakan untuk meminimalkan risiko kegagalan dengan melibatkan semua pemangku kepentingan. Analisis SWOT, critical success factor, McFarlan grid, value chain, dan balanced scorecard digunakan untuk menganalisis lingkungan organisasi dalam per
Dokumen tersebut merangkum tentang sistem ekonomi kapitalisme, termasuk definisi, pilar-pilar, kerangka dasar, perspektif, penyebab runtuhnya sistem ekonomi kapitalisme, dampaknya, prinsip dan masalah krisis ekonomi kapitalisme, serta kesimpulan dan saran. Dokumen ini memberikan gambaran menyeluruh tentang sistem ekonomi kapitalisme.
1. Perbandingan ideologi Pancasila dengan ideologi lain seperti liberalisme, komunisme, dan sosialisme pada aspek politik, hukum, ekonomi, agama, dan pandangan terhadap individu dan masyarakat.
2. Ideologi Pancasila mengakui hak individu dan masyarakat serta mendorong keselarasan antara keduanya berbeda dengan ideologi lain.
3. Pancasila bersifat terbuka dan dinamis dapat men
O documento discute os elementos peritextuais de livros didáticos, técnicos e científicos. Apresenta as definições e funções de elementos como capa, sobrecapa, lombada, orelha, folha de rosto, ficha catalográfica, dedicatória, agradecimentos e epígrafe. Inclui imagens ilustrativas de cada elemento.
Το θέμα της παρούσης εργασίας είναι ο έλεγχος ροπής χωρίς την χρήση αισθητήρων ανάδρασης .Η τεχνολογία είναι σχετικά καινούργια Η εργασία θα επικεντρωθεί στο σύστημα D.T.C ( Direct Control System ) της εταιρίας ΑΒΒ .Η τεχνολογία D.T.C αναφέρεται σε ασύγχρονους επαγωγικούς τριφασικού κλινήρες και εμφανίστηκε πρώτη φορά το 1990 Στόχος της εργασίας είναι να αναδείξει τα πλεονεκτήματα που προκύπτουν από την νέα αυτή τεχνολογία , τον αντίκτυπο που έχει στον πραγματικό κόσμο στην βιομηχανία Μέσα από την εργασία φαίνεται έκδηλα ότι για την δημιουργία και την εξέλιξη μιας καινοτομίας πρέπει απαραίτητα να συνδυάζονται διαφορετικά επιστόμια πεδία , γνώσεις και δεξιότητες.
ΝΕΟΤΕΡΕΣ ΕΞΕΛΙΞΕΙΣ ΣΤΗΝ ΚΑΤΑΣΚΕΥΗ ΚΑΙ ΛΕΙΤΟΥΡΓΙΑ ΜΕΤΑΣΧΗΜΑΤΙΣΤΩΝ ΔΙΑΝΟΜΗΣ ΜΕ...ιωαννης αληφραγκης
Σκοπός της παρούσας πτυχιακής εργασίας είναι κατ’ αρχήν η παρουσίαση των νεότερων εξελίξεων, των καινοτόμων τεχνολογιών αλλά και της σημερινής και της μέλλουσας κατάστασης στην κατασκευή των μετασχηματιστών διανομής (distribution transformers), αλλά και η ανάδειξη σημαντικών πτυχών πάνω στο θέμα των απωλειών τους. Γίνεται επίσης αναφορά για την υφιστάμενη κατάσταση και πραγματικότητα των δικτύων Η.Ε. ως προς τους μετασχηματιστές διανομής σε Ευρωπαϊκή Ένωση και Ελλάδα. Στην εργασία δεν γίνεται αναφορά στη θεωρία των μαγνητικών πεδίων (μαγνητικά κυκλώματα, μαγνητική συμπεριφορά υλικών, κτλ.) διότι θεωρείται βασική προαπαιτούμενη γνώση για την ανάγνωση της.
Καθώς διανύουμε την πρώτη δεκαετία του 21ου αιώνα γίνεται ολοένα και
πιο εμφανές το γεγονός, ότι το σημαντικότερο πρόβλημα που
αντιμετωπίζουν όλοι οι μηχανικοί, οι σχεδιαστές αναπτυξιακών ιδιωτικών ή
δημοσίων έργων καθώς και οι ιδιοκτήτες κάθε είδους επιχείρησης είναι η
ενεργειακή αποδοτικότητα. Παρόλο που το ζήτημα της αποδοτικής χρήσης
της ενέργειας απασχολεί την παγκόσμια κοινότητα για πάνω από τρεις
δεκαετίες, τα τελευταία χρόνια έχει αρχίσει να αντιμετωπίζεται με
περισσότερη λογική και ωριμότητα από ότι στο παρελθόν. Λαμβανόμενα
O documento discute brevemente dois tópicos importantes da prova do ENEM: 1) a importância do título na compreensão do texto e 2) a compreensão textual como um todo.
Laporan ini memberikan informasi mengenai pelaksanaan program dan kegiatan Balai Besar Pelatihan Peternakan Batu pada bulan Mei 2015. Laporan ini mencakup latar belakang, tujuan, organisasi, tugas pokok dan fungsi unit organisasi BBPP Batu serta rencana dan realisasi kegiatan pelatihan yang dilaksanakan pada bulan tersebut.
Environmental and social disclosure policies in ChinaIIED
This is a presentation by Ms. Sun Xiufang from Forest Trends on environmental and social disclosure policies in China with a focus on Chinese company commitments and stock exchange requirements in land-based sectors.
The presentation was made at the third event of the China-Africa Forest Governance Learning Platform, held in Beijing 24-25 October 2016.
The event explored how China can help sustain Africa’s forests with a focus on the role of private sector actors and Chinese stakeholders in working with African stakeholders to promote pro-poor and sustainable investments and trade in Africa’s forests.
More details: www.iied.org/mists-china-africa-forests
Prova de Língua Portuguesa da UFOP 2008/1 resolvida e comentadama.no.el.ne.ves
O autor critica a atuação dos políticos brasileiros após o acidente aéreo em Congonhas, apontando que eles agem de acordo com seus interesses em vez de se preocuparem com o sentimento público. Ele também critica o sumiço do presidente Lula e a atitude do político Marco Aurélio Garcia.
This document discusses the multidisciplinary product development cycle and deployment of NI-PXI real-time hardware in hardware-in-the-loop simulations. It describes the typical phases of product development including concept, design and development, and validation and verification. It also provides details about using digital prototyping, model-in-the-loop and hardware-in-the-loop simulations using NI-PXI real-time hardware to test control algorithms and identify issues before full deployment. A case study on developing effective flight control systems for an aircraft is presented as an example.
Dokumen tersebut membahas tentang dimensi dan struktur ilmu pengetahuan sosial. Terdapat empat dimensi ilmu pengetahuan sosial yaitu pengetahuan, keterampilan, nilai dan sikap, serta tindakan. Dokumen juga menjelaskan struktur ilmu pengetahuan sosial meliputi fakta, konsep, dan generalisasi yang saling berhubungan untuk membentuk pengetahuan siswa.
Perencanaan strategis sistem informasi dan teknologi informasi (SI/TI) bertujuan untuk menyelaraskan strategi bisnis dan SI/TI agar investasi TI mendukung tujuan organisasi. Metodologi perencanaan strategis Ward dan Peppard digunakan untuk meminimalkan risiko kegagalan dengan melibatkan semua pemangku kepentingan. Analisis SWOT, critical success factor, McFarlan grid, value chain, dan balanced scorecard digunakan untuk menganalisis lingkungan organisasi dalam per
Dokumen tersebut merangkum tentang sistem ekonomi kapitalisme, termasuk definisi, pilar-pilar, kerangka dasar, perspektif, penyebab runtuhnya sistem ekonomi kapitalisme, dampaknya, prinsip dan masalah krisis ekonomi kapitalisme, serta kesimpulan dan saran. Dokumen ini memberikan gambaran menyeluruh tentang sistem ekonomi kapitalisme.
1. Perbandingan ideologi Pancasila dengan ideologi lain seperti liberalisme, komunisme, dan sosialisme pada aspek politik, hukum, ekonomi, agama, dan pandangan terhadap individu dan masyarakat.
2. Ideologi Pancasila mengakui hak individu dan masyarakat serta mendorong keselarasan antara keduanya berbeda dengan ideologi lain.
3. Pancasila bersifat terbuka dan dinamis dapat men
O documento discute os elementos peritextuais de livros didáticos, técnicos e científicos. Apresenta as definições e funções de elementos como capa, sobrecapa, lombada, orelha, folha de rosto, ficha catalográfica, dedicatória, agradecimentos e epígrafe. Inclui imagens ilustrativas de cada elemento.
Το θέμα της παρούσης εργασίας είναι ο έλεγχος ροπής χωρίς την χρήση αισθητήρων ανάδρασης .Η τεχνολογία είναι σχετικά καινούργια Η εργασία θα επικεντρωθεί στο σύστημα D.T.C ( Direct Control System ) της εταιρίας ΑΒΒ .Η τεχνολογία D.T.C αναφέρεται σε ασύγχρονους επαγωγικούς τριφασικού κλινήρες και εμφανίστηκε πρώτη φορά το 1990 Στόχος της εργασίας είναι να αναδείξει τα πλεονεκτήματα που προκύπτουν από την νέα αυτή τεχνολογία , τον αντίκτυπο που έχει στον πραγματικό κόσμο στην βιομηχανία Μέσα από την εργασία φαίνεται έκδηλα ότι για την δημιουργία και την εξέλιξη μιας καινοτομίας πρέπει απαραίτητα να συνδυάζονται διαφορετικά επιστόμια πεδία , γνώσεις και δεξιότητες.
ΝΕΟΤΕΡΕΣ ΕΞΕΛΙΞΕΙΣ ΣΤΗΝ ΚΑΤΑΣΚΕΥΗ ΚΑΙ ΛΕΙΤΟΥΡΓΙΑ ΜΕΤΑΣΧΗΜΑΤΙΣΤΩΝ ΔΙΑΝΟΜΗΣ ΜΕ...ιωαννης αληφραγκης
Σκοπός της παρούσας πτυχιακής εργασίας είναι κατ’ αρχήν η παρουσίαση των νεότερων εξελίξεων, των καινοτόμων τεχνολογιών αλλά και της σημερινής και της μέλλουσας κατάστασης στην κατασκευή των μετασχηματιστών διανομής (distribution transformers), αλλά και η ανάδειξη σημαντικών πτυχών πάνω στο θέμα των απωλειών τους. Γίνεται επίσης αναφορά για την υφιστάμενη κατάσταση και πραγματικότητα των δικτύων Η.Ε. ως προς τους μετασχηματιστές διανομής σε Ευρωπαϊκή Ένωση και Ελλάδα. Στην εργασία δεν γίνεται αναφορά στη θεωρία των μαγνητικών πεδίων (μαγνητικά κυκλώματα, μαγνητική συμπεριφορά υλικών, κτλ.) διότι θεωρείται βασική προαπαιτούμενη γνώση για την ανάγνωση της.
Καθώς διανύουμε την πρώτη δεκαετία του 21ου αιώνα γίνεται ολοένα και
πιο εμφανές το γεγονός, ότι το σημαντικότερο πρόβλημα που
αντιμετωπίζουν όλοι οι μηχανικοί, οι σχεδιαστές αναπτυξιακών ιδιωτικών ή
δημοσίων έργων καθώς και οι ιδιοκτήτες κάθε είδους επιχείρησης είναι η
ενεργειακή αποδοτικότητα. Παρόλο που το ζήτημα της αποδοτικής χρήσης
της ενέργειας απασχολεί την παγκόσμια κοινότητα για πάνω από τρεις
δεκαετίες, τα τελευταία χρόνια έχει αρχίσει να αντιμετωπίζεται με
περισσότερη λογική και ωριμότητα από ότι στο παρελθόν. Λαμβανόμενα
Το 2ο κεφάλαιο στο μάθημα Συλλογή Μεταφορά και Έλεγχος Δεδομένων Θεωρία του τομέα Ηλεκτρονικής και ειδικότητας Ηλεκτρονικών Υπολογιστικών Συστημάτων και Δικτύων, Γ’ τάξη ΕΠΑΛ.
Η παρουσίαση αυτή (PPT in PDF) είναι ενεργή, συνοδεύεται από κάποια αρχεία τα οποία συνδέονται με υπερσυνδέσεις. Περισσότερες πληροφορίες στην σελίδα http://www.ilektronikoi.gr/index.php?act=viewCat&catId=19
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. ∆ιάγραµµα ροής της συνολικής διεργασίας
Στις επόµενες δύο σελίδες δίνονται τα σχηµατικά διαγράµµατα της συσκευής.
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
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
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
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
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
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. ∆ιάγραµµα ροής του πρωτοκόλλου επικοινωνίας των δύο µικροελεγκτών