SlideShare a Scribd company logo
1 of 31
Download to read offline
I2C_Bus
Eksamensprojekt 2007 i EL-Teknik
Af: Morten Grue Sørensen
El-Teknik Af: Morten Grue Sørensen
Eksamens projekt 2007 3.Y – HTX -Sønderborg
Side 2 af 31
Forord
Denne rapport er udformet i forbindelse med eksamensprojekt på EUC-SYD, HTX-
Sønderborg i teknikfaget EL-Teknik.
Den valgte opgave er ”opgave 19 – Udvidelse af Micro Controler – I2C” fra de udleverede
opgaver.
I projektet har jeg arbejdet sammen med Bo Elund, vores samarbejde er ikke totalt da vi har
lavet en meget fysisk opdeling af projektet, vi kommunikerer med forskellige kredse, men
benytter os af de samme primitiver (subrutiner) så vi kan slå det sammen til sidst, og så laver
vi kun et print, med alle vores kredse på, vi har også delt linjerne på displayet op før vi
begyndte at kode.
Sammen med rapporten vil der være en CD, hvor det vil være muligt at finde alle datasheeds,
flowcharts, assembler kode (i fuld længde), print udlæg mm, generelt sagt alt baggrunds
materiale for skrivning af denne rapport og udførelsen/opbygningen af produktet.
Der vil på grund af CDen ikke være nogen bilag, og der vil blive henvist til materiale på
CDen, der hvor det er relevant og/eller nødvendigt for forståelsen af den valgte fremgangs
måde. Rapporten er skrevet med henblik på at man sidder og har CDen åben mens man læser
rapporten, så man har de nødvendige referencer, da alt kode ikke er kopieret ind i Word
(fylder over 22 sider på rent udskrift), og nogle af flowchartsene er så store at de heller ikke
kan kopieres ind i word, så det er nødvendigt at kunne se dataen på CDen for at kunne følge
med.
For at læse flowcharts skal man bruge ”EDGE Diagrammer – READER” som er freeware.
For mere info om ”EDGE Diagrammer” og hvordan det bliver brugt i dette projekt se Word
filen ” EDGE-Diagrammer – README.doc” som ligger på CDen i root folder.
Som note system vil der blive gjort brug af Office 2007 fodnotesystem, hvor noten står i
bunden af siden1, her vil referencer, links eller andre former for henvisninger stå, der vil tit
blive henvist til ”CDen”, her tænkes på den medfølgende CD, hvor alle flowcharts, datasheets
og koder ligger.
Til slut vil jeg gerne sige tak til Valle Thorø for god vejledning, til Kristen Grue Sørensen,
min mor, for at have rettet rapporten for stavefejl, og Bo Elund for godt samarbejde.
1
Test af note system
El-Teknik Af: Morten Grue Sørensen
Eksamens projekt 2007 3.Y – HTX -Sønderborg
Side 3 af 31
El-Teknik Af: Morten Grue Sørensen
Eksamens projekt 2007 3.Y – HTX -Sønderborg
Side 4 af 31
I2C_Bus................................................................................................................................. 1
Forord................................................................................................................................ 2
Indledning.......................................................................................................................... 5
Generelt om I2C kommunikation ....................................................................................... 7
I2C kommunikations protokollen ................................................................................... 7
Basis om PCF8583P-clock/Calendar................................................................................ 10
Svagheder ved PCF8583P ............................................................................................ 12
Basis om 24C02 EEPROM .............................................................................................. 13
Svagheder ved 24C02................................................................................................... 14
Basis om AT89C4051 – microcontroler ........................................................................... 15
Produkt udvikling ................................................................................................................ 16
Fase 1 .............................................................................................................................. 16
Seriel opsætning........................................................................................................... 16
Fase 2 .............................................................................................................................. 17
Læsning af PCF8583P.................................................................................................. 19
Skrivning til PCF8583P................................................................................................ 20
Skrivning og læsning af 24C02 – EEPROM................................................................. 21
Fase 3 .............................................................................................................................. 22
IndStilTid..................................................................................................................... 25
Code0........................................................................................................................... 26
Resten af subrutinerne.................................................................................................. 27
Problemer under produktudvikling ............................................................................... 28
Komponent liste............................................................................................................... 29
Pris............................................................................................................................... 29
Konklusion .......................................................................................................................... 30
Kilde fortegnelse.............................................................................................................. 31
Hjemmesider................................................................................................................ 31
Datasheets.................................................................................................................... 31
El-Teknik Af: Morten Grue Sørensen
Eksamens projekt 2007 3.Y – HTX -Sønderborg
Side 5 af 31
Indledning
Før 1980 når man skulle kommunikere mellem forskellige kredse, skete det ved at slutte dem
til microcontrolerens pins, dette kunne hurtigt blive til mange ledninger og kræve mange pins,
det gav to problemer, prints blev meget store for at gøre plads til de mange ledninger, og man
skulle have flere kredse, microcontrolers, for at kunne udvide mere, begge disse to ting gjorde
det dyrere at producere og eftersom udviklingen gik imod mere komplekse systemer var det
nødvendigt med en ny metode til at kommunikere mellem ICer på, og i starten af 1980erne
kom Philips med en løsning, nemlig I2C, Inter Integrated Controler, som er en peripheral bus
designet til at kommunikere med mange IC’er gennem kun to ledninger (Serial Data line
”SDA” og Serial Clock line ”SCL”) + stel.
For at kunne kommunikere med mange enheder på kun to ledninger skulle hver enhed have en
unik adresse, en slave adresse, så man kunne bestemme hvilken kreds man ville kommunikere
med.
Selve kommunikationen på I2C-bussen forgår i 8bit serielt mode, altså er der en naturlig
begrænsning på antallet af kredse der kan tilsluttes en I2C-bus, i en 8 bit adresse ville der
være 256 muligheder, men på grund af at der også skulle være mulighed for at se forskel på
read og write valgte Philips at afsætte LSB til dette, så adresserne kun blev 7bit (128
muligheder)+R/W bit, så på en I2C-bus kan der max være tilsluttet 128 enheder, men hvis
man ser på hvor stor en forbedring dette er, i forhold til det tidligere hvor man brugte 8 pins
per kreds, så gik man fra at skulle bruge 8*128=1024pins til kun at skulle bruge 2, for at
kommunikere med 128 forskellige enheder.
I2C-bus2– billede1
2
Fra Kompendium ”Busser” – side 4 – af: Valle Thorø
El-Teknik Af: Morten Grue Sørensen
Eksamens projekt 2007 3.Y – HTX -Sønderborg
Side 6 af 31
Der findes naturligvis andre busser, deriblandt kan nævnes µWire, SPI og USB, som alle
virker på nogenlunde samme måde, hvis man ser på SPI så kommunikerer den også på to
ledninger, men den skal derudover have en ekstra ledning per kredsen, til gengæld skal man
ikke bruge slaveadresser, for kun kredse hvor deres ekstra pin er høj vil kunne modtage data
fra bussen3.
Der er også forskel på hastigheden hvormed de forskellige busser kommunikerer, I2C-bussen
er en af de langsomste, i den version som bliver benyttet i dette projekt, når man ser på hvor
hurtig en bus er, ser man på hvor mange bits den kan sende/modtage per sek, eller sagt på en
anden måde, hvor mange Hz den kan køre med, I2C-bussen som bliver brugt i dette projekt
kører op til 100 kHz, det er normal mode, men den har også en fast-mode hvor den kan køre
på op til 400 kHz, men selv med en hastighed på 400 kHz er den relativ langsom i forhold til
for eksempel USB der køre på mellem 2 – 12 MHz.
Bus hastigheder4– billede 2
I dag er der også kommet USB 2.0, som kører 12 gange hurtigere end den gamle version som
er på billede 2, men på trods af at mængden af data, som kan sendes gennem en I2C-bus i
normal mode, er relativt lidt så er det rigeligt til de kommunikationsprotokoller som bliver
brugt i dette projekt, da der kun sendes/modtages 8bit sekvenser, altså kan der sendes
100.000/8 = 12500bytes per sek. hvilket er mere end rigeligt.
3
Kompendium ”Busser” – af: Valle Thorø
4
Billede fra Kompendium ”Busser” – side 2 – af: Valle Thorø
El-Teknik Af: Morten Grue Sørensen
Eksamens projekt 2007 3.Y – HTX -Sønderborg
Side 7 af 31
Valget af I2C bussen var naturligt da det var den som blev beskrevet i opgaven.
Men i stedet for at optegne et produkt til at starte med, så var det noget med at gå ned og
prøve at få kommunikationen til at virke, først på den mest simple måde, for at finde
mulighederne og grænserne. Der var en række kredse til rådighed, 24c02-EEPROM
(Electrically Erasable Programmable Read-Only Memory), PCF8574AP-Remote 8-bit I/O,
PCF8583P-clock og PCF8591P-A/D D/A konverter, så første skridt var at finde ud af hvordan
I2C-bussen fungerer.
Generelt om I2C kommunikation
Kommunikationen på I2C bussen forgår som 8bit serielt på SDA linjen.
Dette forgår i et master/slave miljø, hvor der er en master, for det meste en micrcontroler, som
styrer bussen, i mere komplekse systemer kan der være mere end en master, men for at dette
kan fungere skal alle microcontrolers have en hardware I2C interface, og det har AT89C4051,
som var alt hvad der var til rådighed for dette projekt, ikke, men hvis der er mere end en
master tilsluttet bussen, er der et smart princip som undgår data coruption, det heder ”0 rules
the bus” det vil sige i det tilfælde hvor to masters forsøger at sende data på samme tid, vil den
som først sender et ”0” ud på SDA, vil ”eje” bussen indtil den har sendt et stop signal, og
enhver anden master som ikke fik bussen, vil gå i en venteposition og forsøge at sende sin
data når der har været et stop signal.
I2C kommunikations protokollen
Enhver kommunikation på I2C-bussen starter med at masteren udsender
en ”START-Condition (START)” der er defineret som en ”Høj-til-Lav”
SAD mens SCL er høj.
I2C-Start condition5
5
Fra I2CHowToUseIt.pdf – side 3-8 – kan findes på CD’en i mappen ”Datasheets”
El-Teknik Af: Morten Grue Sørensen
Eksamens projekt 2007 3.Y – HTX -Sønderborg
Side 8 af 31
En START skal altid efterfølges af en slave adresse. Slave adressen er en 8 bit adresse som
består af tre dele, de første 4 – 6 bit er en fast device ID, som er hardware indkodet i hver
enkelt slaveenhed, derudover er der 3 – 1 bit som også er en del af devise adressen, men disse
er trukket ud som pins, så disse enten kan sluttes til høj eller lav, så man kan have mere end
en af samme kreds. Den sidste bit i adressen er et
READ/WRITE (R/W) bit, hvis den er lav vil man
skrive, og den kreds som har slave adressen der kom i
de første 7bit gør sig klar til at modtage data, hvis
R/W var høj gør kredsen klar til at sende data.
De 8bit som følger en START6– billede4 8-bit slave adresse (WRITE)7 – billede5
Der er også en nyere version hvor man bruger 10bit adressering, det er identisk med 7-bits
adressering, bare med 3 bit mere i alle slave adresser, så man kan have 8 gange så mange
kredse sluttet til bussen.
Hver gang der er blevet sendt 8 bit data over I2C-busen skal den efterfølges af en
”acknowledge-bit (ACK)”, som kommer fra den der modtager data, som en bekræftelse på at
dataen er modtaget korrekt, der kan også blive udsendt en ”Not acknowledge-bit (NAK)” som
kan bruges til to ting, enten til at sige at det data der lige blev sendt ikke blev godkendt, eller
til at stoppe en sender, en NAK skal altid følges af en ”STOP-Condition (STOP)”.
ACK og NAK er bare en bit som enten er lav eller høj.
For at afslutte en kommunikation på I2C-bussen skal masteren udsende en
”STOP-Condition (STOP)”, som er defineret som en ”Lav-til-Høj” SAD
mens SCL er høj.
6
Fra I2CHowToUseIt.pdf – side 3-13 – kan findes på CD’en i mappen ”Datasheets”
7
Fra I2CHowToUseIt.pdf – side 3-11 – kan findes på CD’en i mappen ”Datasheets”
El-Teknik Af: Morten Grue Sørensen
Eksamens projekt 2007 3.Y – HTX -Sønderborg
Side 9 af 31
Så en kommunikation på I2C-bussen kunne se sådan her ud:
Et eksempel på
kommunikation på
I2C-busen8– billede6
Her vil man skrive noget data direkte til den slave som har den pågældende adresse, de fleste
kredse kan blive ved med at modtage data indtil de modtager en STOP, men nogle få har visse
begrænsninger, for eksempel så kan EEPROMen (24c02) kun modtage 8 bytes i træk9, disse
begrænsninger kan man altid finde i de tilhørende datasheets.
Hvis man skal have en mere kompleks kommunikation, hvis man for eksempel vil læse hvad
der ligger i en bestemt ram adresse i EEPROMen, skal der først sendes en bit adresse, og så
skal ser læse den data som ligger i den adressen, der skal altså først skrives til EEPROMen og
derefter læses fra den, men da det er R/W biten i slaveadressen som bestemmer om der skal
skrives eller læses, skal der altså sendes en slave adresse med WRITE, og så 8 bit data (bit
adressen), derefter en ny slaveadresse med READ så man kan læse de data der ligger i
EEPROMen, men en slaveadresse må kun komme efter en START, så der skal også sendes to
START, hele kommunikationen kommer altså til at se sådan her ud:
Write og Read kommunikation med en reSTART imellem10– billede7
Så man kan altså sende en ”reSTART” uden at der har været en STOP imellem, man kan
teoretisk set sende lige så mange reSTART man vil for at omdefinere sin kommunikation med
en bestemt kreds, hvis man vil have fat i en ny kreds skal kommunikationen med den første
altid afsluttes med en STOP.
8
Fra I2CHowToUseIt.pdf – side 3-14 – kan findes på CD’en i mappen ”Datasheets”
9
Fra 24c02-EEPROM.pdf – side 3-14 – kan findes på CD’en i mappen ”Datasheets”
10
Fra I2CHowToUseIt.pdf – side 3-14 – kan findes på CD’en i mappen ”Datasheets”
El-Teknik Af: Morten Grue Sørensen
Eksamens projekt 2007 3.Y – HTX -Sønderborg
Side 10 af 31
Basis om PCF8583P-clock/Calendar
Den første I2C-kreds som vi vil se på er PCF8583P-clock/calendar, det er en realtime
kalender, og tid, den har indbygget en 4 års komplet kalender, med skudår og alt, den har styr
på hvor mange dage der er i hver måned, alt efter hvilket år det er, der er 29dage i februar i
det første år, og 28 dage de tre andre år den har inde. Den har 8 pins som ser sådan her ud:
”PCF8583P-Clock/Calendar” pin udlæg og definisioner11– billede8
Her kan man se at den skal have en oscillator tilsluttet på pin 1 og 2, dette skal være et 32.768
KHz kystal. Man kan også se at der kun er en variabel adresse input, A0 på pin 3, man kan
altså max have 2 af disse kredse tilsluttet en bus, den har også 6bit af dens slaveadresse som
er hardware bedstemt fra fabrikantens side, disse er:
Pin 7 (!INT) bruges kun hvis alarmdelen af Slave adresse for PCF8583P12– billede 9
kredsen tages i brug, det vil ikke blive yderlige beskrevet her, men man kan læse mere om den
i datasheetet for PCF8583P.
11
Fra PCF8583P-clock.pdf – Side 4 – kan findes på CD’en i mappen ”Datasheets”
12
Fra PCF8583P-clock.pdf – Side 16 – kan findes på CD’en i mappen ”Datasheets”
El-Teknik Af: Morten Grue Sørensen
Eksamens projekt 2007 3.Y – HTX -Sønderborg
Side 11 af 31
I PCF8583P er der et 256x8bit RAM hvor de første 16 er de ram hvor i klokken, datoen, året
og alarmtidspunkter står, de sidste 240x8bit er frie ram, som der ikke vil blive arbejdet med.
ude til højre ses en oversigt over rammen i PCF8583P,
dem som er interessant for at holde styr på tiden er 01
til 06, og dem vil vi nu gennemgå.
Hundrede del sek, sek, min og timer ligner alle sammen
hinanden, der ligger to tal i pakke BCD (Binary Code
Decimal), og de stiger i takt med at tiden går.
I 05 ligger både dato og år, i low nibbel ligger ”1dag” i
pakke BCD, men i high nibbel ligger både ”10dag” og
året, hvis man gør det simpelt så starter man den altid i
år 0 (af de 4) og så kan man også tage hignibbel som
pakke BCD.
06 er den mest komplekse da uge dage også ligger i
denne, den ser sådan her ud:
Ram adresse 06 i PCF8583P13– billede10
De 3 MSB’s er uge dagen, de kan gå fra 0 til 6 (mandag
til søndag), bit 4 er ”10måneder” den kan jo kun være 1
eller 0, da der ikke er over 12 måneder, og low nibbel er
”1måned” i pakke BCD.
Alt fra 06 og op til 0F har så noget med alarm
funktionen at gøre, hvis alarm funktionen er deaktiveret
vil disse kunne bruges som ”Free RAM”.
Oversigt over RAM i PCF8583P14– billede1 1
13
Fra PCF8583P-clock.pdf – Side 8 – kan findes på CD’en i mappen ”Datasheets”
Diagrammer for alle tids ram adresserne 00 til 06 kan findes på side 8.
14
Fra PCF8583P-clock.pdf – Side 7 – kan findes på CD’en i mappen ”Datasheets”
El-Teknik Af: Morten Grue Sørensen
Eksamens projekt 2007 3.Y – HTX -Sønderborg
Side 12 af 31
I RAM adressen 00 ligger control/status registeret. Dette register definerer hvordan kredsen
arbejder, hvilke mod, og hvilke funktioner der er aktive.
Hvis man starter nede fra så er de 3 første bits
opsætning af alarm funktionen, hvis de bare er lave så
er alarmfunktionen deaktiveret, det 3 bit hedder ”mask
flag” og skal være til høj hvis man vil kunne holde styr
på dato og måned, hvis den er lav kan 05 og 06 i
RAMen ikke læses direkte, bit 4 og 5 definerer hvilket
mode den skal køre i, der er 4 muligheder:
Hvis man sætter et 32.768
KHz krystal på skal man
bruge mode 00
”Clock mode” er det mode hvor man holdet styr på tid.
Oversigt over 00 Control register15 – billede12
Svagheder ved PCF8583P
Der er to ting som er mindre godt ved PCF8583P kredsen, den første er at man godt kan sende
”ikke korrekte” værdier til timerregistrene, og det resulterer i at den ikke kan holde tiden, da
den ikke er reale tidspunkter, hvis man sender 34h til 04 (timer) så vil den bare blive ved med
at +1 til timer hver time uden at ændre dage, så hvis man loader en for stor værdi ind i vil man
ødelægge den evne til at holde tiden over denne adresse. Den anden er ikke så slem, men når
man skal indstille tiden skal man starte med at stoppe tiden, dette gøres ved at sætte MSB i
control register høj, dette skal gøres før man begynder at ændre tiden, og den skal selvfølgelig
sættes lav igen når man er færdig med at indstille kredsen.
15
Fra PCF8583P-clock.pdf – Side 6 – kan findes på CD’en i mappen ”Datasheets”
El-Teknik Af: Morten Grue Sørensen
Eksamens projekt 2007 3.Y – HTX -Sønderborg
Side 13 af 31
Basis om 24C02 EEPROM
EEPROM (Electrically Erasable Programmable Read-Only Memory), har 2k bits memory, og
den er garanteret 1 million slet/skrive cyklusser med garanti på at dataen bliver der i minimum
40år.
Pin udlæg for 42C02 – EEPROM16– billede13
Som det kan ses har 24C02 8 pins, 3xdevice adresse pins, E0 til E2, og en MODE pin, som
bestemmer om den skal køre i ”multibyte mode” eller ”page wirte mode”.
Fra 24C02 kan man læse og skrive data på 6 forskellige måder, det er ”Current Address
Read”, ”Random Address Read”, ”Sequential Read”, ”Byte Write”, ”Multibyte Write” og
”Page Write”, de to som er mest brugbare er ” Random Address Read/ Sequential Read” og
”Page Write”, da disse er der hvor man kan læse / skrive mere end en byte til EEPROMen.
oversigt over forskellige kommunikations typer med 42C0217– billede14
Som det kan ses fra denne tabel så kan man max skrive 8byte af gangen med page write, dette
skal man huske at tage højde for. Der er også en anden ting som er specielt ved page write,
nemlig det at den ikke skriver dataen når den modtager den, men først når den får en STOP
begynder den at skrive til memory, så længe den er i gang med en write cyklus, vil kredsen
ikke svare på nogen forspørgsler.
16
Fra ” 24c02-EEPROM.pdf” – side 2 – kan findes på CD’en i mappen ”Datasheets”
17
Fra ” 24c02-EEPROM.pdf” – side 3 – kan findes på CD’en i mappen ”Datasheets”
El-Teknik Af: Morten Grue Sørensen
Eksamens projekt 2007 3.Y – HTX -Sønderborg
Side 14 af 31
EEPROMen har lige som alle andre I2C-kredse en ”device code” som er de 4 MSB’s i slave
adressen, for alle EEPROMs af denne typpe er denne:
24C02 slave adresse18– billede15
Den har altså 3 variable bit i sin slave adresse, hvilket giver mulighed for op til 8x2K bit =
16K bits memory som man maksimalt kan have tilsluttet en I2C-bus på en gang.
Kommunikations protokol for skrivning til 24C0219– billede16
Her ses kommunikationsprotokollen for 24C02 EEPROM, når man vil skrive til den, er bare
vigtigt man husker ”N” må max være 8.
Kommunikations protokol for læsning af 24C0220 – billede17
Når man læser kan man læse alle 256 byets i streg, uden at man behøver at gøre noget specielt
ved det, man skal dog lægge mærke til, at man skal bruge reSTART funktionen hvis man vil
starte et andet sted end 00.
24C02 har som standart alle ram adresser fyldt med FFh.
Svagheder ved 24C02
Selv om denne kreds har rigtig meget plads, så tager det meget lang tid (nogle ms) at skrive
data, selv om den kun kan modtage 8 bytes af gangen hvilket også hurtigt kan visse sig at
være for lidt.
18
Fra ” 24c02-EEPROM.pdf” – side 3 – kan findes på CD’en i mappen ”Datasheets”
19
Fra ” 24c02-EEPROM.pdf” – side 10 – kan findes på CD’en i mappen ”Datasheets”
20
Fra ” 24c02-EEPROM.pdf” – side 12 – kan findes på CD’en i mappen ”Datasheets”
El-Teknik Af: Morten Grue Sørensen
Eksamens projekt 2007 3.Y – HTX -Sønderborg
Side 15 af 31
Basis om AT89C4051 – microcontroler
Nu har vi set på to forskellige kredse, PCF8583P og 24C02, som begge er slaves, men for at
have en funktionel I2C-bus skal der være en master til at ”styre slagets gang”, en som kan
sende START og STOP, og som kan læse, skrive og behandle data fra I2C-bussen, til dette
formål ser vi på ATMEL AT89C4051 microcontroler, som dog ikke er den optimale
microcontroler til I2C-kommunikation da den ikke har noget I2C hardware interface, men
man er nødt til selv at skrive et software interface, hvilket fjerner muligheden for at have mere
end en master på bussen.
AT89C4051 har 20 pins, som er delt op i to porte
P1 og P3, og så er der to porte til at sætte et
krystal på, mange af portene har ud over at være
den del af enten P1 eller P3 en anden funktion
som for eksempel P3.1 er også det pin hvor
microcontroleren kan modtage data serielt fra en
anden microcontroler.
Pin oversigt for AT89C405121 billede18
AT89C4051 har 4Kb FLASH memory, som kan programmeres, dette kan gøres med
assembler, C++, basic eller et andet sprog, det vigtige er at man har en kompiler som kan lave
det om til 8 bit maskinkode, som så kan brandes ind i microcontroleren, der vil kun blive
arbejdet med assembler i denne gennemgang.
Gennem I2C software interface til microcontroleren vil P3.5 fungere som SCL og P3.7 som
SDA.22
Microcontroleren har et utal af andre muligheder som ikke er nødvendige at kommer nærmere
ind på, for at have mulighed for at forstå og benytte AT89C4051, hvis man vil have mere
information om microcontroleren så kan det findes på den vedlagte CD, der ligger datasheet
og et støre kompendium skrevet af Valle Thorø, som heder ”89C2051 kompendium.doc”.
21
Fra ”89C2051-microcontroler.pdf” – side 2 – kan findes på CDen i mappen ”Datasheets”
22
Software interface er kopieret fra http://hjemmesider.eucsyd.dk/vt/El_rammer/Kodegenerator.htm
El-Teknik Af: Morten Grue Sørensen
Eksamens projekt 2007 3.Y – HTX -Sønderborg
Side 16 af 31
Produkt udvikling
Fra opgave 19 var der ikke rigtig defineret et produkt, og der var ikke lagt op til produktionen
af et meget anvendeligt produkt, men mere til, at man arbejdede med det og lavede nogle
funktioner som udnyttede fordelene ved I2C-bussen.
Da alt om I2C-bussen var nyt, var tilgangen til udvikling af et produkt ikke som man
”normalt” gør, men det var noget med at starte med at få testet hvad der var af muligheder i
arbejdet med I2C-bussen.
Fase 1
Før man kan komme i gang med at arbejde med I2C-bussen skal man have en eller anden
form for visualisering af, om det man laver virker, så det første er ikke at begynde at sætte en
I2C-bus op og smide nogle kredse på den, først skal man have et display af en art til at virke,
her kan man for eksempel tage et ”dem20485syh-ly” som er et 4x20 LCD-display, til
kommunikation med dette har Valle Thorø lavet en række subrutiner som er meget nemme at
bruge og ikke er nødvendige at sætte sig ind i, andet end at de virker, de kan kendes i koden
ved at de alle sammen starter med ”LCD_”.
Seriel opsætning
Der skal også være en form for input, et tastatur af en art så man kan få et input, her er en
selvstændig tastaturkreds med egen microcontroler at fortrække, da det giver mulighed for at
køre det for sig selv, uden at det kommer til at forstyrre andre ting på hoved microcontroleren,
og så er der også den ting med pins, da et tastatur med 12 knapper skal bruge 7 pins så kan
man hurtigt få optaget sine pins.
Til kommunikation mellem tastatur-microcontroler og hoved microcontroler skal der opsættes
en seriel del, som er indbygget i AT89C4051, det kræver kun en ledning mellem de to
microcontrolere og en opsætning af timer 1 til baudrate timer, dette skal gøres på begge
microcontrolerne, det kræver ikke så meget opsætning:
Hvor at Baudrate er 0E8H, som er ca. 1200 bit/s ved et 12MHz krystal.
El-Teknik Af: Morten Grue Sørensen
Eksamens projekt 2007 3.Y – HTX -Sønderborg
Side 17 af 31
Ud over opsætning af timer 1 til baudrate timer skal selve den serielle del også sættes op,
sammen med det serielle interrupt, det er også meget nemt:
Her bliver det serielle interrupt godt nok deaktiveret, men det er kun for at der er mulighed for
at udnytte den serielle kommunikation på en anden måde, hvis man her i starten bare skal
have det serielle interrupt til at køre så er det bare at skifte ”clr” ud med ”Setb”.
Den serielle interrupt vektor ligger på 23h, det vil sige at hver gang der kommer et serielt
interrupt så vil programmet, lige meget hvad det laver, hoppe hen og udføre den kode der står
ved 23h, det kan for eksempel være at sætte et bit højt, eller kalde en subrutine.
Nu er der altså mulighed for at skrive noget på tastaturet og så se det oppe på LCD-displayet,
vi har altså en visuel måde at se hvad der sker, og vi har en form for input. Nu kan vi begynde
at sætte I2C-bussen op.
Fase 2
Indtil nu har det bare været opsætning og afprøvning af allerede kendte tekniker, ting som er
blevet gennemgået i undervisningen.
Nu skal I2C-bussen opsættes, I2C-bussen er jo reelt set to ledninger, som man kan forbinde
kredse til, men den skal også have en pull-up modstand tilsluttet både SDA og SCL, og der
skal en modstand mellem bussen og hver enkelt kreds, både til SDA og SCL, disse er der for
at beskytte kredsene mod pludselige spændingsændringer, dette vil meget sjældent blive et
problem, men da de ikke gør noget skade er det altid en god ide at have dem med.
Disse modstande skal dimensioneres efter hinanden, dette er ikke specielt indviklet da der i
det datasheet som Philips har udgivet om I2C er nogle grafer der viser sammenhængene.
El-Teknik Af: Morten Grue Sørensen
Eksamens projekt 2007 3.Y – HTX -Sønderborg
Side 18 af 31
Dimensionering af modstande til beskyttelse af I2C-bus og kredse23- billede19
Her kan det nemt og hurtigt aflæse hvor store Rp og Rs skal være, dette er første trin i at få
I2C kommunikationen til at virke.
Nu er det bare at få sluttet en kreds til og få noget kommunikation i gang, lad os starte med at
smide PCF8583P-clock/calender kredsen på bussen.
Her skal man til at forstå at bruge I2C-kommunikationsprotokollen i praksis, men kan skal
virkelig have lavet en logisk kode hvis man skal have det til at virke.
Det første mål er bare at få noget data fra PCF8583P, ikke noget med at indstille tiden eller alt
muligt andet, bare hente sek og 10/sek ud, og visse dem på displayet.24
Hvis vi ser på nogle udpluk af koden til at hente sek ud og få dem op på LCDen.
23
Fra ”I2CHowToUseIt.pdf – side 3-17 – kan findes på CD’en i mappen ”Datasheets”.
24
Jeg vil ikke kopiere hele koden til dette ind, men det kan findes på CDen i mappen ”assembler koder” i filen
”tid fra kaldender, 1s+0,1s.a51” som kan læsses med notesblok, men Keil er at fortrække (farve koder).
El-Teknik Af: Morten Grue Sørensen
Eksamens projekt 2007 3.Y – HTX -Sønderborg
Side 19 af 31
Læsning af PCF8583P
Først er det at få startet bussen op og få
kaldt kredsens slave adresse og sagt
hvilken adresse man vil læse, og så skal
man jo have data fra PCF8583P, altså
skal der sendes en reSTART, så man
igen kan sende slave adressen, denne
gang bare med ”READ” på det 8 bit.
Som man kan se i denne lille stump kode, så er der indlagt en række fejlrutiner, som gør at
man er i stand til at finde ud af hvor i ens kode fejlen er opstået hvis den ikke virker, men for
at kunne lave disse fejltjek på kommunikationen, må man først have en basisforståelse for de
subrutiner der udgør det software interface som bliver brugt, der har rutinerne ”I2C_START”
og ”I2C_shout” nemlig indbygget en tjek af om bussen er til stede og den pågældende kreds
svarer tilbage med det 9. bit ACK.
Til at melde fejl bruger disse subrutiner carry (CY) eller bare ”c”, som hvis de er høje når
subrutinen returnerer, vil betyde at de IKKE fik svar fra kredsen, og dermed har man enten
ikke fat i kredsen ellers vil/kan den ikke modtage data på det pågældende tidspunkt.25
Efter der er blevet taget kontakt til PCF8583P og den har svaret og reSTART er sendt, så skal
man modtage data dette gøres med
Som det kan ses fra kommentaren i koden ligger både 10/s og 100/s nu i a, men vi skal kun
have fat i 10/s, som ligger i de 4 MSB’s, altså skal der laves noget bitmanipulation, også fordi
vi skal have lavet tallet om til et tal som LCDen kan skrive, der skal altså omformes til ”ascII”
(Amarican Standart Code for Information Interchange).
Og det gentages så med at hente ny data med ”I2C_shin”, og lave bitmanipulation, man kan
bare kalde ”I2C_shin” igen da word adressen automatisk er blevet en højere.
25
Se Flowchart ”I2C_Shout_Shin-subrutine.edg” og ”I2C_start_stop-subrutine.edg” som kan findes på CDen i
mappen ”FlowC” – Åbnes med EDGE diagrammer READER, ligger på CDen.
El-Teknik Af: Morten Grue Sørensen
Eksamens projekt 2007 3.Y – HTX -Sønderborg
Side 20 af 31
Skrivning til PCF8583P
Det næste skridt er at kunne skrive noget til PCF8583P, så man kan fortælle den hvad klokken
og datoen er når man starter den, dette skal gennemarbejdes i to faser, en hvor man bare
sender, og en hvor man sikrer, at man sender det rigtige, altså kun muligheder som er reale,
man skal ikke kunne sige at klokken lige nu er ”man. 33/14 kl: 55:82”, men den sidste del
med at sikre at dataen er korrekt, vil der blive set på senere.
Hvis man skal indstille tiden så vil vi ikke til at fortælle den noget om 100/s 10/s eller sek,
men vi skal ikke gå længere ”ned” end til minutter.
For at sende data til en kreds er det meget vigtig at man er helt klar over hvordan dataen skal
ligge i kredsen for at den kan forstå det. Først skal man bare lige have fat i kredsen med
START og slave adresse, så skal man vælge Word adresse, og her bliver man nødt til at vælge
00h da man skal have sat timeren i stå og dette gøres gennem den MSB i kontrol registeret
00h26.
Nu er der så to muligheder for at komme videre til Word adresse 03h hvor minutter skal ligge,
enten kan man sende 00h ud to gange så Word adressen automatisk bliver forhøjet indtil man
er på 03h, eller man kan sende en reSTART og definere Word adressen til 03h.
Når man er i 03h skal man have mulighed for at skrive på tastaturet hvilket minut tal det er
lige nu, man skal altså have et (to da min bestå af to tal, et for 10min og et for 1min) input fra
tastaturet (seriel) og sende det ud til PCF8583P, og man skal, når man først har trykket 10min,
kunne se det man har trykket på displayet, det kan se sådan her ud:
Nu har man modtaget de to input for min, og gennem en smule bitmanipulation, har man fået
den gemt i en 1byte i pakke BCD, lige sådan som de skal ligge i PCF8583P, ud over det har
man skrevet dem på displayet, nu er der bare tilbage at sende dataen til PCF8583P
26 Se ” PCF8583P-clock.pdf” – 7.11 Initialization
El-Teknik Af: Morten Grue Sørensen
Eksamens projekt 2007 3.Y – HTX -Sønderborg
Side 21 af 31
Når man har fået det her til at virke er resten meget nemt, da kommunikationen er den samme,
det eneste der skal ændres på at bitmanipuleringen, for at se et flowchart over indstilling af
tiden så se på CDen i mappen ”FlowC”, der er ”IndStilTid-subrutine.edg” og ”IndStilTid-2-
subrutine.edg” (flowchartet fyldet to sider) som er det samlede flowchart til indstilling af tid
og dato, der er også tjek af om den sendte data er real.
Skrivning og læsning af 24C02 – EEPROM
Nu da kommunikation med PCF8583P er på plads skal man også have set lidt på den anden
kreds på bussen, nemlig EEPROMen 24c02, den er lidt mere simpel da den ikke har en aktiv
funktion, men en passiv, den skal modtage data når den får det at vide og gemme det indtil
man spørger efter det, den skal ikke ændre på noget data.
Før vi har noget at læse må vi skrive noget til EEPROMen, dette er meget nemt, først sender
man start + slave (Write) og så den Word adresse hvori man vil gemme sin data, og så er det
bare at sende dataen, dog max 8 byte da det er alt hvad den kan klare af gangen, og her er det
meget vigtig at slutte af med en STOP, da dataen først bliver skrevet ind i EEPROMen når
den modtager en STOP.
Nu ligger der altså noget vi har trykket på
tastaturet i 0B0h i EEPROMen, igen ser
vi at fejl rutinerne er gode at have med,
så man kan se hvis der gå noget galt et
sted.
El-Teknik Af: Morten Grue Sørensen
Eksamens projekt 2007 3.Y – HTX -Sønderborg
Side 22 af 31
Hvis vi nu vil læse det vi har skrevet til EEPROMen, så gøres det sådan her:
Fase 3
Først når dette virker, har man viden nok om de kredse der bliver arbejdet med, og om
kommunikationen på I2C-bussen, til at kunne lave nogle blokdiagrammer over hvad man
gerne vil ende op med som produkt.
LCD_Display
Tastatur
Seriel
Opdeling – Blokdiagram 1
Der skal altså være 4 blokke, som skal laves på to prints, et tastatur print, og et display/I2C
print hvor den primære microcontroler skal sidde, de to print skal kun være forbundet af en
enkelt ledning, så microcontroleren på tastaturet kan sende serielt til den primære
microcontroler, det er altså en ledning fra RxD (på tastaturets microcontroler) til TxD på den
anden, det var det rent fysiske layout.
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
linje 1 . / K l : :
linje 2
linje 3
linje 4
Program
Microcontroler
1 2 3
4 5 6
7 8 9
* 0 #
I2C kredse
”PCF8583P” og ”24C02”
El-Teknik Af: Morten Grue Sørensen
Eksamens projekt 2007 3.Y – HTX -Sønderborg
Side 23 af 31
Med hensyn til funktioner var første mål bare at få fyldt den første linje på LCD_displayet ud
som det ses i blokdiagram 1, her var det sværeste det at sikre at man sendte real data til
PCF8583P, da minutter jo ikke må være højere end 59, timer 23, dage 31 og måneder max
være 12, samt at uge dagen skal være et sted mellem 1(mandag) og 7(søndag), og hvis man
skriver noget der ikke kan lade sig gøre skal der komme en tekst på LCD_displayet som
fortæller de parametre som det næste tal skal ligge inde for, hvis der for eksempel er bliver
trykket 32 timer så skal den skrive ”timer må max være 23”, og gå tilbage så man kan skrive
timer igen, for at følge med i gennemgangen bliver man nødt til at have åbnet for
” IndStilTid-subrutine.edg” fra CDen, det er for stort til at blive kopieret ind her.
Der skal også være noget kommunikation med 24C02 EEPROMen, her skal der være en
kode, som skal skrives rigtig, som det første når man starter op, der skal også være en del med
temperaturen (er en del af det Bo Elund laver).
På næste side kan der ses et flowchart af hoveddelen, det kan også findes på CDen i mappen
”FlowC” der heder det ”Hovederutine.edg”, det er en oversigt over hvordan opstarten kører,
og derefter den løkke som kører konstant, jeg vil ikke begynde at beskrive alle subrutinerne
da det vil blive alt for lang en teknisk beskrivelse, men vil i stedet tage to vigtige subrutiner
ud, en til PCF8583P og en til 24C02, og gennemgå disse, det er ”IndStilTid” og ”Code0”.
Som det kan ses af flowchart på næste side, så er de begge en del af opstarten, og code0 bliver
også brugt hvis man skal ændre koden.
El-Teknik Af: Morten Grue Sørensen
Eksamens projekt 2007 3.Y – HTX -Sønderborg
Side 24 af 31
Start
Org 30h
Opsætning af tim er 1 til baudrate timer
Opsætning af seriel del, inklusiv interupt
Mov Flag, #00h
Mov sp, #30h
LCD_init
LCD_printstring
skriver 'Koden var forkert'
på linje 1
Hentdate
Henter dato for hvornår koden sidst blev ændret
Code0
Skriv koden - hvis den er rigtig
Fcode = 0 ellers
Fcode = 1
JB Fcode
LCD_clear
clr ES
IndStilTid
Setb ES
JNB Serbit
Serint
clr Serbit
Getdate
NOP
Hovedrutine
END
Fcode=1
Fcode=0
Serbit=1
Skrivtekst
Bo Elunds subrutine
JNB clear
Bo
Bo Elunds subrutine
Getdata
Bo Elunds subrutine
Henter TMP
Clear=1
El-Teknik Af: Morten Grue Sørensen
Eksamens projekt 2007 3.Y – HTX -Sønderborg
Side 25 af 31
IndStilTid
IndStilTid er en subrutine, som har funktionen at sende dato og tid til PCF8583P, en tid som
brugeren skal indtaste på tastaturet, mens vedkommende følger instruktionerne på LCDen.
Det første er at få kontakt med PCF8583P og få sendt en værdi til dennes kontrolregister så
timeren stopper27
, så sendes der 00h ind i 01h og 02h, og her skal brugeren så komme med
første input, på LCDen står der ”Skriv minutter, XX” og programmet afventer data fra
tastaturets serielle kommunikation, dette gøres ved at den står stille på linjen ”JNB Ri, $”, så
når der er blevet trykket det første tal ind, for eksempel et ”4” så vil den modtage det, og
skrive på displayet ” Skriv minutter, 4X”, nu venter den igen på at det næste tal skal komme
serielt, måske et ”7” når det er sket lægger den ved hjælp af bit manipulation de to tal sammen
i en 1byte, som bliver 47h, som har det format (pakke-BCD) som PCF8583P kan læse, men
før det sendes af sted bliver det set efter for om det er en real tid, altså ikke er over 59 min,
dette bliver gjort ved at udnytte en ting i funktionen ”CJNE”, hvis det for eksempel er ”CJNE
a, 60h, offset” hvis offset så er næste linje, den hopper altså lige meget hvad ned til næste
linje, så vil carryen (CY) blive sat høj hvis 60h er støre end a, men hvis a er støre eller lig med
60h så vil CY være lav, på næste linje kan man altså have en ”JC” som hvis CY er høj hopper
op til der hvor der blev skrevet ” Skriv minutter, XX”, ellers hvis den er lav gå videre til at
sende den ny verificerede reale data til PCF8583P, her efter skrives der på LCDen ”Skriv
timer som XX”, nu kører 100% samme princip igennem igen, bare hvor der til sidst bliver set
om den er over under 24h. når timerne er blevet sendt ind i 04h i PCF8583P er vi også videre
til side to af flowchart, som heder ” IndStilTid-2-subrutine.edg”, den sidste box i EDGE-
diagrammer er et link til denne, dobbelt klik på den så åbner den den næste. Her bliver der
først skrevet på LCDen ” Skriv dato som dd/mm”, denne gang skal der altså 4 tryk på
tastaturet, men det bliver set efter for om det er realt allerede når de to første er skrevet
(dagen) og så sendes det til PCF8583P, månederne sendes ikke så snart det er skrevet og
sikret at det er realt, men først skal uge dagen trykkes ind, det vil på LCDen stå ”Skriv ugedag
som X”, altså et tal mellem 1 og 7 (mandag til søndag), når ugedagen er bekræftet real skal
den ind i samme byte som måneden, da måneden ligger i den 5 LSB og ugedataen i de 3 MSB
i 06h, det er bare en masse bit manipulation, det kan ses mere præcist i flowchat eller direkte i
koden28.
27
Se ” PCF8583P-clock.pdf” – 7.11 Initialization
28
Koden kan findes i mappen ”asembler koder” i filen ”Projekt-I2C DONE.a51”, også under subrutinen
”IndStilTid”
El-Teknik Af: Morten Grue Sørensen
Eksamens projekt 2007 3.Y – HTX -Sønderborg
Side 26 af 31
Mov R1, a
I2C_shin
data fra EEPROM
Mov a, SBUF
data fra tastatur
CJNE a, R1
mov b, #8d
DJNZ b
setb Fcode
a =/ R1
a = R1
b = 0
mov a, #23h ;skriv en "#"
I2C_Ack
Clr Ri
b =/ 0
JNB Ri, $
Code0
En anden funktion som er med i det endelige produkt, er en subrutine der tjekker om man kan
den kode som ligger i EEPROMen.
Nå denne subrutine starter skriver den på LCDen ”Skriv koden:”, og forbinder sig til
EEPROMen, med START, slave adresse, Word adresse (0B0h), reSTART og så er det man
skal have fat i koden og have den sammenlignet med det der bliver skrevet på tastaturet,
koden er altid 8 tegn lang og ligger i EEPROMen fra 0B0h til 0B7h.
Sammenligningen af
koden i EEPROMen og
det der bliver trykket på
tastaturet er en løkke der
bliver gennemgået 8
gange, den løkke ser på
flowchart sådan her ud:
Først lægges ”8d” ind i
”b” sådan at løkken kun
bliver kørt 8 gange.
Den henter derefter dataen fra EEPROMen, gemmer den i R1, og venter så på at der bliver
trykket på tastaturet, henter data fra SBUF og sammenligner det der blev hentet fra
EEPROMen med det der lige er kommet fra tastaturet, hvis de er ens så trækker den en fra b
og tjekker om den er blevet 0, hvis den er det stopper subrutinen. Hvis b ikke er 0 skriver den
et ”#” for at vise at inputtet fra brugeren er forstået, og den er klar til næste ciffer i koden.
El-Teknik Af: Morten Grue Sørensen
Eksamens projekt 2007 3.Y – HTX -Sønderborg
Side 27 af 31
Hvis det den henter fra EEPROMen IKKE er lig det der kommer fra tastaturet så vil den
hoppe ud og sætte ”Fcode” høj, Fcode er det 1 bit i 20h (bit adresser bare ram adresser), og vil
så gå videre til at trække en fra b og tjekker om den er blevet nul, hvis det ikke er tilfældet vil
den skrive et ”#” og hente den næste data fra EEPROMen og være klar til næste ciffer, man
kan altså ikke se når man er i gang med at skrive koden om man har lavet fejl, og hvis man
har lavet fejl så kan man ikke bagefter se hvor og eller hvor mange man havde, da en fejl er
nok til at få sat Fcode høj, og hvis Fcode er høj når man returnerer fra Code0 så har man
skrevet koden forkert, og vil ikke komme videre (hvis det er i start op) eller få lov at ændre
koden (hvis det er det man har bedt om).
Så denne subrutine er altså 100% uafhængig. Man kan kalde den, hvis man vil have at et
område at programmet skal være beskyttet med kode, og når den er færdig med at køre Code0
kan man bare tjekke om Fcode er høj eller lav, og så hoppe der hen hvor det nu passer, alt
efter om koden var rigtig eller forkert.
Skrevet lidt mere på punkt form kan Code0’s funktion altså beskrives sådan her
Resten af subrutinerne
Jeg vil ikke gennemgå flere af de funktioner som programmet har, men der er nogle stykker
endnu, Getdate, Codeind, Gemdate, Hentdate, serint og alle de basissubrutiner til at slette
enkeltlinjer på LCDen, eller kommunikere på I2C-bussen.
Det er alle sammen funktioner som bliver brugt en eller flere gange i programmet, der er lavet
detaljerede flowcharts over dem alle, og de er i EDGE diagrammer linket sammen i en
kompleks struktur, og hvis man følger med i koden samtidig med, at man læser flowchart, så
er det ikke noget problem at sætte sig ind i deres funktioner, da der er masser af kommentarer
i koden, og link systemet i EDGE giver et godt overblik.
 Hvis koden er skrevet rigtig vil subrutinen returnere med
"Fcode" = 0
 Hvis man har tastet fejl vil subrutinen returnere med
"Fcode" = 1
El-Teknik Af: Morten Grue Sørensen
Eksamens projekt 2007 3.Y – HTX -Sønderborg
Side 28 af 31
Problemer under produktudvikling
Under udviklingen af produktet var der en række ting som gav problemer, nogle af dem er
allerede beskrevet, problemer med kun at loade reale tider i PCF8583P, men der var også
andre problemer, men de fleste af disse ”andre” problemer var nemme at løse ved hjælp af
alle de fejlrutiner som er indkodet i programmet.
Når man vælger kredse til at til slutte til sin I2C-bus skal man være meget påpasselig med at
finde nogle der ikke har samme device ID, altså samme 4 MSB i slave adressen, og lige
præcis dette problem havde jeg i lang tid, for både PCF8583P og 24C02 har 1010b som
device ID29, det er et problem som er meget nemt at overse, og fejlrutiner kan ikke sige en
hvor fejlen er da begge kredse vil svare når man skriver til 1010000Xb, så hvis den ene ikke
virker så er det næsten umuligt at se fordi den anden bare svarer.
Løsningen på dette problem er til gengæld meget nem, man skal bare lade være med at sætte
alle de variable pins til slave adressen til nul, og i stedet variere det, i det færdige produkt har
de to kredse følgende slave adresser: PCF8583P = 1010001Xb og 24C02= 1010100Xb.
29
Se datasheets ”24c02-EEPROM.pdf” side3 – og ”PCF8583P-clock.pdf” side 16 – de kan begge findes på
CDen i mappen ”Datasheets”
El-Teknik Af: Morten Grue Sørensen
Eksamens projekt 2007 3.Y – HTX -Sønderborg
Side 29 af 31
Komponent liste
 2 stk. – AT89C4051 microcontroler
 1stk. – ”dem20485syh-ly” LCD display
 1stk. – matrix tastatur
 1stk. – PCF8583P clock/calender
 1stk. – 24C02 EEPROM
 1stk. – PCF8591P A/D D/A konverter (bruges kun af Bo Elund)
 1stk. – LM358 operations forstærker (bruges kun af Bo Elund)
 1stk. – LM35 temperatur følsom transistor (bruges kun af Bo Elund)
 Diverse modstande og kondensatorer
Pris30
 2 stk. – AT89C4051 – af 15kr per stk
 1stk. – ”dem20485syh-ly” LCD display – af 160kr
 1stk. – matrix tastatur – af 80kr
 1stk. – PCF8583P clock/calender – af 12kr
 1stk. – 24C02 EEPROM – af 3kr
 1stk. – PCF8591P A/D D/A konverter – af 21kr
 1stk. – LM358 operations forstærker – af 3kr
 1stk. – LM35 temperatur følsom transistor – af 31kr
 Diverse modstande og kondensatorer – af ca. 10kr
Prisen bliver altså cirka 350kr, men så han man ikke regnet prisen for print plade med.
30
Priser er fundet på http://www.cypax.com, http://www.el-supply.dk/ eller http://dk.farnell.com/
El-Teknik Af: Morten Grue Sørensen
Eksamens projekt 2007 3.Y – HTX -Sønderborg
Side 30 af 31
Konklusion
I2C-bussen har været et spændende og interessant nyt emne at arbejde med i dette projekt, da
seriel bus kommunikation er meget brugt i den elektroniske verden, og med god grund, jeg
har fundet ud af hvor nemt og effektivt det er at arbejde med.
Produktet benytter 3 forskellige I2C-kredse, hvor jeg benytter to af dem. Det lyder måske ikke
af så meget, men hvis man skulle have tilsluttet 3 kredse gennem en parallel 8lednings-bus,
ville det have taget 28 pins på microcontroleren, nu tager det kun 2, altså 1/14 del,
hvis vi skulle have forbundet dem med en parallel bus ville det have krævet et meget større
print, og flere microcontroler.
Vi har et fuldt funktionelt produkt som har gennemgået en total debug proces, og skulle virke
uden at man kommer til at se nogle fejlmeddelelser, og uden at det skulle være muligt at
sende ikke reale tider til PCF8583P.
Under projektet er jeg nået rundt om det meste af det vi har arbejdet med af digital teknik i
løbet af undervisningen, og er kommet langt ud over det niveau som undervisningen havde
omkring assembler kodning.
Med hensyn til tværfaglighed, så er engelsk nok det mest brugte fag, da jeg har læst mellem
200 og 300 siders datasheets og kodning, samt forståelse af online instruktioner hos keil31
(bibelen, for kodning af 4051) som er på engelsk.
Med alt den omregning fra det ene talsystem til et andet er matematik også blevet en god del
af projektet.
Efter min menig er alt el-teknik på et eller andet plan fysik, så også det er med.
Dansk er indlysende hvordan det er med, da rapporten bliver skrevet på dansk.
Efter min mening har jeg også benyttet mig at psykologi, dog ikke direkte i mit projekt, men
jeg har brugt mange timer på at hjælpe andre elever med at komme videre i deres projekt, og
her har jeg gjort meget brug af det jeg har lært i psykologi om indlæring, og pædagogik.
31
http://www.keil.com/support/man/docs/is51/is51_instructions.htm
El-Teknik Af: Morten Grue Sørensen
Eksamens projekt 2007 3.Y – HTX -Sønderborg
Side 31 af 31
Kilde fortegnelse
Hjemmesider
http://hjemmesider.eucsyd.dk/vt/ - det meste af hvad Valle Thorø har lavet.
http://www.keil.com/support/man/docs/is51/is51_instructions.htm - online instruktioner fra
Keil, det er bibelen når man skal kode assembler til 4051.
http://www.alldatasheet.com/ - alle datasheets kommer her fra.
http://www.nxp.com/ - baggrundsviden om I2C bussen
http://www.esacademy.com/faq/i2c/index.htm - baggrundsviden om I2C bussen
Datasheets
I2CHowToUseIt.pdf – primær viden om kommunikation og brug af I2C-bussen.
24c02-EEPROM.pdf
89C2051-microcontroler.pdf
Dem20485syh-ly-LCD.pdf
PCF8583P-clock.pdf
PCF8591P-AD.pdf
Kan alle sammen findes på CDen i mappen ”Datasheets”

More Related Content

Viewers also liked

Joseph Lawson Dissertation
Joseph Lawson DissertationJoseph Lawson Dissertation
Joseph Lawson DissertationJoseph Lawson
 
Diplom Produktionsteknolog
Diplom ProduktionsteknologDiplom Produktionsteknolog
Diplom ProduktionsteknologSævar Gíslason
 
The Devil's Bible
The Devil's BibleThe Devil's Bible
The Devil's Biblejim hopkins
 
Parkinson´s disease, syntomas and conquenses
Parkinson´s disease, syntomas and conquenses Parkinson´s disease, syntomas and conquenses
Parkinson´s disease, syntomas and conquenses Yazlin Chaves
 
Modular operation theater by workspace solutions
Modular operation theater by workspace solutionsModular operation theater by workspace solutions
Modular operation theater by workspace solutionsAbhishek vyas
 
Interpretationofurineculture 111215200736-phpapp02
Interpretationofurineculture 111215200736-phpapp02Interpretationofurineculture 111215200736-phpapp02
Interpretationofurineculture 111215200736-phpapp02Asif Pasha
 

Viewers also liked (9)

Joseph Lawson Dissertation
Joseph Lawson DissertationJoseph Lawson Dissertation
Joseph Lawson Dissertation
 
Diplom Produktionsteknolog
Diplom ProduktionsteknologDiplom Produktionsteknolog
Diplom Produktionsteknolog
 
CV
CVCV
CV
 
Video Game Careers
Video Game CareersVideo Game Careers
Video Game Careers
 
Alexandria
AlexandriaAlexandria
Alexandria
 
The Devil's Bible
The Devil's BibleThe Devil's Bible
The Devil's Bible
 
Parkinson´s disease, syntomas and conquenses
Parkinson´s disease, syntomas and conquenses Parkinson´s disease, syntomas and conquenses
Parkinson´s disease, syntomas and conquenses
 
Modular operation theater by workspace solutions
Modular operation theater by workspace solutionsModular operation theater by workspace solutions
Modular operation theater by workspace solutions
 
Interpretationofurineculture 111215200736-phpapp02
Interpretationofurineculture 111215200736-phpapp02Interpretationofurineculture 111215200736-phpapp02
Interpretationofurineculture 111215200736-phpapp02
 

Similar to I2C-rapport

Offline Programmering - IAI
Offline Programmering - IAIOffline Programmering - IAI
Offline Programmering - IAItommyskov
 
Digital tvilling-i-urban-vandsystem
Digital tvilling-i-urban-vandsystemDigital tvilling-i-urban-vandsystem
Digital tvilling-i-urban-vandsystemEVAnetDenmark
 
Forretning og IT SKAL hænge sammen
Forretning og IT SKAL hænge sammenForretning og IT SKAL hænge sammen
Forretning og IT SKAL hænge sammenIBM Danmark
 
Google med begge benene på jorden - PPT
Google med begge benene på jorden - PPTGoogle med begge benene på jorden - PPT
Google med begge benene på jorden - PPTSik Cambon Jensen
 
boersen_nicky_xuli_2003
boersen_nicky_xuli_2003boersen_nicky_xuli_2003
boersen_nicky_xuli_2003Nicky Bass M
 

Similar to I2C-rapport (6)

Offline Programmering - IAI
Offline Programmering - IAIOffline Programmering - IAI
Offline Programmering - IAI
 
Digital tvilling-i-urban-vandsystem
Digital tvilling-i-urban-vandsystemDigital tvilling-i-urban-vandsystem
Digital tvilling-i-urban-vandsystem
 
Forretning og IT SKAL hænge sammen
Forretning og IT SKAL hænge sammenForretning og IT SKAL hænge sammen
Forretning og IT SKAL hænge sammen
 
Google med begge benene på jorden - PPT
Google med begge benene på jorden - PPTGoogle med begge benene på jorden - PPT
Google med begge benene på jorden - PPT
 
Rapport_gruppe9
Rapport_gruppe9Rapport_gruppe9
Rapport_gruppe9
 
boersen_nicky_xuli_2003
boersen_nicky_xuli_2003boersen_nicky_xuli_2003
boersen_nicky_xuli_2003
 

I2C-rapport

  • 1. I2C_Bus Eksamensprojekt 2007 i EL-Teknik Af: Morten Grue Sørensen
  • 2. El-Teknik Af: Morten Grue Sørensen Eksamens projekt 2007 3.Y – HTX -Sønderborg Side 2 af 31 Forord Denne rapport er udformet i forbindelse med eksamensprojekt på EUC-SYD, HTX- Sønderborg i teknikfaget EL-Teknik. Den valgte opgave er ”opgave 19 – Udvidelse af Micro Controler – I2C” fra de udleverede opgaver. I projektet har jeg arbejdet sammen med Bo Elund, vores samarbejde er ikke totalt da vi har lavet en meget fysisk opdeling af projektet, vi kommunikerer med forskellige kredse, men benytter os af de samme primitiver (subrutiner) så vi kan slå det sammen til sidst, og så laver vi kun et print, med alle vores kredse på, vi har også delt linjerne på displayet op før vi begyndte at kode. Sammen med rapporten vil der være en CD, hvor det vil være muligt at finde alle datasheeds, flowcharts, assembler kode (i fuld længde), print udlæg mm, generelt sagt alt baggrunds materiale for skrivning af denne rapport og udførelsen/opbygningen af produktet. Der vil på grund af CDen ikke være nogen bilag, og der vil blive henvist til materiale på CDen, der hvor det er relevant og/eller nødvendigt for forståelsen af den valgte fremgangs måde. Rapporten er skrevet med henblik på at man sidder og har CDen åben mens man læser rapporten, så man har de nødvendige referencer, da alt kode ikke er kopieret ind i Word (fylder over 22 sider på rent udskrift), og nogle af flowchartsene er så store at de heller ikke kan kopieres ind i word, så det er nødvendigt at kunne se dataen på CDen for at kunne følge med. For at læse flowcharts skal man bruge ”EDGE Diagrammer – READER” som er freeware. For mere info om ”EDGE Diagrammer” og hvordan det bliver brugt i dette projekt se Word filen ” EDGE-Diagrammer – README.doc” som ligger på CDen i root folder. Som note system vil der blive gjort brug af Office 2007 fodnotesystem, hvor noten står i bunden af siden1, her vil referencer, links eller andre former for henvisninger stå, der vil tit blive henvist til ”CDen”, her tænkes på den medfølgende CD, hvor alle flowcharts, datasheets og koder ligger. Til slut vil jeg gerne sige tak til Valle Thorø for god vejledning, til Kristen Grue Sørensen, min mor, for at have rettet rapporten for stavefejl, og Bo Elund for godt samarbejde. 1 Test af note system
  • 3. El-Teknik Af: Morten Grue Sørensen Eksamens projekt 2007 3.Y – HTX -Sønderborg Side 3 af 31
  • 4. El-Teknik Af: Morten Grue Sørensen Eksamens projekt 2007 3.Y – HTX -Sønderborg Side 4 af 31 I2C_Bus................................................................................................................................. 1 Forord................................................................................................................................ 2 Indledning.......................................................................................................................... 5 Generelt om I2C kommunikation ....................................................................................... 7 I2C kommunikations protokollen ................................................................................... 7 Basis om PCF8583P-clock/Calendar................................................................................ 10 Svagheder ved PCF8583P ............................................................................................ 12 Basis om 24C02 EEPROM .............................................................................................. 13 Svagheder ved 24C02................................................................................................... 14 Basis om AT89C4051 – microcontroler ........................................................................... 15 Produkt udvikling ................................................................................................................ 16 Fase 1 .............................................................................................................................. 16 Seriel opsætning........................................................................................................... 16 Fase 2 .............................................................................................................................. 17 Læsning af PCF8583P.................................................................................................. 19 Skrivning til PCF8583P................................................................................................ 20 Skrivning og læsning af 24C02 – EEPROM................................................................. 21 Fase 3 .............................................................................................................................. 22 IndStilTid..................................................................................................................... 25 Code0........................................................................................................................... 26 Resten af subrutinerne.................................................................................................. 27 Problemer under produktudvikling ............................................................................... 28 Komponent liste............................................................................................................... 29 Pris............................................................................................................................... 29 Konklusion .......................................................................................................................... 30 Kilde fortegnelse.............................................................................................................. 31 Hjemmesider................................................................................................................ 31 Datasheets.................................................................................................................... 31
  • 5. El-Teknik Af: Morten Grue Sørensen Eksamens projekt 2007 3.Y – HTX -Sønderborg Side 5 af 31 Indledning Før 1980 når man skulle kommunikere mellem forskellige kredse, skete det ved at slutte dem til microcontrolerens pins, dette kunne hurtigt blive til mange ledninger og kræve mange pins, det gav to problemer, prints blev meget store for at gøre plads til de mange ledninger, og man skulle have flere kredse, microcontrolers, for at kunne udvide mere, begge disse to ting gjorde det dyrere at producere og eftersom udviklingen gik imod mere komplekse systemer var det nødvendigt med en ny metode til at kommunikere mellem ICer på, og i starten af 1980erne kom Philips med en løsning, nemlig I2C, Inter Integrated Controler, som er en peripheral bus designet til at kommunikere med mange IC’er gennem kun to ledninger (Serial Data line ”SDA” og Serial Clock line ”SCL”) + stel. For at kunne kommunikere med mange enheder på kun to ledninger skulle hver enhed have en unik adresse, en slave adresse, så man kunne bestemme hvilken kreds man ville kommunikere med. Selve kommunikationen på I2C-bussen forgår i 8bit serielt mode, altså er der en naturlig begrænsning på antallet af kredse der kan tilsluttes en I2C-bus, i en 8 bit adresse ville der være 256 muligheder, men på grund af at der også skulle være mulighed for at se forskel på read og write valgte Philips at afsætte LSB til dette, så adresserne kun blev 7bit (128 muligheder)+R/W bit, så på en I2C-bus kan der max være tilsluttet 128 enheder, men hvis man ser på hvor stor en forbedring dette er, i forhold til det tidligere hvor man brugte 8 pins per kreds, så gik man fra at skulle bruge 8*128=1024pins til kun at skulle bruge 2, for at kommunikere med 128 forskellige enheder. I2C-bus2– billede1 2 Fra Kompendium ”Busser” – side 4 – af: Valle Thorø
  • 6. El-Teknik Af: Morten Grue Sørensen Eksamens projekt 2007 3.Y – HTX -Sønderborg Side 6 af 31 Der findes naturligvis andre busser, deriblandt kan nævnes µWire, SPI og USB, som alle virker på nogenlunde samme måde, hvis man ser på SPI så kommunikerer den også på to ledninger, men den skal derudover have en ekstra ledning per kredsen, til gengæld skal man ikke bruge slaveadresser, for kun kredse hvor deres ekstra pin er høj vil kunne modtage data fra bussen3. Der er også forskel på hastigheden hvormed de forskellige busser kommunikerer, I2C-bussen er en af de langsomste, i den version som bliver benyttet i dette projekt, når man ser på hvor hurtig en bus er, ser man på hvor mange bits den kan sende/modtage per sek, eller sagt på en anden måde, hvor mange Hz den kan køre med, I2C-bussen som bliver brugt i dette projekt kører op til 100 kHz, det er normal mode, men den har også en fast-mode hvor den kan køre på op til 400 kHz, men selv med en hastighed på 400 kHz er den relativ langsom i forhold til for eksempel USB der køre på mellem 2 – 12 MHz. Bus hastigheder4– billede 2 I dag er der også kommet USB 2.0, som kører 12 gange hurtigere end den gamle version som er på billede 2, men på trods af at mængden af data, som kan sendes gennem en I2C-bus i normal mode, er relativt lidt så er det rigeligt til de kommunikationsprotokoller som bliver brugt i dette projekt, da der kun sendes/modtages 8bit sekvenser, altså kan der sendes 100.000/8 = 12500bytes per sek. hvilket er mere end rigeligt. 3 Kompendium ”Busser” – af: Valle Thorø 4 Billede fra Kompendium ”Busser” – side 2 – af: Valle Thorø
  • 7. El-Teknik Af: Morten Grue Sørensen Eksamens projekt 2007 3.Y – HTX -Sønderborg Side 7 af 31 Valget af I2C bussen var naturligt da det var den som blev beskrevet i opgaven. Men i stedet for at optegne et produkt til at starte med, så var det noget med at gå ned og prøve at få kommunikationen til at virke, først på den mest simple måde, for at finde mulighederne og grænserne. Der var en række kredse til rådighed, 24c02-EEPROM (Electrically Erasable Programmable Read-Only Memory), PCF8574AP-Remote 8-bit I/O, PCF8583P-clock og PCF8591P-A/D D/A konverter, så første skridt var at finde ud af hvordan I2C-bussen fungerer. Generelt om I2C kommunikation Kommunikationen på I2C bussen forgår som 8bit serielt på SDA linjen. Dette forgår i et master/slave miljø, hvor der er en master, for det meste en micrcontroler, som styrer bussen, i mere komplekse systemer kan der være mere end en master, men for at dette kan fungere skal alle microcontrolers have en hardware I2C interface, og det har AT89C4051, som var alt hvad der var til rådighed for dette projekt, ikke, men hvis der er mere end en master tilsluttet bussen, er der et smart princip som undgår data coruption, det heder ”0 rules the bus” det vil sige i det tilfælde hvor to masters forsøger at sende data på samme tid, vil den som først sender et ”0” ud på SDA, vil ”eje” bussen indtil den har sendt et stop signal, og enhver anden master som ikke fik bussen, vil gå i en venteposition og forsøge at sende sin data når der har været et stop signal. I2C kommunikations protokollen Enhver kommunikation på I2C-bussen starter med at masteren udsender en ”START-Condition (START)” der er defineret som en ”Høj-til-Lav” SAD mens SCL er høj. I2C-Start condition5 5 Fra I2CHowToUseIt.pdf – side 3-8 – kan findes på CD’en i mappen ”Datasheets”
  • 8. El-Teknik Af: Morten Grue Sørensen Eksamens projekt 2007 3.Y – HTX -Sønderborg Side 8 af 31 En START skal altid efterfølges af en slave adresse. Slave adressen er en 8 bit adresse som består af tre dele, de første 4 – 6 bit er en fast device ID, som er hardware indkodet i hver enkelt slaveenhed, derudover er der 3 – 1 bit som også er en del af devise adressen, men disse er trukket ud som pins, så disse enten kan sluttes til høj eller lav, så man kan have mere end en af samme kreds. Den sidste bit i adressen er et READ/WRITE (R/W) bit, hvis den er lav vil man skrive, og den kreds som har slave adressen der kom i de første 7bit gør sig klar til at modtage data, hvis R/W var høj gør kredsen klar til at sende data. De 8bit som følger en START6– billede4 8-bit slave adresse (WRITE)7 – billede5 Der er også en nyere version hvor man bruger 10bit adressering, det er identisk med 7-bits adressering, bare med 3 bit mere i alle slave adresser, så man kan have 8 gange så mange kredse sluttet til bussen. Hver gang der er blevet sendt 8 bit data over I2C-busen skal den efterfølges af en ”acknowledge-bit (ACK)”, som kommer fra den der modtager data, som en bekræftelse på at dataen er modtaget korrekt, der kan også blive udsendt en ”Not acknowledge-bit (NAK)” som kan bruges til to ting, enten til at sige at det data der lige blev sendt ikke blev godkendt, eller til at stoppe en sender, en NAK skal altid følges af en ”STOP-Condition (STOP)”. ACK og NAK er bare en bit som enten er lav eller høj. For at afslutte en kommunikation på I2C-bussen skal masteren udsende en ”STOP-Condition (STOP)”, som er defineret som en ”Lav-til-Høj” SAD mens SCL er høj. 6 Fra I2CHowToUseIt.pdf – side 3-13 – kan findes på CD’en i mappen ”Datasheets” 7 Fra I2CHowToUseIt.pdf – side 3-11 – kan findes på CD’en i mappen ”Datasheets”
  • 9. El-Teknik Af: Morten Grue Sørensen Eksamens projekt 2007 3.Y – HTX -Sønderborg Side 9 af 31 Så en kommunikation på I2C-bussen kunne se sådan her ud: Et eksempel på kommunikation på I2C-busen8– billede6 Her vil man skrive noget data direkte til den slave som har den pågældende adresse, de fleste kredse kan blive ved med at modtage data indtil de modtager en STOP, men nogle få har visse begrænsninger, for eksempel så kan EEPROMen (24c02) kun modtage 8 bytes i træk9, disse begrænsninger kan man altid finde i de tilhørende datasheets. Hvis man skal have en mere kompleks kommunikation, hvis man for eksempel vil læse hvad der ligger i en bestemt ram adresse i EEPROMen, skal der først sendes en bit adresse, og så skal ser læse den data som ligger i den adressen, der skal altså først skrives til EEPROMen og derefter læses fra den, men da det er R/W biten i slaveadressen som bestemmer om der skal skrives eller læses, skal der altså sendes en slave adresse med WRITE, og så 8 bit data (bit adressen), derefter en ny slaveadresse med READ så man kan læse de data der ligger i EEPROMen, men en slaveadresse må kun komme efter en START, så der skal også sendes to START, hele kommunikationen kommer altså til at se sådan her ud: Write og Read kommunikation med en reSTART imellem10– billede7 Så man kan altså sende en ”reSTART” uden at der har været en STOP imellem, man kan teoretisk set sende lige så mange reSTART man vil for at omdefinere sin kommunikation med en bestemt kreds, hvis man vil have fat i en ny kreds skal kommunikationen med den første altid afsluttes med en STOP. 8 Fra I2CHowToUseIt.pdf – side 3-14 – kan findes på CD’en i mappen ”Datasheets” 9 Fra 24c02-EEPROM.pdf – side 3-14 – kan findes på CD’en i mappen ”Datasheets” 10 Fra I2CHowToUseIt.pdf – side 3-14 – kan findes på CD’en i mappen ”Datasheets”
  • 10. El-Teknik Af: Morten Grue Sørensen Eksamens projekt 2007 3.Y – HTX -Sønderborg Side 10 af 31 Basis om PCF8583P-clock/Calendar Den første I2C-kreds som vi vil se på er PCF8583P-clock/calendar, det er en realtime kalender, og tid, den har indbygget en 4 års komplet kalender, med skudår og alt, den har styr på hvor mange dage der er i hver måned, alt efter hvilket år det er, der er 29dage i februar i det første år, og 28 dage de tre andre år den har inde. Den har 8 pins som ser sådan her ud: ”PCF8583P-Clock/Calendar” pin udlæg og definisioner11– billede8 Her kan man se at den skal have en oscillator tilsluttet på pin 1 og 2, dette skal være et 32.768 KHz kystal. Man kan også se at der kun er en variabel adresse input, A0 på pin 3, man kan altså max have 2 af disse kredse tilsluttet en bus, den har også 6bit af dens slaveadresse som er hardware bedstemt fra fabrikantens side, disse er: Pin 7 (!INT) bruges kun hvis alarmdelen af Slave adresse for PCF8583P12– billede 9 kredsen tages i brug, det vil ikke blive yderlige beskrevet her, men man kan læse mere om den i datasheetet for PCF8583P. 11 Fra PCF8583P-clock.pdf – Side 4 – kan findes på CD’en i mappen ”Datasheets” 12 Fra PCF8583P-clock.pdf – Side 16 – kan findes på CD’en i mappen ”Datasheets”
  • 11. El-Teknik Af: Morten Grue Sørensen Eksamens projekt 2007 3.Y – HTX -Sønderborg Side 11 af 31 I PCF8583P er der et 256x8bit RAM hvor de første 16 er de ram hvor i klokken, datoen, året og alarmtidspunkter står, de sidste 240x8bit er frie ram, som der ikke vil blive arbejdet med. ude til højre ses en oversigt over rammen i PCF8583P, dem som er interessant for at holde styr på tiden er 01 til 06, og dem vil vi nu gennemgå. Hundrede del sek, sek, min og timer ligner alle sammen hinanden, der ligger to tal i pakke BCD (Binary Code Decimal), og de stiger i takt med at tiden går. I 05 ligger både dato og år, i low nibbel ligger ”1dag” i pakke BCD, men i high nibbel ligger både ”10dag” og året, hvis man gør det simpelt så starter man den altid i år 0 (af de 4) og så kan man også tage hignibbel som pakke BCD. 06 er den mest komplekse da uge dage også ligger i denne, den ser sådan her ud: Ram adresse 06 i PCF8583P13– billede10 De 3 MSB’s er uge dagen, de kan gå fra 0 til 6 (mandag til søndag), bit 4 er ”10måneder” den kan jo kun være 1 eller 0, da der ikke er over 12 måneder, og low nibbel er ”1måned” i pakke BCD. Alt fra 06 og op til 0F har så noget med alarm funktionen at gøre, hvis alarm funktionen er deaktiveret vil disse kunne bruges som ”Free RAM”. Oversigt over RAM i PCF8583P14– billede1 1 13 Fra PCF8583P-clock.pdf – Side 8 – kan findes på CD’en i mappen ”Datasheets” Diagrammer for alle tids ram adresserne 00 til 06 kan findes på side 8. 14 Fra PCF8583P-clock.pdf – Side 7 – kan findes på CD’en i mappen ”Datasheets”
  • 12. El-Teknik Af: Morten Grue Sørensen Eksamens projekt 2007 3.Y – HTX -Sønderborg Side 12 af 31 I RAM adressen 00 ligger control/status registeret. Dette register definerer hvordan kredsen arbejder, hvilke mod, og hvilke funktioner der er aktive. Hvis man starter nede fra så er de 3 første bits opsætning af alarm funktionen, hvis de bare er lave så er alarmfunktionen deaktiveret, det 3 bit hedder ”mask flag” og skal være til høj hvis man vil kunne holde styr på dato og måned, hvis den er lav kan 05 og 06 i RAMen ikke læses direkte, bit 4 og 5 definerer hvilket mode den skal køre i, der er 4 muligheder: Hvis man sætter et 32.768 KHz krystal på skal man bruge mode 00 ”Clock mode” er det mode hvor man holdet styr på tid. Oversigt over 00 Control register15 – billede12 Svagheder ved PCF8583P Der er to ting som er mindre godt ved PCF8583P kredsen, den første er at man godt kan sende ”ikke korrekte” værdier til timerregistrene, og det resulterer i at den ikke kan holde tiden, da den ikke er reale tidspunkter, hvis man sender 34h til 04 (timer) så vil den bare blive ved med at +1 til timer hver time uden at ændre dage, så hvis man loader en for stor værdi ind i vil man ødelægge den evne til at holde tiden over denne adresse. Den anden er ikke så slem, men når man skal indstille tiden skal man starte med at stoppe tiden, dette gøres ved at sætte MSB i control register høj, dette skal gøres før man begynder at ændre tiden, og den skal selvfølgelig sættes lav igen når man er færdig med at indstille kredsen. 15 Fra PCF8583P-clock.pdf – Side 6 – kan findes på CD’en i mappen ”Datasheets”
  • 13. El-Teknik Af: Morten Grue Sørensen Eksamens projekt 2007 3.Y – HTX -Sønderborg Side 13 af 31 Basis om 24C02 EEPROM EEPROM (Electrically Erasable Programmable Read-Only Memory), har 2k bits memory, og den er garanteret 1 million slet/skrive cyklusser med garanti på at dataen bliver der i minimum 40år. Pin udlæg for 42C02 – EEPROM16– billede13 Som det kan ses har 24C02 8 pins, 3xdevice adresse pins, E0 til E2, og en MODE pin, som bestemmer om den skal køre i ”multibyte mode” eller ”page wirte mode”. Fra 24C02 kan man læse og skrive data på 6 forskellige måder, det er ”Current Address Read”, ”Random Address Read”, ”Sequential Read”, ”Byte Write”, ”Multibyte Write” og ”Page Write”, de to som er mest brugbare er ” Random Address Read/ Sequential Read” og ”Page Write”, da disse er der hvor man kan læse / skrive mere end en byte til EEPROMen. oversigt over forskellige kommunikations typer med 42C0217– billede14 Som det kan ses fra denne tabel så kan man max skrive 8byte af gangen med page write, dette skal man huske at tage højde for. Der er også en anden ting som er specielt ved page write, nemlig det at den ikke skriver dataen når den modtager den, men først når den får en STOP begynder den at skrive til memory, så længe den er i gang med en write cyklus, vil kredsen ikke svare på nogen forspørgsler. 16 Fra ” 24c02-EEPROM.pdf” – side 2 – kan findes på CD’en i mappen ”Datasheets” 17 Fra ” 24c02-EEPROM.pdf” – side 3 – kan findes på CD’en i mappen ”Datasheets”
  • 14. El-Teknik Af: Morten Grue Sørensen Eksamens projekt 2007 3.Y – HTX -Sønderborg Side 14 af 31 EEPROMen har lige som alle andre I2C-kredse en ”device code” som er de 4 MSB’s i slave adressen, for alle EEPROMs af denne typpe er denne: 24C02 slave adresse18– billede15 Den har altså 3 variable bit i sin slave adresse, hvilket giver mulighed for op til 8x2K bit = 16K bits memory som man maksimalt kan have tilsluttet en I2C-bus på en gang. Kommunikations protokol for skrivning til 24C0219– billede16 Her ses kommunikationsprotokollen for 24C02 EEPROM, når man vil skrive til den, er bare vigtigt man husker ”N” må max være 8. Kommunikations protokol for læsning af 24C0220 – billede17 Når man læser kan man læse alle 256 byets i streg, uden at man behøver at gøre noget specielt ved det, man skal dog lægge mærke til, at man skal bruge reSTART funktionen hvis man vil starte et andet sted end 00. 24C02 har som standart alle ram adresser fyldt med FFh. Svagheder ved 24C02 Selv om denne kreds har rigtig meget plads, så tager det meget lang tid (nogle ms) at skrive data, selv om den kun kan modtage 8 bytes af gangen hvilket også hurtigt kan visse sig at være for lidt. 18 Fra ” 24c02-EEPROM.pdf” – side 3 – kan findes på CD’en i mappen ”Datasheets” 19 Fra ” 24c02-EEPROM.pdf” – side 10 – kan findes på CD’en i mappen ”Datasheets” 20 Fra ” 24c02-EEPROM.pdf” – side 12 – kan findes på CD’en i mappen ”Datasheets”
  • 15. El-Teknik Af: Morten Grue Sørensen Eksamens projekt 2007 3.Y – HTX -Sønderborg Side 15 af 31 Basis om AT89C4051 – microcontroler Nu har vi set på to forskellige kredse, PCF8583P og 24C02, som begge er slaves, men for at have en funktionel I2C-bus skal der være en master til at ”styre slagets gang”, en som kan sende START og STOP, og som kan læse, skrive og behandle data fra I2C-bussen, til dette formål ser vi på ATMEL AT89C4051 microcontroler, som dog ikke er den optimale microcontroler til I2C-kommunikation da den ikke har noget I2C hardware interface, men man er nødt til selv at skrive et software interface, hvilket fjerner muligheden for at have mere end en master på bussen. AT89C4051 har 20 pins, som er delt op i to porte P1 og P3, og så er der to porte til at sætte et krystal på, mange af portene har ud over at være den del af enten P1 eller P3 en anden funktion som for eksempel P3.1 er også det pin hvor microcontroleren kan modtage data serielt fra en anden microcontroler. Pin oversigt for AT89C405121 billede18 AT89C4051 har 4Kb FLASH memory, som kan programmeres, dette kan gøres med assembler, C++, basic eller et andet sprog, det vigtige er at man har en kompiler som kan lave det om til 8 bit maskinkode, som så kan brandes ind i microcontroleren, der vil kun blive arbejdet med assembler i denne gennemgang. Gennem I2C software interface til microcontroleren vil P3.5 fungere som SCL og P3.7 som SDA.22 Microcontroleren har et utal af andre muligheder som ikke er nødvendige at kommer nærmere ind på, for at have mulighed for at forstå og benytte AT89C4051, hvis man vil have mere information om microcontroleren så kan det findes på den vedlagte CD, der ligger datasheet og et støre kompendium skrevet af Valle Thorø, som heder ”89C2051 kompendium.doc”. 21 Fra ”89C2051-microcontroler.pdf” – side 2 – kan findes på CDen i mappen ”Datasheets” 22 Software interface er kopieret fra http://hjemmesider.eucsyd.dk/vt/El_rammer/Kodegenerator.htm
  • 16. El-Teknik Af: Morten Grue Sørensen Eksamens projekt 2007 3.Y – HTX -Sønderborg Side 16 af 31 Produkt udvikling Fra opgave 19 var der ikke rigtig defineret et produkt, og der var ikke lagt op til produktionen af et meget anvendeligt produkt, men mere til, at man arbejdede med det og lavede nogle funktioner som udnyttede fordelene ved I2C-bussen. Da alt om I2C-bussen var nyt, var tilgangen til udvikling af et produkt ikke som man ”normalt” gør, men det var noget med at starte med at få testet hvad der var af muligheder i arbejdet med I2C-bussen. Fase 1 Før man kan komme i gang med at arbejde med I2C-bussen skal man have en eller anden form for visualisering af, om det man laver virker, så det første er ikke at begynde at sætte en I2C-bus op og smide nogle kredse på den, først skal man have et display af en art til at virke, her kan man for eksempel tage et ”dem20485syh-ly” som er et 4x20 LCD-display, til kommunikation med dette har Valle Thorø lavet en række subrutiner som er meget nemme at bruge og ikke er nødvendige at sætte sig ind i, andet end at de virker, de kan kendes i koden ved at de alle sammen starter med ”LCD_”. Seriel opsætning Der skal også være en form for input, et tastatur af en art så man kan få et input, her er en selvstændig tastaturkreds med egen microcontroler at fortrække, da det giver mulighed for at køre det for sig selv, uden at det kommer til at forstyrre andre ting på hoved microcontroleren, og så er der også den ting med pins, da et tastatur med 12 knapper skal bruge 7 pins så kan man hurtigt få optaget sine pins. Til kommunikation mellem tastatur-microcontroler og hoved microcontroler skal der opsættes en seriel del, som er indbygget i AT89C4051, det kræver kun en ledning mellem de to microcontrolere og en opsætning af timer 1 til baudrate timer, dette skal gøres på begge microcontrolerne, det kræver ikke så meget opsætning: Hvor at Baudrate er 0E8H, som er ca. 1200 bit/s ved et 12MHz krystal.
  • 17. El-Teknik Af: Morten Grue Sørensen Eksamens projekt 2007 3.Y – HTX -Sønderborg Side 17 af 31 Ud over opsætning af timer 1 til baudrate timer skal selve den serielle del også sættes op, sammen med det serielle interrupt, det er også meget nemt: Her bliver det serielle interrupt godt nok deaktiveret, men det er kun for at der er mulighed for at udnytte den serielle kommunikation på en anden måde, hvis man her i starten bare skal have det serielle interrupt til at køre så er det bare at skifte ”clr” ud med ”Setb”. Den serielle interrupt vektor ligger på 23h, det vil sige at hver gang der kommer et serielt interrupt så vil programmet, lige meget hvad det laver, hoppe hen og udføre den kode der står ved 23h, det kan for eksempel være at sætte et bit højt, eller kalde en subrutine. Nu er der altså mulighed for at skrive noget på tastaturet og så se det oppe på LCD-displayet, vi har altså en visuel måde at se hvad der sker, og vi har en form for input. Nu kan vi begynde at sætte I2C-bussen op. Fase 2 Indtil nu har det bare været opsætning og afprøvning af allerede kendte tekniker, ting som er blevet gennemgået i undervisningen. Nu skal I2C-bussen opsættes, I2C-bussen er jo reelt set to ledninger, som man kan forbinde kredse til, men den skal også have en pull-up modstand tilsluttet både SDA og SCL, og der skal en modstand mellem bussen og hver enkelt kreds, både til SDA og SCL, disse er der for at beskytte kredsene mod pludselige spændingsændringer, dette vil meget sjældent blive et problem, men da de ikke gør noget skade er det altid en god ide at have dem med. Disse modstande skal dimensioneres efter hinanden, dette er ikke specielt indviklet da der i det datasheet som Philips har udgivet om I2C er nogle grafer der viser sammenhængene.
  • 18. El-Teknik Af: Morten Grue Sørensen Eksamens projekt 2007 3.Y – HTX -Sønderborg Side 18 af 31 Dimensionering af modstande til beskyttelse af I2C-bus og kredse23- billede19 Her kan det nemt og hurtigt aflæse hvor store Rp og Rs skal være, dette er første trin i at få I2C kommunikationen til at virke. Nu er det bare at få sluttet en kreds til og få noget kommunikation i gang, lad os starte med at smide PCF8583P-clock/calender kredsen på bussen. Her skal man til at forstå at bruge I2C-kommunikationsprotokollen i praksis, men kan skal virkelig have lavet en logisk kode hvis man skal have det til at virke. Det første mål er bare at få noget data fra PCF8583P, ikke noget med at indstille tiden eller alt muligt andet, bare hente sek og 10/sek ud, og visse dem på displayet.24 Hvis vi ser på nogle udpluk af koden til at hente sek ud og få dem op på LCDen. 23 Fra ”I2CHowToUseIt.pdf – side 3-17 – kan findes på CD’en i mappen ”Datasheets”. 24 Jeg vil ikke kopiere hele koden til dette ind, men det kan findes på CDen i mappen ”assembler koder” i filen ”tid fra kaldender, 1s+0,1s.a51” som kan læsses med notesblok, men Keil er at fortrække (farve koder).
  • 19. El-Teknik Af: Morten Grue Sørensen Eksamens projekt 2007 3.Y – HTX -Sønderborg Side 19 af 31 Læsning af PCF8583P Først er det at få startet bussen op og få kaldt kredsens slave adresse og sagt hvilken adresse man vil læse, og så skal man jo have data fra PCF8583P, altså skal der sendes en reSTART, så man igen kan sende slave adressen, denne gang bare med ”READ” på det 8 bit. Som man kan se i denne lille stump kode, så er der indlagt en række fejlrutiner, som gør at man er i stand til at finde ud af hvor i ens kode fejlen er opstået hvis den ikke virker, men for at kunne lave disse fejltjek på kommunikationen, må man først have en basisforståelse for de subrutiner der udgør det software interface som bliver brugt, der har rutinerne ”I2C_START” og ”I2C_shout” nemlig indbygget en tjek af om bussen er til stede og den pågældende kreds svarer tilbage med det 9. bit ACK. Til at melde fejl bruger disse subrutiner carry (CY) eller bare ”c”, som hvis de er høje når subrutinen returnerer, vil betyde at de IKKE fik svar fra kredsen, og dermed har man enten ikke fat i kredsen ellers vil/kan den ikke modtage data på det pågældende tidspunkt.25 Efter der er blevet taget kontakt til PCF8583P og den har svaret og reSTART er sendt, så skal man modtage data dette gøres med Som det kan ses fra kommentaren i koden ligger både 10/s og 100/s nu i a, men vi skal kun have fat i 10/s, som ligger i de 4 MSB’s, altså skal der laves noget bitmanipulation, også fordi vi skal have lavet tallet om til et tal som LCDen kan skrive, der skal altså omformes til ”ascII” (Amarican Standart Code for Information Interchange). Og det gentages så med at hente ny data med ”I2C_shin”, og lave bitmanipulation, man kan bare kalde ”I2C_shin” igen da word adressen automatisk er blevet en højere. 25 Se Flowchart ”I2C_Shout_Shin-subrutine.edg” og ”I2C_start_stop-subrutine.edg” som kan findes på CDen i mappen ”FlowC” – Åbnes med EDGE diagrammer READER, ligger på CDen.
  • 20. El-Teknik Af: Morten Grue Sørensen Eksamens projekt 2007 3.Y – HTX -Sønderborg Side 20 af 31 Skrivning til PCF8583P Det næste skridt er at kunne skrive noget til PCF8583P, så man kan fortælle den hvad klokken og datoen er når man starter den, dette skal gennemarbejdes i to faser, en hvor man bare sender, og en hvor man sikrer, at man sender det rigtige, altså kun muligheder som er reale, man skal ikke kunne sige at klokken lige nu er ”man. 33/14 kl: 55:82”, men den sidste del med at sikre at dataen er korrekt, vil der blive set på senere. Hvis man skal indstille tiden så vil vi ikke til at fortælle den noget om 100/s 10/s eller sek, men vi skal ikke gå længere ”ned” end til minutter. For at sende data til en kreds er det meget vigtig at man er helt klar over hvordan dataen skal ligge i kredsen for at den kan forstå det. Først skal man bare lige have fat i kredsen med START og slave adresse, så skal man vælge Word adresse, og her bliver man nødt til at vælge 00h da man skal have sat timeren i stå og dette gøres gennem den MSB i kontrol registeret 00h26. Nu er der så to muligheder for at komme videre til Word adresse 03h hvor minutter skal ligge, enten kan man sende 00h ud to gange så Word adressen automatisk bliver forhøjet indtil man er på 03h, eller man kan sende en reSTART og definere Word adressen til 03h. Når man er i 03h skal man have mulighed for at skrive på tastaturet hvilket minut tal det er lige nu, man skal altså have et (to da min bestå af to tal, et for 10min og et for 1min) input fra tastaturet (seriel) og sende det ud til PCF8583P, og man skal, når man først har trykket 10min, kunne se det man har trykket på displayet, det kan se sådan her ud: Nu har man modtaget de to input for min, og gennem en smule bitmanipulation, har man fået den gemt i en 1byte i pakke BCD, lige sådan som de skal ligge i PCF8583P, ud over det har man skrevet dem på displayet, nu er der bare tilbage at sende dataen til PCF8583P 26 Se ” PCF8583P-clock.pdf” – 7.11 Initialization
  • 21. El-Teknik Af: Morten Grue Sørensen Eksamens projekt 2007 3.Y – HTX -Sønderborg Side 21 af 31 Når man har fået det her til at virke er resten meget nemt, da kommunikationen er den samme, det eneste der skal ændres på at bitmanipuleringen, for at se et flowchart over indstilling af tiden så se på CDen i mappen ”FlowC”, der er ”IndStilTid-subrutine.edg” og ”IndStilTid-2- subrutine.edg” (flowchartet fyldet to sider) som er det samlede flowchart til indstilling af tid og dato, der er også tjek af om den sendte data er real. Skrivning og læsning af 24C02 – EEPROM Nu da kommunikation med PCF8583P er på plads skal man også have set lidt på den anden kreds på bussen, nemlig EEPROMen 24c02, den er lidt mere simpel da den ikke har en aktiv funktion, men en passiv, den skal modtage data når den får det at vide og gemme det indtil man spørger efter det, den skal ikke ændre på noget data. Før vi har noget at læse må vi skrive noget til EEPROMen, dette er meget nemt, først sender man start + slave (Write) og så den Word adresse hvori man vil gemme sin data, og så er det bare at sende dataen, dog max 8 byte da det er alt hvad den kan klare af gangen, og her er det meget vigtig at slutte af med en STOP, da dataen først bliver skrevet ind i EEPROMen når den modtager en STOP. Nu ligger der altså noget vi har trykket på tastaturet i 0B0h i EEPROMen, igen ser vi at fejl rutinerne er gode at have med, så man kan se hvis der gå noget galt et sted.
  • 22. El-Teknik Af: Morten Grue Sørensen Eksamens projekt 2007 3.Y – HTX -Sønderborg Side 22 af 31 Hvis vi nu vil læse det vi har skrevet til EEPROMen, så gøres det sådan her: Fase 3 Først når dette virker, har man viden nok om de kredse der bliver arbejdet med, og om kommunikationen på I2C-bussen, til at kunne lave nogle blokdiagrammer over hvad man gerne vil ende op med som produkt. LCD_Display Tastatur Seriel Opdeling – Blokdiagram 1 Der skal altså være 4 blokke, som skal laves på to prints, et tastatur print, og et display/I2C print hvor den primære microcontroler skal sidde, de to print skal kun være forbundet af en enkelt ledning, så microcontroleren på tastaturet kan sende serielt til den primære microcontroler, det er altså en ledning fra RxD (på tastaturets microcontroler) til TxD på den anden, det var det rent fysiske layout. 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 linje 1 . / K l : : linje 2 linje 3 linje 4 Program Microcontroler 1 2 3 4 5 6 7 8 9 * 0 # I2C kredse ”PCF8583P” og ”24C02”
  • 23. El-Teknik Af: Morten Grue Sørensen Eksamens projekt 2007 3.Y – HTX -Sønderborg Side 23 af 31 Med hensyn til funktioner var første mål bare at få fyldt den første linje på LCD_displayet ud som det ses i blokdiagram 1, her var det sværeste det at sikre at man sendte real data til PCF8583P, da minutter jo ikke må være højere end 59, timer 23, dage 31 og måneder max være 12, samt at uge dagen skal være et sted mellem 1(mandag) og 7(søndag), og hvis man skriver noget der ikke kan lade sig gøre skal der komme en tekst på LCD_displayet som fortæller de parametre som det næste tal skal ligge inde for, hvis der for eksempel er bliver trykket 32 timer så skal den skrive ”timer må max være 23”, og gå tilbage så man kan skrive timer igen, for at følge med i gennemgangen bliver man nødt til at have åbnet for ” IndStilTid-subrutine.edg” fra CDen, det er for stort til at blive kopieret ind her. Der skal også være noget kommunikation med 24C02 EEPROMen, her skal der være en kode, som skal skrives rigtig, som det første når man starter op, der skal også være en del med temperaturen (er en del af det Bo Elund laver). På næste side kan der ses et flowchart af hoveddelen, det kan også findes på CDen i mappen ”FlowC” der heder det ”Hovederutine.edg”, det er en oversigt over hvordan opstarten kører, og derefter den løkke som kører konstant, jeg vil ikke begynde at beskrive alle subrutinerne da det vil blive alt for lang en teknisk beskrivelse, men vil i stedet tage to vigtige subrutiner ud, en til PCF8583P og en til 24C02, og gennemgå disse, det er ”IndStilTid” og ”Code0”. Som det kan ses af flowchart på næste side, så er de begge en del af opstarten, og code0 bliver også brugt hvis man skal ændre koden.
  • 24. El-Teknik Af: Morten Grue Sørensen Eksamens projekt 2007 3.Y – HTX -Sønderborg Side 24 af 31 Start Org 30h Opsætning af tim er 1 til baudrate timer Opsætning af seriel del, inklusiv interupt Mov Flag, #00h Mov sp, #30h LCD_init LCD_printstring skriver 'Koden var forkert' på linje 1 Hentdate Henter dato for hvornår koden sidst blev ændret Code0 Skriv koden - hvis den er rigtig Fcode = 0 ellers Fcode = 1 JB Fcode LCD_clear clr ES IndStilTid Setb ES JNB Serbit Serint clr Serbit Getdate NOP Hovedrutine END Fcode=1 Fcode=0 Serbit=1 Skrivtekst Bo Elunds subrutine JNB clear Bo Bo Elunds subrutine Getdata Bo Elunds subrutine Henter TMP Clear=1
  • 25. El-Teknik Af: Morten Grue Sørensen Eksamens projekt 2007 3.Y – HTX -Sønderborg Side 25 af 31 IndStilTid IndStilTid er en subrutine, som har funktionen at sende dato og tid til PCF8583P, en tid som brugeren skal indtaste på tastaturet, mens vedkommende følger instruktionerne på LCDen. Det første er at få kontakt med PCF8583P og få sendt en værdi til dennes kontrolregister så timeren stopper27 , så sendes der 00h ind i 01h og 02h, og her skal brugeren så komme med første input, på LCDen står der ”Skriv minutter, XX” og programmet afventer data fra tastaturets serielle kommunikation, dette gøres ved at den står stille på linjen ”JNB Ri, $”, så når der er blevet trykket det første tal ind, for eksempel et ”4” så vil den modtage det, og skrive på displayet ” Skriv minutter, 4X”, nu venter den igen på at det næste tal skal komme serielt, måske et ”7” når det er sket lægger den ved hjælp af bit manipulation de to tal sammen i en 1byte, som bliver 47h, som har det format (pakke-BCD) som PCF8583P kan læse, men før det sendes af sted bliver det set efter for om det er en real tid, altså ikke er over 59 min, dette bliver gjort ved at udnytte en ting i funktionen ”CJNE”, hvis det for eksempel er ”CJNE a, 60h, offset” hvis offset så er næste linje, den hopper altså lige meget hvad ned til næste linje, så vil carryen (CY) blive sat høj hvis 60h er støre end a, men hvis a er støre eller lig med 60h så vil CY være lav, på næste linje kan man altså have en ”JC” som hvis CY er høj hopper op til der hvor der blev skrevet ” Skriv minutter, XX”, ellers hvis den er lav gå videre til at sende den ny verificerede reale data til PCF8583P, her efter skrives der på LCDen ”Skriv timer som XX”, nu kører 100% samme princip igennem igen, bare hvor der til sidst bliver set om den er over under 24h. når timerne er blevet sendt ind i 04h i PCF8583P er vi også videre til side to af flowchart, som heder ” IndStilTid-2-subrutine.edg”, den sidste box i EDGE- diagrammer er et link til denne, dobbelt klik på den så åbner den den næste. Her bliver der først skrevet på LCDen ” Skriv dato som dd/mm”, denne gang skal der altså 4 tryk på tastaturet, men det bliver set efter for om det er realt allerede når de to første er skrevet (dagen) og så sendes det til PCF8583P, månederne sendes ikke så snart det er skrevet og sikret at det er realt, men først skal uge dagen trykkes ind, det vil på LCDen stå ”Skriv ugedag som X”, altså et tal mellem 1 og 7 (mandag til søndag), når ugedagen er bekræftet real skal den ind i samme byte som måneden, da måneden ligger i den 5 LSB og ugedataen i de 3 MSB i 06h, det er bare en masse bit manipulation, det kan ses mere præcist i flowchat eller direkte i koden28. 27 Se ” PCF8583P-clock.pdf” – 7.11 Initialization 28 Koden kan findes i mappen ”asembler koder” i filen ”Projekt-I2C DONE.a51”, også under subrutinen ”IndStilTid”
  • 26. El-Teknik Af: Morten Grue Sørensen Eksamens projekt 2007 3.Y – HTX -Sønderborg Side 26 af 31 Mov R1, a I2C_shin data fra EEPROM Mov a, SBUF data fra tastatur CJNE a, R1 mov b, #8d DJNZ b setb Fcode a =/ R1 a = R1 b = 0 mov a, #23h ;skriv en "#" I2C_Ack Clr Ri b =/ 0 JNB Ri, $ Code0 En anden funktion som er med i det endelige produkt, er en subrutine der tjekker om man kan den kode som ligger i EEPROMen. Nå denne subrutine starter skriver den på LCDen ”Skriv koden:”, og forbinder sig til EEPROMen, med START, slave adresse, Word adresse (0B0h), reSTART og så er det man skal have fat i koden og have den sammenlignet med det der bliver skrevet på tastaturet, koden er altid 8 tegn lang og ligger i EEPROMen fra 0B0h til 0B7h. Sammenligningen af koden i EEPROMen og det der bliver trykket på tastaturet er en løkke der bliver gennemgået 8 gange, den løkke ser på flowchart sådan her ud: Først lægges ”8d” ind i ”b” sådan at løkken kun bliver kørt 8 gange. Den henter derefter dataen fra EEPROMen, gemmer den i R1, og venter så på at der bliver trykket på tastaturet, henter data fra SBUF og sammenligner det der blev hentet fra EEPROMen med det der lige er kommet fra tastaturet, hvis de er ens så trækker den en fra b og tjekker om den er blevet 0, hvis den er det stopper subrutinen. Hvis b ikke er 0 skriver den et ”#” for at vise at inputtet fra brugeren er forstået, og den er klar til næste ciffer i koden.
  • 27. El-Teknik Af: Morten Grue Sørensen Eksamens projekt 2007 3.Y – HTX -Sønderborg Side 27 af 31 Hvis det den henter fra EEPROMen IKKE er lig det der kommer fra tastaturet så vil den hoppe ud og sætte ”Fcode” høj, Fcode er det 1 bit i 20h (bit adresser bare ram adresser), og vil så gå videre til at trække en fra b og tjekker om den er blevet nul, hvis det ikke er tilfældet vil den skrive et ”#” og hente den næste data fra EEPROMen og være klar til næste ciffer, man kan altså ikke se når man er i gang med at skrive koden om man har lavet fejl, og hvis man har lavet fejl så kan man ikke bagefter se hvor og eller hvor mange man havde, da en fejl er nok til at få sat Fcode høj, og hvis Fcode er høj når man returnerer fra Code0 så har man skrevet koden forkert, og vil ikke komme videre (hvis det er i start op) eller få lov at ændre koden (hvis det er det man har bedt om). Så denne subrutine er altså 100% uafhængig. Man kan kalde den, hvis man vil have at et område at programmet skal være beskyttet med kode, og når den er færdig med at køre Code0 kan man bare tjekke om Fcode er høj eller lav, og så hoppe der hen hvor det nu passer, alt efter om koden var rigtig eller forkert. Skrevet lidt mere på punkt form kan Code0’s funktion altså beskrives sådan her Resten af subrutinerne Jeg vil ikke gennemgå flere af de funktioner som programmet har, men der er nogle stykker endnu, Getdate, Codeind, Gemdate, Hentdate, serint og alle de basissubrutiner til at slette enkeltlinjer på LCDen, eller kommunikere på I2C-bussen. Det er alle sammen funktioner som bliver brugt en eller flere gange i programmet, der er lavet detaljerede flowcharts over dem alle, og de er i EDGE diagrammer linket sammen i en kompleks struktur, og hvis man følger med i koden samtidig med, at man læser flowchart, så er det ikke noget problem at sætte sig ind i deres funktioner, da der er masser af kommentarer i koden, og link systemet i EDGE giver et godt overblik.  Hvis koden er skrevet rigtig vil subrutinen returnere med "Fcode" = 0  Hvis man har tastet fejl vil subrutinen returnere med "Fcode" = 1
  • 28. El-Teknik Af: Morten Grue Sørensen Eksamens projekt 2007 3.Y – HTX -Sønderborg Side 28 af 31 Problemer under produktudvikling Under udviklingen af produktet var der en række ting som gav problemer, nogle af dem er allerede beskrevet, problemer med kun at loade reale tider i PCF8583P, men der var også andre problemer, men de fleste af disse ”andre” problemer var nemme at løse ved hjælp af alle de fejlrutiner som er indkodet i programmet. Når man vælger kredse til at til slutte til sin I2C-bus skal man være meget påpasselig med at finde nogle der ikke har samme device ID, altså samme 4 MSB i slave adressen, og lige præcis dette problem havde jeg i lang tid, for både PCF8583P og 24C02 har 1010b som device ID29, det er et problem som er meget nemt at overse, og fejlrutiner kan ikke sige en hvor fejlen er da begge kredse vil svare når man skriver til 1010000Xb, så hvis den ene ikke virker så er det næsten umuligt at se fordi den anden bare svarer. Løsningen på dette problem er til gengæld meget nem, man skal bare lade være med at sætte alle de variable pins til slave adressen til nul, og i stedet variere det, i det færdige produkt har de to kredse følgende slave adresser: PCF8583P = 1010001Xb og 24C02= 1010100Xb. 29 Se datasheets ”24c02-EEPROM.pdf” side3 – og ”PCF8583P-clock.pdf” side 16 – de kan begge findes på CDen i mappen ”Datasheets”
  • 29. El-Teknik Af: Morten Grue Sørensen Eksamens projekt 2007 3.Y – HTX -Sønderborg Side 29 af 31 Komponent liste  2 stk. – AT89C4051 microcontroler  1stk. – ”dem20485syh-ly” LCD display  1stk. – matrix tastatur  1stk. – PCF8583P clock/calender  1stk. – 24C02 EEPROM  1stk. – PCF8591P A/D D/A konverter (bruges kun af Bo Elund)  1stk. – LM358 operations forstærker (bruges kun af Bo Elund)  1stk. – LM35 temperatur følsom transistor (bruges kun af Bo Elund)  Diverse modstande og kondensatorer Pris30  2 stk. – AT89C4051 – af 15kr per stk  1stk. – ”dem20485syh-ly” LCD display – af 160kr  1stk. – matrix tastatur – af 80kr  1stk. – PCF8583P clock/calender – af 12kr  1stk. – 24C02 EEPROM – af 3kr  1stk. – PCF8591P A/D D/A konverter – af 21kr  1stk. – LM358 operations forstærker – af 3kr  1stk. – LM35 temperatur følsom transistor – af 31kr  Diverse modstande og kondensatorer – af ca. 10kr Prisen bliver altså cirka 350kr, men så han man ikke regnet prisen for print plade med. 30 Priser er fundet på http://www.cypax.com, http://www.el-supply.dk/ eller http://dk.farnell.com/
  • 30. El-Teknik Af: Morten Grue Sørensen Eksamens projekt 2007 3.Y – HTX -Sønderborg Side 30 af 31 Konklusion I2C-bussen har været et spændende og interessant nyt emne at arbejde med i dette projekt, da seriel bus kommunikation er meget brugt i den elektroniske verden, og med god grund, jeg har fundet ud af hvor nemt og effektivt det er at arbejde med. Produktet benytter 3 forskellige I2C-kredse, hvor jeg benytter to af dem. Det lyder måske ikke af så meget, men hvis man skulle have tilsluttet 3 kredse gennem en parallel 8lednings-bus, ville det have taget 28 pins på microcontroleren, nu tager det kun 2, altså 1/14 del, hvis vi skulle have forbundet dem med en parallel bus ville det have krævet et meget større print, og flere microcontroler. Vi har et fuldt funktionelt produkt som har gennemgået en total debug proces, og skulle virke uden at man kommer til at se nogle fejlmeddelelser, og uden at det skulle være muligt at sende ikke reale tider til PCF8583P. Under projektet er jeg nået rundt om det meste af det vi har arbejdet med af digital teknik i løbet af undervisningen, og er kommet langt ud over det niveau som undervisningen havde omkring assembler kodning. Med hensyn til tværfaglighed, så er engelsk nok det mest brugte fag, da jeg har læst mellem 200 og 300 siders datasheets og kodning, samt forståelse af online instruktioner hos keil31 (bibelen, for kodning af 4051) som er på engelsk. Med alt den omregning fra det ene talsystem til et andet er matematik også blevet en god del af projektet. Efter min menig er alt el-teknik på et eller andet plan fysik, så også det er med. Dansk er indlysende hvordan det er med, da rapporten bliver skrevet på dansk. Efter min mening har jeg også benyttet mig at psykologi, dog ikke direkte i mit projekt, men jeg har brugt mange timer på at hjælpe andre elever med at komme videre i deres projekt, og her har jeg gjort meget brug af det jeg har lært i psykologi om indlæring, og pædagogik. 31 http://www.keil.com/support/man/docs/is51/is51_instructions.htm
  • 31. El-Teknik Af: Morten Grue Sørensen Eksamens projekt 2007 3.Y – HTX -Sønderborg Side 31 af 31 Kilde fortegnelse Hjemmesider http://hjemmesider.eucsyd.dk/vt/ - det meste af hvad Valle Thorø har lavet. http://www.keil.com/support/man/docs/is51/is51_instructions.htm - online instruktioner fra Keil, det er bibelen når man skal kode assembler til 4051. http://www.alldatasheet.com/ - alle datasheets kommer her fra. http://www.nxp.com/ - baggrundsviden om I2C bussen http://www.esacademy.com/faq/i2c/index.htm - baggrundsviden om I2C bussen Datasheets I2CHowToUseIt.pdf – primær viden om kommunikation og brug af I2C-bussen. 24c02-EEPROM.pdf 89C2051-microcontroler.pdf Dem20485syh-ly-LCD.pdf PCF8583P-clock.pdf PCF8591P-AD.pdf Kan alle sammen findes på CDen i mappen ”Datasheets”