Transcript
Departement Industriële Wetenschappen en Technologie Opleiding bachelor in de elektronica-ICT Afstudeerrichting elektronica
Aansturen LED display via art-net
Eindwerk aangeboden tot het behalen van het diploma van bachelor in de elektronica-ICT door
Kris Sabbe
o.l.v. Kristof Soreyn, XL-holding
GeertVandecasteele ,KHBO Academiejaar 2007 - 2008
talent@work KHBO Campus Oostende ● Zeedijk 101 ● B-8400 Oostende ● Tel. +32 59 56 90 00 ● Fax +32 59 56 90 01 ● www.khbo.be
Departement Industriële Wetenschappen en Technologie Opleiding bachelor in de elektronica-ICT Afstudeerrichting elektronica
Aansturen LED display via art-net
Eindwerk aangeboden tot het behalen van het diploma van bachelor in de elektronica-ICT door
Kris Sabbe
o.l.v. Kristof Soreyn, XL-holding
GeertVandecasteele ,KHBO Academiejaar 2007 - 2008
talent@work KHBO Campus Oostende ● Zeedijk 101 ● B-8400 Oostende ● Tel. +32 59 56 90 00 ● Fax +32 59 56 90 01 ● www.khbo.be
Mededeling
Deze eindverhandeling was een examen. De tijdens de verdediging vastgestelde fouten werden niet gecorrigeerd. Gebruik als referentie in publicaties is toegelaten na gunstig advies van de KHBO‐promotor, vermeld op het titelblad.
Woord vooraf
Bij het verwezenlijken van dit eindwerk werd ik bijgestaan door een aantal bijzondere personen. Hierbij wil ik ook van de gelegenheid gebruik maken om hen te bedanken. In de eerste plaats zou ik mijn ouders willen bedanken om de morele steun en interesses die ze toonden tijdens mijn studies. Bij deze wil ik de firma XL‐holding bedanken omdat ik stage mocht doen bij hen en gebruik mocht maken van hun materiaal. In het bijzonder Kristof Soreyn als buitenpromotor, Frederik Torreele als labbegeleider en alle personeelsleden van XL‐holding. Ook wil ik de binnenpromotor Geert Vandecasteele bedanken evenals alle docenten uit het KHBO die de voorbije 3 jaar hun steentje bijgedragen hebben om mijn kennis te verruimen. Kris Sabbe Jabbeke, mei 2008
Aansturen LED display via art‐net
3
Abstract Aansturen LED‐display via art‐net XL‐Holding (Oostende) Door Kris Sabbe Dit eindwerk is de oplossing om videopixels, die normaal enkel geschikt zijn om video weer te geven, ook te gebruiken als lichteffect. Hiervoor wordt een bestaand lichtprotocol namelijk Art‐net toegepast. Art‐net is een nieuwe standaard die langzamerhand zijn weg vindt naast DMX. Het is een lichtprotocol dat net zoals DMX wordt gebruikt om via een lichttafel lampen, spots en moving heads te besturen. Het grote verschil met DMX is: het medium dat deze standaard gebruikt is ethernet. Dit biedt natuurlijk enkele voordelen, men kan gebruik maken van een reeds bestaand netwerk om de data over te transporteren, alsook van de apparatuur die het netwerk gebruikt. Hierbij denken we vooral aan hubs en routers. Art‐net is een standaard die gebruik maakt van het UDP‐protocol. Het zendt namelijk de DMX kanalen door in UDP‐pakketten. De bedoeling van mijn eindwerk is de data uit deze pakketten te halen en om te zetten naar een DVI‐signaal om een LED‐display aan te sturen.
Kris Sabbe
3AI1E0
Oostende 2007‐2008
Aansturen LED display via art‐net
4
Inhoudsopgave Inhoudsopgave
Abstract ......................................................................................................................... 3 Inhoudsopgave .............................................................................................................. 4 Lijst met illustraties, afbeeldingen en tabellen ............................................................. 6 Inleiding ......................................................................................................................... 8 1. Doel ........................................................................................................................ 9 2. Algemene uitleg van de te gebruiken componenten ........................................... 10 2.1. LED’s als lichteffect ........................................................................................ 10 2.1.1. Voordelen en eigenschappen .................................................................. 10 2.1.2. Opbouw en werking van een LED ............................................................ 11 2.1.3. Multicolor LED’s ...................................................................................... 12 2.2. DMX ............................................................................................................... 14 2.2.1. Wat is DMX? ............................................................................................ 14 2.2.2. Data protocol .......................................................................................... 15 2.3. Art‐net ........................................................................................................... 16 2.3.1. Wat is Art‐net? ........................................................................................ 16 2.3.2. Beperkingen ............................................................................................ 16 2.3.3. Ethernet implementatie .......................................................................... 17 2.3.4. Netwerk topologie .................................................................................. 18 2.4. OSI‐model ...................................................................................................... 19 2.4.1. Introductie .............................................................................................. 19 2.4.2. Lagen OSI‐model ..................................................................................... 19 2.4.3. Werking OSI‐model ................................................................................. 22 2.4.4. UDP in het OSI‐model .............................................................................. 23 2.5. DVI ................................................................................................................. 25 2.6. RS‐232 ............................................................................................................ 27 2.7. Barco MiStrip en control box ......................................................................... 29 3. Keuze van de componenten ................................................................................. 31 3.1. Picdem.net2 development board .................................................................. 31 3.2. Pic 18F97J60 .................................................................................................. 31 3.3. Altera cyclone I FPGA ..................................................................................... 32 3.4. TFP‐410 .......................................................................................................... 36 3.5. HIN202 ........................................................................................................... 37 3.6. MAX489 ......................................................................................................... 38 3.7. Ontkoppelcondensatoren .............................................................................. 38
Kris Sabbe
3AI1E0
Oostende 2007‐2008
Aansturen LED display via art‐net
5
3.8. Lichttafel en netlynx ...................................................................................... 39 3.9. Software ......................................................................................................... 40 3.9.1. Mplab ...................................................................................................... 40 3.9.2. Quartus II ................................................................................................. 40 3.9.3. Microsoft Network Monitor 3.1 .............................................................. 40 3.9.4. Barco director toolset V1.6 ..................................................................... 42 4. Uitwerking en problemen .................................................................................... 45 4.1. Uitwerking ..................................................................................................... 45 4.2. Metingen ....................................................................................................... 48 4.3. Schakeling ...................................................................................................... 55 4.4. Ontwerp van de print ..................................................................................... 58 4.5. Beeldopbouw ................................................................................................. 58 4.5.1. Geschiedenis ........................................................................................... 58 4.5.2. Blanking ................................................................................................... 59 4.6. Code PIC ......................................................................................................... 60 4.7. Code FPGA ..................................................................................................... 64 5. Werking van het toestel ....................................................................................... 70 5.1. Achterpaneel ................................................................................................. 70 5.2. Frontpaneel ................................................................................................... 70 6. Kostprijsberaming ................................................................................................ 72 7. Algemeen besluit ................................................................................................. 73 8. Bijlagen ................................................................................................................ 74 9. Literatuurlijst ....................................................................................................... 75
Kris Sabbe
3AI1E0
Oostende 2007‐2008
Aansturen LED display via art‐net
6
Lijst met illustraties, afbeeldingen en tabellen figuur 1: blokschema eindwerk ..................................................................................... 9 figuur 2: voordelen van LED’s ...................................................................................... 10 figuur 3: PN‐junctie in doorlaat ................................................................................... 11 figuur 4: opbouw LED .................................................................................................. 11 figuur 5: afmetingen LED ............................................................................................. 12 tabel 1: specificaties LED ............................................................................................. 13 figuur 6: XLR connector ............................................................................................... 14 tabel 2: instellen Art‐net IP‐adres ................................................................................ 17 figuur 7: OSI‐model ..................................................................................................... 20 figuur 8: OSI‐model ..................................................................................................... 22 figuur 9: UDP structuur ............................................................................................... 23 figuur 10: UDP frame .................................................................................................. 24 figuur 11: DVI connector ............................................................................................. 26 tabel 3: pinaansluiting DVI .......................................................................................... 26 figuur 12: RS‐232 connector ........................................................................................ 28 figuur 13: MiStrip ........................................................................................................ 29 figuur 14: MiStrip’s gebruikt als podium ..................................................................... 29 figuur 15: MiStrip’s gebruikt als LED vloer................................................................... 30 figuur 16: Picdem.net2 development board ................................................................ 31 figuur 17: MPLAB ICD 2 ............................................................................................... 31 figuur 18: banken FPGA ............................................................................................... 32 Tabel 4: eigenschappen FPGA ..................................................................................... 33 tabel 5: overzicht EP1C3 .............................................................................................. 33 figuur 19: serial configuration device .......................................................................... 33 figuur 20: programmeren via AS en JT ........................................................................ 34 tabel 6: verschillende programmeermogelijkheden FPGA ........................................... 34 figuur 21: pin layout TFP‐410 ...................................................................................... 36 figuur 22: blokschema TFP‐410 ................................................................................... 36 figuur 23: Blokschema HIN202 .................................................................................... 37 figuur 24: Aansluiting MAX489 ................................................................................... 38 figuur 25: Showmaster 24 en Net‐lynx ........................................................................ 39 figuur 26: ontvangen UDP‐pakket met alle schuifbalken omhoog .............................. 40 figuur 27: ontvangen UDP‐pakket met de eerste en laatste schuifbalk omhoog ........ 41 figuur 28: instellen MiStrip .......................................................................................... 42 figuur 29: MiStrip’s in testopstelling ........................................................................... 43 figuur 30: MiStrip’s geplaatst in director toolset ......................................................... 43 figuur 31: Instellen positie MiStrip’s ............................................................................ 44 figuur 32: gesoldeerde print ........................................................................................ 47 figuur 33: binnenkant behuizing .................................................................................. 47 Kris Sabbe
3AI1E0
Oostende 2007‐2008
Aansturen LED display via art‐net
7
figuur 34: scoopbeeld: voedingsspanning ................................................................... 48 figuur 35: scoopbeeld: 25MHz ..................................................................................... 49 Figuur36: scoopbeeld: leespulsen ................................................................................ 49 figuur 37: scoopbeeld: één leespuls ............................................................................. 50 figuur 38: scoopbeeld: tijd tussen 2 leespulsen ........................................................... 50 figuur 39: scoopbeeld: Teller ....................................................................................... 51 figuur 40: scoopbeeld: 32MHz ..................................................................................... 52 figuur 41: scoopbeeld: data enable en H_sync ............................................................ 52 figuur 42: scoopbeeld: H_sync en V_sync .................................................................... 53 figuur 43: scoopbeeld: TXC‐ en TXC+ ........................................................................... 54 figuur 44: netwerkbelasting ........................................................................................ 54 figuur 45: schakeling deel 1 ......................................................................................... 56 Figuur 46: schakeling deel 2 ........................................................................................ 57 figuur 47: kathodestraalbuis ....................................................................................... 58 figuur 48: beeldopbouw .............................................................................................. 59 figuur 49: software voor sync‐pulsen .......................................................................... 64 figuur 50: software voor de beeldopbouw .................................................................. 66 figuur 51: achterpaneel ............................................................................................... 70 figuur 52: frontpaneel ................................................................................................. 70 Tabel 7: kostprijsberaming .......................................................................................... 72
Kris Sabbe
3AI1E0
Oostende 2007‐2008
Aansturen LED display via art‐net
8
Inleiding Het doel van dit eindwerk is de data verzonden door een lichttafel over ethernet om te zetten tot lichteffecten. Hiervoor wordt het bestaande lichtprotocol Art‐net gebruikt. Art‐net is een standaard die gebruik maakt van het UDP‐protocol. Het zendt namelijk de DMX kanalen door in UDP‐pakketten. Deze UDP‐pakketten worden binnen gelezen en de data eruit wordt omgevormd tot een DVI‐signaal. Dit probleem wordt opgesplitst in drie delen, namelijk ten eerste het ontvangen van de udp‐pakketten, ten tweede het genereren van de componenten voor een DVI‐ signaal en ten derde de omzetting naar DVI. Voor het ontvangen van de UDP‐pakketten is gebruik gemaakt van het Picdem.net2 development board. Op dit bord zit de PIC18F97J60 die een ethernet ondersteuning heeft. Met de PIC worden de UDP‐pakketten ontvangen en de data eruit gehaald. Dit wordt dan samen met een teller een leespulsen verzonden naar de fpga, de Cyclone I van Altera. In de fpga worden de synchronisatie en enable‐pulsen gemaakt voor de beeldopbouw. In de fpga wordt ook de data verzonden vanuit de pic, met de standen van de schuifbalken, omgezet naar beeld. Deze signalen gaan dan naar een digitale transmitter, de TFP‐410 van Texas. Dit ic zet de signalen dan om naar een DVI‐signaal.
Kris Sabbe
3AI1E0
Oostende 2007‐2008
Aansturen LED display via art‐net
9
1. Doel Het doel van dit eindwerk is om een LED‐display (Barco ™ MiStrip) aan te sturen via art‐net. Hiervoor wordt een lichttafel van Showtec (showmaster 24) gebruikt. Deze lichttafel zendt zijn data uit in een DMX signaal. Dit signaal wordt dan omgezet door een omvormer (Artistic license Net‐lynx) naar art‐net. De UDP‐pakketten uitgezonden door dit toestel worden dan binnen gelezen door middel van een PIC. Deze PIC is de PIC18F97J60 omdat deze een ethernet ondersteuning heeft. Uit deze pakketten wordt dan de data gehaald die nodig en wordt doorgestuurd naar een fgpa. De Cyclone I van Altera. In deze fpga gebeurt de opbouw van het beeld, de synchronisatiepulsen en de blanking. Deze signalen worden dan doorgezonden naar de TFP‐410 die een digitale omzetter is. Dit ic zet de signalen dan om naar een DVI‐signaal. Dit DVI‐signaal wordt dan aangesloten om een Olite control box welke dan de MiStrip’s aanstuurt. Figuur 1 is het algemeen blokschema van dit eindwerk.
Kris Sabbe
figuur 1: blokschema eindwerk
3AI1E0
Oostende 2007‐2008
Aansturen LED display via art‐net
10
2. Algemene uitleg van de te gebruiken componenten 2.1. LED’s als lichteffect 2.1.1. Voordelen en eigenschappen LED’s worden vandaag de dag meer en meer opgenomen in onze dagelijkse leefomgeving. Als verlichting, signalisatie, lichteffect en nog zoveel meer. Om deze LED’s te kunnen gebruiken in een videowall moet men over de drie hoofdkleuren beschikken, namelijk rood, groen en blauw. In vroegere systemen werkte men dikwijls met drie afzonderlijke LED’s om de drie hoofdkleuren weer te geven. Nu wordt dit meer geïntegreerd in één SMD‐LED. Op deze manier kunnen veel hogere resoluties gehaald worden. De hoge eisen die worden gesteld aan een LED wanneer deze wordt toegepast in een videowall laten zich ook zien in het ontwerp. Hierbij is te denken aan de stralingshoek, de lichtopbrengst, het regelgedrag en niet onbelangrijk, de stroom die wordt opgenomen. De voordelen van LED’s ten opzichte van gloeilampen is dat ze veel kleiner zijn en ze duizend maal sneller oplichten. Alsook het rendement (bekeken vanuit het oogpunt: aantal lummen per watt) ligt ongeveer drie keer hoger dan conventionele gloeilampen. De levensduur van een LED ligt ongeveer op honderdduizend branduren. Gloeilampen moeten het doorgaans stellen met 3000 branduren. LED's bevatten geen gloeidraad, die vaak stuk gaat bij traditionele verlichting. Ook heeft een LED een snelle responstijd wat ideaal is voor digitale sturing. Enkele nadelen van LED’s zijn dat ze het licht in een beperkte hoek uitzenden, terwijl gloeilampen en fluorescentielampen licht naar alle kanten uitstralen. LED‐ verlichting kost ook meer dan traditionele verlichting. figuur 2: voordelen van LED’s
Kris Sabbe
3AI1E0
Oostende 2007‐2008
Aansturen LED display via art‐net
11
2.1.2. Opbouw en werking van een LED De werking van een LED of een Light Emitting Diode berust op het principe van de verontreinigde halfgeleider. Men gebruikt bij het maken van diodes meestal silicium. Deze stof heeft vier elektronen op de buitenste schil zitten. Af en toe wordt er door warmte energie een elektron uit zijn schil weggetrokken en kan het zich voortbewegen in de kristalstructuur van het silicium. De overgebleven lading noemen we een gat. Het voortbewegen van deze elektronen noemen we intrinsieke geleiding. Omdat dit een slechte geleider is gaat men deze verontreinigen, bij voorkeur met een atoom met één elektron meer of minder op de buitenste schil. Wanneer we verontreinigen met Fosfor of Arsenicum dan heeft dit materiaal 5 elektronen op de buitenste schil en krijgen we N‐materiaal. Doordat het 5e elektron teveel is ( de andere 4 worden gebruikt om zich te binden met het silicium.) beweegt dit elektron zich vrij rond en zo ontstaat er een vast gat in de binding. De geleiding die hierdoor ontstaat noemt men figuur 3: PN‐junctie in doorlaat extrinsieke geleiding. Bij P‐materiaal verontreinigen we met een materiaal (bv. boor of gallium) met 3 elektronen op de buitenste schil. Zo krijgen we dus een gat en een vaste negatieve lading. Met deze twee materialen kunnen we nu een PN‐junctie maken. Wanneer we een spanning aansluiten op deze junctie kan ze in sper of in doorlaat gepolariseerd zijn. Het gebied waar de twee materialen elkaar raken noemen we de sperlaag. Indien de junctie in doorlaat gepolariseerd is (zie figuur 3) dan kunnen de elektronen vanaf een bepaalde spanning (junctiespanning) beginnen vloeien van het N naar het P‐materiaal. In sper wordt het spergebied breder en kunnen de elektronen niet vloeien van het ene naar het andere materiaal. Bij LED’s is de opbouw iets anders dan een gewone diode. Er wordt namelijk meestal ook nog een soort kegeltje voorzien dat fungeert als een soort reflector om het licht te kunnen richten. Afhankelijk van de hoek van dit kegeltje wordt de figuur 4: opbouw LED stralingshoek van de LED bepaald. Als we een Kris Sabbe
3AI1E0
Oostende 2007‐2008
Aansturen LED display via art‐net
12
geleidende PN‐junctie hebben dan is de grootte van de gap of het overgangsgebied tussen de valentieband en de geleidingsband belangrijk voor de golflengte (=kleur) van het uitgestraalde licht . Daarom hebben blauwe LED’s bijvoorbeeld een hogere spanning nodig om te branden, omdat de gap energie anders is. Dit in tegenstelling tot rode LED’s die kunnen werken met een lagere spanning. Om witte LED’s te maken die enkel dienen als verlichting maakt men een blauwe LED waarbij men de lens verontreinigt met geel fluorescentie poeder zodat het licht wit wordt. Bij video toepassingen maakt men wit licht door simpelweg de drie hoofdkleuren met elkaar te mengen. 2.1.3. Multicolor LED’s Bij multicolor LED’s worden de drie hoofdkleuren rood, groen en blauw geïntegreerd in een behuizing. Op deze manier kunnen er veel meer LED’s op dezelfde oppervlakte geplaatst worden waardoor de resolutie van het display verbeterd. De LED’s gebruikt in de MiStrip worden door Nichia Corporation gemaakt en zijn SMD LED’s van 5,5 x 5,5 mm. Deze LED’s hebben zes aansluitpinnen. Telkens zit er tussen twee aansluitpinnen een LED. In figuur 5 ziet u de afmetingen van de LED’s en hoe de drie LED’s inwendig zijn aangesloten.
Kris Sabbe
figuur 5: afmetingen LED
3AI1E0
Oostende 2007‐2008
Aansturen LED display via art‐net
13
In onderstaande tabellen vindt u enkele specificaties van deze LED’s.
Kris Sabbe
tabel 1: specificaties LED
3AI1E0
Oostende 2007‐2008
Aansturen LED display via art‐net
14
2.2. DMX 2.2.1. Wat is DMX? DMX staat voor Digital MultipleXed. (Ook wel DMX‐512 genoemd) DMX wordt gebruikt als seriële communicatiebus tussen verschillende apparaten in de theater‐ en discotheek lichttechniek. Vaak is het sturende apparaat een lichttafel met enkele dimmerpacks of andere meer ingewikkelde armaturen. Elk apparaat heeft een ingang en een uitgang zodat de bus tussen de verschillende apparaten doorgelust kan worden. Volgens de standaard gebruikt de bus een vijf‐aderige kabel met XLR connectoren maar omdat er veelal drie‐aderige kabels met XLR connector van de geluidstechniek aanwezig waren werd er in de praktijk meer drie‐aderige kabels met XLR connectoren voor DMX‐signalen gebruikt. De overige 2 aders waren oorspronkelijk bedoeld om informatie van de lichtapparatuur terug te sturen naar de sturende tafel. Dit is echter nooit geïmplementeerd. De pinbezetting is als volgt: 1. Massa 2. Cold (‐) 3. Hot (+) 4. (Niet meer gebruikt) return ‐ 5. (Niet meer gebruikt) return + figuur 6: XLR connector Behalve de lichtintensiteit kunnen ook de kleur, vorm en richting van een lamp variabel zijn. Voor elk van deze parameters wordt dan een DMX kanaal gebruikt. Voor een enkele lamp kunnen dan bijvoorbeeld vijf DMX kanalen in gebruik zijn: 1. Intensiteit 2. Kleur 3. Vorm (gobo) 4. X‐positie (pan) 5. Y‐positie (tilt) Sommige apparaten vragen om een nauwkeurigere positionering dan mogelijk is met één 8‐bit waarde. Dan worden er soms twee kanalen gebruikt om één parameter te veranderen, bijvoorbeeld de X‐positie. Elektrisch kunnen op één DMX lijn in theorie 32 apparaten (bijvoorbeeld dimmers) aangesloten worden. Als er meer apparaten nodig zijn dan moet er een zogenaamde repeater tussen geplaatst worden, die het signaal versterkt. Veel moderne "intelligente" lampen hebben deze functie tegenwoordig in zich. Kris Sabbe
3AI1E0
Oostende 2007‐2008
Aansturen LED display via art‐net
15
DMX is niet geschikt voor het gebruik van kritische toepassingen zoals pyrotechniek (vuurwerk). Het protocol is daar niet betrouwbaar genoeg voor. Als een ontvanger zich "vertelt" neemt het de waarde van een ander aan, een stuk vuurwerk op kanaal 10 zou dan af kunnen gaan als de lamp op kanaal 11 vol aanstaat. In plaats van DMX wordt voor dergelijke toepassingen dan bijvoorbeeld MIDI gebruikt, waarbij de ontvanger ook zijn status terug kan melden en het stuk vuurwerk pas af kan gaan als het eerst "op scherp" gezet is. 2.2.2. Data protocol Het protocol zelf is bijzonder eenvoudig: na een korte wachttijd worden tot maximaal 512 8‐bits kanaalwaarden achter elkaar verzonden. Er kunnen dus 512 dimmerkanalen aangestuurd worden met één DMX kabel, waarbij elke dimmer tussen de 0 en 255 geregeld kan worden. Daarbij is een waarde van 255 gelijk aan een volledig ingeschakelde lamp en 0 gelijk aan een uitgeschakelde lamp. Op elk dimmerpack kan het adres waar het naar luistert ingesteld worden, het ontvangende apparaat hoeft na het detecteren van de zendpauze alleen maar af te tellen tot zijn waarde langskomt. De baudrate van DMX 512 ligt typisch op 250 kbit/s.
Kris Sabbe
3AI1E0
Oostende 2007‐2008
Aansturen LED display via art‐net
16
2.3. Artnet 2.3.1. Wat is Artnet? Art‐net is een op ethernet gebaseerde standaard die zich situeert in de TCP/IP laag van dit protocol. Het dient om grote hoeveelheden DMX512 data te verzenden gebruik makende van standaard netwerktechnologie. Art‐net is in de eerste plaats bedoeld om te werken op 10BaseT netwerken. De snelheid is dus maximum 10 Mbit/sec. 2.3.2. Beperkingen Indien we kijken naar de data‐rate van DMX versus ethernet, dan zien we dat DMX draait op 250 KBaud en ethernet 10MBaud. Dit veronderstelt dat er maar maximum 40 universes zouden kunnen bestaan. Maar Art‐net maakt gebruik van een delta transmissie compressie techniek die ervoor zorgt dat er ongeveer 60 universes adresseerbaar zijn. Delta compressie techniek Het delta coderen is een manier om gegevens in de vorm van verschillen tussen opeenvolgende gegevens op te slaan of te verzenden. Het delta coderen wordt ook deltacompressie genoemd. De verschillen tussen de data worden geregistreerd in afzonderlijke dossiers genoemd delta's of diffs. Omdat de veranderingen vaak klein zijn vermindert het delta coderen veel gegevensovertolligheid. De inzamelingen van unieke delta's zijn wezenlijk ruimte‐efficiënter dan hun niet‐gecodeerde equivalenten. Van een logisch standpunt is het verschil tussen twee gegevenswaarden de informatie die wordt vereist om één waarde uit andere te verkrijgen. Het verschil tussen identieke waarden is 0 of het neutrale element. Een voorbeeld. In plaats van 2..4..6..9..7..10..10..12 te verzenden kan 2..2..2..3..‐2..3..0..2 verzonden worden. Deze codering is het meest doeltreffend wanneer er tijdens het verzenden vaak opeenvolgende of gelijke waarden voorkomen.
Kris Sabbe
3AI1E0
Oostende 2007‐2008
Aansturen LED display via art‐net
17
2.3.3. Ethernet implementatie Alle communicatie verloopt via UDP(User Datagram Protocol). Om te kunnen Communiceren moet het IP‐adres van het Art‐net toestel in klasse A liggen. Dit laat toe dat Art‐net producten direct met elkaar kunnen communiceren en dat er geen DHCP‐server nodig is. DHCP staat voor Dynamic Host Configuration Protocol en is een computerprotocol dat beschrijft hoe een computer zijn netwerkinstelling kan verkrijgen. DHCP is gebaseerd op het internet protocol en werkt met UDP‐pakketten. Met DHCP kunnen onder andere de IP adressen van alle toestellen in het netwerk automatisch toegewezen worden in plaats van dit handmatig te doen. In deze toepassing is dit echter niet nodig omdat de IP adressen van de toestellen die gebruikt worden vast zijn. Een klasse A netwerkadres is toegestaan in een gesloten ( privé) netwerk. Dit is belangrijk omdat het niet de bedoeling is dat de Art‐net data naar het internet gezonden wordt. Men beveelt aan dat een Art‐net IP‐adres er standaard zo uitziet: 2.x.x.x. Een IP‐adres bestaat uit het formaat: A.B.C.D. waarbij het de bedoeling is dat B C en D wordt berekend uit het MAC adres. De hoogste byte A wordt gezet volgens tabel 2.
tabel 2: instellen Art‐net IP‐adres Het MAC‐adres is een 48 bits nummer met als vorm: u:v:w:x:y:z. Het is de bedoeling dat dit een algemeen uniek nummer is. De bovenste bytes u, v en w zijn geregistreerd aan een specifieke organisatie. De laagste x, y en z worden toegekend in de organisatie zelf. Om te verzekeren dat er zeker geen conflicten zijn met IP adressen wordt de product OEM‐code toegevoegd in het MAC‐adres. Het subnetmasker wordt standaard op 255.0.0.0 gezet, tenzij er een handmatig IP adres is ingesteld. Het poortnummer waarop de communicatie verloopt is standaard 6465 (0x1936)
Kris Sabbe
3AI1E0
Oostende 2007‐2008
Aansturen LED display via art‐net
18
Een voorbeeld: o Netwerk switch: uit o MAC‐adres: 12.45.78.98.34.76 o OEM code: 0x0010 o Berekening IP‐adres(A.B.C.D): o IP‐adres A = 2 (Netwerk switch is uit) o IP‐adres B = 114( 98+0+16) o IP‐adres C = 34( uit het MAC‐adres) o IP‐adres D = 76( uit het MAC‐adres) o IP‐adres is: 2.114.34.76. Standaard moet een server pollen naar het primaire en secundair adres Primair adres: 2.255.255.255:6454 Secundair adres: 10.255.255.255:6454 2.3.4. Netwerk topologie Bij Art‐net zijn er twee netwerkstructuren mogelijk: 1. Peer to peer. Dit is een netwerk dat data verzendt zonder tussenkomst van een server. Meerdere nodes kunnen data verzenden. Alle data wordt verzonden via ArtDMX‐packets. Alle packets worden gebroadcast, dit wil zeggen verzonden met IP‐adres 2.255.255.255. (of 10.255.255.255). Dus ALLE nodes die aangesloten zijn op het netwerk ontvangen de data. Als een Art‐net toestel opstart, start het op in deze mode. 2. Server to peer. Dit is de meest gesofisticeerde implementatie waarbij één of meerdere nodes communiceert met één of meerdere centrale servers. ( meestal lichtconsoles). Deze methode van werken is programmeerbaar door het werken met het Artpoll data packet. In deze mode kan men ook kiezen of de data verder gebroadcast wordt of ze naar één specifiek adres gezonden wordt. Een Universe adres wordt gecodeerd als een 8‐bits getal. De hoogste bit is de referentie voor het Sub‐net adres en wordt op één enkele waarde gezet voor iedere node. De laagste bit wordt gebruikt om het individueel universe te definiëren in de node. In de bijlage kan men de inhoud vinden die in de ArtDMX‐ packets zit, alsook de procedure die gevolgd moet worden voor de Artpollpackets en Artpollreply. Kris Sabbe
3AI1E0
Oostende 2007‐2008
Aansturen LED display via art‐net
19
2.4. OSImodel 2.4.1. Introductie Hoewel er verschillende protocollen beschikbaar zijn voor de overdracht van computergegevens, moeten alle protocollen voor netwerkcommunicatie bepaalde kernfuncties bieden. De implementatie van de functies kan per fabrikant verschillen, maar hebben allemaal een aantal basiskenmerken gemeen. Het OSI‐referentiemodel (Open Systems Interconnection Reference Model) is door de ISO (International Systems Organization for Standardization) ontwikkeld als basismodel waarop alle protocollen kunnen voortborduren. Het OSI‐model is wel in de praktijk gebruikt, maar wordt over het algemeen gezien als een theoretisch raamwerk dat de bouwblokken van een goed protocol in kaart brengt en definieert. Protocollen als TCP/IP bevatten (een gedeelte van) de basisfuncties die zijn vastgelegd in het OSI‐ model. Het gebruik van een referentiemodel heeft een aantal voordelen. Het biedt bijvoorbeeld een algemeen frame voor programmeurs die protocol stacks ontwikkelen. Daarnaast biedt het alle gebruikers van een netwerk de mogelijkheid om voor alle protocolsystemen dezelfde uitgangspunten te gebruiken op het gebied van functionaliteitslagen. Verder zou de modulariteit van een gelaagd protocol in een ideale situatie de mogelijkheid bieden om een overbodig functionerend codeblok te vervangen door een verbeterde versie van hetzelfde blok zonder dat nodig de hele stack te bewerken. Die uitwisselbare, modulaire eigenschap kan helpen bij het koppelen van netwerksoftware afkomstig van verschillende fabrikanten. Voordat het OSI‐model werd erkend als een geldig protocolmodel, maakten de meeste fabrikanten hun eigen protocollen waarbij weinig aandacht werd besteed aan de mogelijkheden tot samenwerking van producten van verschillende fabrikanten. Doordat steeds meer gebruikers interesse toonden voor open standaards, begonnen de besloten standaards terrein te verliezen. De mogelijkheden voor samenwerking tussen producten van verschillende fabrikanten werd steeds belangrijker en het werd duidelijk dat er behoefte was aan een standaardmodel, zoals OSI. 2.4.2. Lagen OSImodel Het OSI‐model bestaat uit zeven lagen en elke laag heeft een eigen functie. Dit betekent niet dat elk protocol dat gebaseerd is op het OSI‐model uit zeven verschillende lagen bestaat of niet meer dan zeven functies heeft. De zeven lagen vertegenwoordigen alleen de typen functies die een protocol zou moeten ondersteunen. Daarnaast worden de functionele blokken in het OSI‐model gerangschikt in een logische volgorde, met een bovenste en onderste laag. De functies bovenin het model bevinden zich het dichtst bij de gebruiker of toepassing en de functies onderin het model het dichtst bij het fysieke netwerk of netwerkkaarten. Kris Sabbe
3AI1E0
Oostende 2007‐2008
Aansturen LED display via art‐net
20
figuur 7: OSI‐model
• Laag 7: Application layer (toepassingslaag) Dit is de toplaag van het OSI‐model. Deze laag is verantwoordelijk voor de netwerktoegang van applicaties. Gebruikerstoepassingen en systeemservices krijgen over het algemeen toegang tot het netwerk door samen te werken met een proces dat uitgevoerd wordt in deze OSI‐laag. • Laag 6: Presentation layer (presentatielaag) Dit is de OSI‐laag die het nauwst samenwerkt met de toepassingslaag. De belangrijkste taak van deze laag is ervoor te zorgen dat de gegevens die worden doorgestuurd naar de Toepassingslaag een indeling hebben of krijgen, die wordt begrepen door het proces in de Toepassingslaag. • Laag 5: Session layer (sessielaag) De Sessielaag is verantwoordelijk voor het tot stand brengen, onderhouden en beëindiging van de communicatie tussen toepassingen of processen op een netwerk. Kris Sabbe
3AI1E0
Oostende 2007‐2008
Aansturen LED display via art‐net
21
• Laag 4: Transport layer (transportlaag) De Transportlaag is verantwoordelijk voor het verzenden van berichten van de bronhost naar de eindbestemming. Deze laag is niet alleen verantwoordelijk voor het maken van een virtueel circuit tussen twee punten op het netwerk, maar ook voor de gegevensintegriteit (als de lagere protocollen die niet aanbieden). • Laag 3: Network layer (netwerklaag) Deze laag zorgt ervoor dat pakketten door verschillende lagen worden gerouteerd. De netwerklaag houdt geen rekening met de onderliggende protocollen die actief zijn op dit niveau en daardoor kunnen apparaten (zoals routers) die actief zijn op dit niveau, worden gebruikt om verbindingen tot stand te brengen tussen netwerken die verschillende technologieën gebruiken in de lagen Data Link en Physical. • Laag 2: Data Link layer (gegevenskoppelingslaag) Deze laag is oorspronkelijk ontworpen als een enkele functionele laag. Later bleek het echter noodzakelijk om de laag te verdelen in twee sublagen, namelijk LLC (Logical Link Control) en MAC (Media Access Control). Deze twee lagen zijn samen verantwoordelijk voor het verplaatsen van pakketten van en naar het netwerk. o MAC De MAC‐sublaag moet ervoor zorgen dat er op het juiste toegang wordt verkregen tot het netwerk, bijvoorbeeld als er geen communicatie met andere computers plaatsvindt of als er expliciet toegang is verleend tot het netwerk. In deze laag worden bits en bytes verzameld en omgezet in frames en omgekeerd. o LLC De LLC‐sublaag zet de bytes die ontvangen zijn van de onderliggende MAC‐laag om in een indeling die leesbaar is voor de bovenliggende Netwerklaag. • Laag 1: Physical layer (fysische laag) Deze laag is verantwoordelijk voor de manier waarop de bits en bytes fysiek worden verzonden en ontvangen. In deze laag worden de hardware, connectoren, kabels en signaalspecificaties gedefinieerd.
Kris Sabbe
3AI1E0
Oostende 2007‐2008
Aansturen LED display via art‐net
22
2.4.3. Werking OSImodel Wanneer de Toepassingslaag een pakket met gegevens ontvangt van een toepassing of service, verwerkt de laag de informatie, voegt er een header aan toe en geeft de informatie door aan de volgende OSI‐laag (Presentation). De gegevens worden uiteindelijk door het hele model naar de fysieke media gestuurd, waarbij elke laag een bewerking uitvoert en header informatie toevoegt. De gegevens worden vervolgens via het netwerk verstuurd naar de doelcomputer. Deze doelcomputer ontvangt de gegevens en stuurt ze via alle lagen van het OSI‐model naar de toplaag (Application). Elke laag voert een bewerking uit, verwijdert de bijbehorende header informatie en stuurt de gegevens door naar de volgende laag.
figuur 8: OSI‐model Iedere laag van het OSI‐model is bewust van het bestaan van de onder‐ en bovenliggende lagen. Daarnaast onderhoudt elke laag logische communicatie met de corresponderende laag op de andere computer. De lagen zijn zich echter niet bewust van de onderliggende processen die worden uitgevoerd door andere lagen. Kris Sabbe
3AI1E0
Oostende 2007‐2008
Aansturen LED display via art‐net
23
2.4.4. UDP in het OSImodel UDP is de afkorting van User Datagram Protocol en bevindt zich in de transportlaag of vierde laag van het OSI‐model. UDP is één van de basisprotocollen van het Internet en opereert op hetzelfde niveau als TCP. Vergeleken met TCP is UDP minder betrouwbaar, maar dankzij een lagere overhead (zoals handshaking, en verificatie) ook sneller. Zo biedt UDP geen garantie dat de gegevens werkelijk aankomen. Een aantal protocollen die via UDP werken implementeren zelf een verificatiemethode. Hiermee zorgen ze effectief voor een vervanging van de functionaliteit die TCP heeft op dit gebied. UDP wordt veel gebruikt bij toepassingen waar het snel overdragen van de gegevens en een korte reactietijd zeer belangrijk is, en het minder erg is dat er gegevens verloren kunnen gaan. De UDP hoofdstructuur is als volgt.
figuur 9: UDP structuur Source port Source port is een optioneel veld. Wanneer dit gebruikt wordt geeft dit de poort weer van de zender. Dus data die teruggezonden moet worden zal ook naar deze poort verstuurd worden. Wanneer deze poort niet gebruikt wordt is deze waarde gelijk aan nul. In deze toepassing is deze poort 6454. Dit is de standaard poort voor art‐net. Destination port Dit is de poort waar de data op verzonden wordt. Hier is deze ook 6454. Lengte De lengte van het totale pakket. Hier is dit steeds 538 bytes. Checksum Veel manieren om gegevens te lezen, over te brengen of op te slaan zijn niet 100% betrouwbaar. Om te kunnen controleren of er een fout opgetreden is, kan een controlecijfer worden toegevoegd. Dit wordt berekend uit de gegevens die zijn gelezen of verstuurd. Achteraf wordt de checksum opnieuw berekend en vergeleken met de opgeslagen of meegestuurde versie. Als de twee niet overeenkomen is er een fout opgetreden. De foutdetectie van een checksum is beperkt: bij een meervoudige fout zal het controlecijfer wel kunnen kloppen.
Kris Sabbe
3AI1E0
Oostende 2007‐2008
Aansturen LED display via art‐net
24
Data De data zelf van het pakket is 530 bytes. Hierin bevinden zich de informatie van de lichttafel en de data ervan. Op deze manier is het dan ook mogelijk om verschillende lichttafels binnen te lezen.
figuur 10: UDP frame
Kris Sabbe
3AI1E0
Oostende 2007‐2008
Aansturen LED display via art‐net
25
2.5. DVI DVI (Digital Visual Interface) is ontworpen in 1998 door DDWG (Digital Display Working Group), en was oorspronkelijk bedoeld als interface voor monitoren. Sindsdien is het gebruik echter zodanig uitgebreid dat het een standaard in wording is voor digitale gegevensoverdracht. Het hoofdkenmerk aan dit type interface is dat het een verbinding tot stand kan brengen tussen computer en monitor, met een zeer hoge bandbreedte (tot 165 MHz voor een enkele verbinding). Hierdoor kan men ongecomprimeerde videosignalen doorsturen naar de monitor, zodat niet enkel de beeldprestaties veel hoger zijn, maar eveneens de snelheid van update en reactie. DVI brengt een volledig digitaal signaal zonder enig gegevensverlies. Bovendien wordt elke pixel gedefinieerd door 24‐bits RGB gegevensstroom. Men kan deze interface echter opdelen in 4 verschillende types: • DVI‐A Deze interface stuurt enkel een analoog signaal door, met als nut om een gewone connector overgang te maken. Dit type is gelijkwaardig met DVI‐I, zoals onderstaande: • DVI‐I Dit was de oorspronkelijke interface, die een combinatie maakte van een digitaal en analoog signaal dat compatibel was met Pc's voorzien van een CRT (of eventueel een digitale) monitor. Kortom, een oplossing om de weg tussen analoog en digitaal onzichtbaar te maken. • DVI‐D De interface die enkel een digitaal signaal draagt. De opmars van DVI‐D is nog volop bezig en vele consumentenproducten (zoals digitale televisie en monitors of Tv‐toestellen) dragen deze interface al met zich mee. • DVI‐D HDCP Verschillend van DVI‐A, DVI‐I en DVI‐D draagt dit type interface de codering HDCP met zich mee om illegaal gebruik tegen te gaan. Verschil tussen Barco DVI en standaard DVI Bij het Barco DVI‐signaal worden enkele kanalen gewisseld waar de kleuropbouw gebeurt. In deze toepassing gebeurt dit in de FPGA. Indien je er een standaard DVI‐ signaal wilt hebben kan je dit bekomen door een softwareaanpassing in de FPGA. Barco heeft de 24 kanalen (8bit rood, 8bit groen en 8 bit blauw) omgewisseld die door de TFP‐410 omgezet word naar een DVI‐signaal. Kris Sabbe
3AI1E0
Oostende 2007‐2008
Aansturen LED display via art‐net
26
Connector De signalen zijn gebalanceerd; als de spanning op de + lijn omhoog gaat, daalt de spanning op de bijbehorende ‐ lijn en omgekeerd; de impedantie van iedere verbinding bedraagt 100 Ohm.
figuur 11: DVI connector
Pin
Functie
Pin
Functie
1
TMDS Data 2‐
16
Hot Plug Detect
2
TMDS Data 2+
17
TMDS data 0−
3
TMDS Data 2/4 schild
18
TMDS data 0+
4
TMDS Data 4−
19
TMDS data 0/5 schild
5
TMDS Data 4+
20
TMDS data 5−
6
DDC klok
21
TMDS data 5+
7
DDC data
22
TMDS klokschild
8
Analoge Verticale Sync
23
TMDS clock+
9
TMDS Data 1−
24
TMDS clock−
10
TMDS Data 1+
C1
Analoog Rood
11
TMDS Data 1/3 schild
C2
Analoog Groen
12
TMDS Data 3−
C3
13
TMDS Data 3+
C4
Analoog Blauw Analoge Horizontale Sync
14
+5V
C5
Analoge GND
15
GND
Kris Sabbe
tabel 3: pinaansluiting DVI
3AI1E0
Oostende 2007‐2008
Aansturen LED display via art‐net
27
2.6. RS232 Communicatie zoals die gedefinieerd is in de RS232 standaard is een asynchrone seriële communicatie methode. Het woord serieel betekent dat de informatie bit voor bit wordt verzonden. Asynchroon leert ons, dat de informatie niet op vooraf afgesproken momenten wordt verzonden. Het verzenden van data kan op elk willekeurig moment starten en het is daarbij de taak van de ontvanger om te detecteren wanneer een boodschap start en eindigt. Asynchrone communicatie heeft zowel voordelen als nadelen.
Signaalniveaus De RS‐232 standaard definieert de signaalniveaus die corresponderen met een logische één en een logische nul als plus of min 3 tot 15 volt; het gebied rond nul volt is geen geldig RS‐232 niveau. Een logische één heeft een negatief signaalniveau, wordt 'mark' genoemd en heeft als functionele betekenis UIT (OFF), een logische nul is positief, wordt 'space' genoemd en heeft als functionele betekenis AAN (ON). De standaard specificeert een maximum van 25 V. Afhankelijk van de gebruikte voeding worden veelal signaalniveaus van ±5 V, ±10 V, ±12 V en ±15 V gebruikt. Een beroemde omzetter van en naar TTL‐niveau is het Maxim‐ic MAX232. Ook de snelheid waarmee de signalen moeten veranderen (stijg‐ en daaltijd of slew rate) is vastgelegd in de norm.
Startbit RS232 definieert een asynchrone manier van communiceren. Dit betekent dat het verzenden van een datawoord op elk moment kan beginnen. Het op elk moment kunnen starten levert enkele problemen op aan de ontvangstzijde om te detecteren welk bit het eerste te ontvangen bit van een datawoord is. Om dit probleem op te lossen wordt elk datawoord vooraf gegaan door een signaleringsbit. Dit signaleringsbit, ook bekend als startbit, is altijd herkenbaar aan het space signaal niveau. Omdat de lijn in mark status is als er geen communicatie geschiedt, kan de startbit eenvoudig door de ontvanger worden herkend. Databits Direct na de startbit worden de databits verzonden. Een bitwaarde 1 zorgt ervoor dat de lijn in de mark status gaat terwijl de bitwaarde 0 wordt gerepresenteerd door de space status. Het minst significante bit wordt altijd als eerste verzonden. Pariteitsbit Om transmissiefouten te kunnen detecteren is het mogelijk om aan het eind van het datawoord automatisch een pariteitsbit te laten genereren. De zender berekent de waarde van die bit aan de hand van de verzonden informatie. De ontvanger voert dezelfde berekening uit en controleert dan of het ontvangen pariteitsbit overeen komt met de berekende waarde. Kris Sabbe
3AI1E0
Oostende 2007‐2008
Aansturen LED display via art‐net
28
Stopbits Veronderstel, dat de ontvanger de startbit gemist heeft omdat er op dat moment ruis op de lijn aanwezig was. In dat geval start de ontvangst met het eerstvolgende databit die een space waarde heeft. Hierdoor wordt verminkte data ontvangen. Een mechanisme moet aanwezig zijn om hersynchronisatie te bewerkstelligen. Om dit te doen is het begrip framing geïntroduceerd. Framing betekent, dat de databits en het pariteitsbit worden omringd door start‐ en stopbits. De tijdsperiode tussen de start‐ en stopbits is constant en wordt bepaald door de baudrate en het aantal data‐ en pariteitsbits. De startbit wordt altijd aangegeven met het space niveau, het stopbit met mark niveau. Als de ontvanger een andere waarde dan mark detecteert op het moment dat het stopbit had moeten worden ontvangen, dan is daarmee gedetecteerd dat er een framing error heeft plaatsgevonden. Hierdoor wordt een foutconditie in de UART gezet. Vervolgens wordt geprobeerd op nieuw binnenkomende bits te hersynchroniseren. Om opnieuw te synchroniseren zoekt de ontvanger in de binnenkomende gegevens naar correcte paren van start‐ en stopbits. Dit werkt, zolang er genoeg variatie is in de bitpatronen van de binnenkomende datawoorden. Als bijvoorbeeld de datawaarde 0 continu verzonden wordt kan echter in het geheel geen hersynchronisatie plaatsvinden. Aansluitingen
figuur 12: RS‐232 connector
Kris Sabbe
3AI1E0
Oostende 2007‐2008
Aansturen LED display via art‐net
29
2.7. Barco MiStrip en control box De Barco MiStrip is een balk van 1,5 meter op 3,75 cm die 128 multicolor SMD LED’s bevat. Met één LED kunnen ongeveer 16,7 miljoen kleuren gemaakt worden. De MiStrip kan door zijn vorm in verschillende toepassingen gebruikt worden, zowel indoor als outdoor. Figuur 13 is een afbeelding van een MiStrip. De MiStrip heeft een horizontale en verticale kijkhoek van 145°. De helderheid van één MiStrip is 6100 cd/m². figuur 13: MiStrip De MiStrip kan wegens een degelijke onderconstructie veel gewicht dragen. In figuur 14 wordt de MiStrip gebruikt als podium op het concert van George Michael. Hiervoor werden ongeveer 3000 MiStrip’s gebruikt om een display van 9 meter breed op 25 hoog te maken.
figuur 14: MiStrip’s gebruikt als podium
Kris Sabbe
3AI1E0
Oostende 2007‐2008
Aansturen LED display via art‐net
30
In figuur 15 werden de MiStrip’s gebruikt als LED vloer op de Frankfurt autoshow 2007. De MiStrip is dus zelfs sterk genoeg om auto’s en mensen te dragen. figuur 15: MiStrip’s gebruikt als LED vloer Voor het aansturen van de MiStrip’s is er een control box nodig. Deze control box wordt aangestuurd met een DVI signaal. De control box stuurt dan de verschillende MiStrip’s aan. Via RS‐232 kunnen de MiStrip’s geprogrammeerd worden zodat je kan instellen op welke positie een MiStrip hangt. Deze signalen worden ook via de DVI kabel verzonden naar de control box die dan de MiStrip’s programmeert. Met één control box kunnen 20 MiStrip’s van 1500mm aangestuurd worden. Dit wegens vermogenbeperkingen.
Kris Sabbe
3AI1E0
Oostende 2007‐2008
Aansturen LED display via art‐net
31
3. Keuze van de componenten 3.1. Picdem.net2 development board Met het Picdem.net2 development board, die de PIC18F97J60 bevat en ethernet ondersteuning heeft, is de interface gemaakt om de UDP pakketten te ontvangen verstuurd via de Net‐lynx. Met de PIC wordt ook de data van de 24 kanalen van de lichttafel uitgelezen. Ik heb voor dit bord gekozen omdat dit aanwezig was op mijn stageplaats en het alle eigenschappen had die ik nodig had voor het uitwerken van mijn project. Nadat het uitlezen van de pakketten werkte ben ik begonnen met zelf een schakeling te maken met behulp van de datasheet van het development board zodat ik dit bord niet helemaal in mijn eindwerk moest gebruiken. figuur 16: Picdem.net2 development board
3.2. Pic 18F97J60 Deze PIC is een 1 Mbit flash microcontroller met ethernet ondersteuning. Deze PIC heb ik gekozen omdat deze ook in het Picdem.net development board zit. De PIC is IEEE 802.3™ compatibel en heeft geïntegreerde MAC en 10Base‐T PHY. De PIC heeft een verzend/ontvang buffer van 8‐Kbyte SRAM om data die ontvangen of verzonden wordt op te slaan. Ook heeft de PIC 2 8‐bit in/uit poorten die 25 mA kunnen leveren. Ideaal voor het aansturen van LED’s of kleine relais. Met de MPLAB ICD 2 wordt de PIC geprogrammeerd. Dit toestel wordt aangesloten op de pc door middel van een USB connector. Met dit toestel kan je het programma ook debuggen.
Kris Sabbe
figuur 17: MPLAB ICD 2
3AI1E0
Oostende 2007‐2008
Aansturen LED display via art‐net
32
3.3. Altera cyclone I FPGA FPGA staat voor Field Programmable Gate Array. Een FPGA valt onder de programmeerbare logica. Hieronder verstaat men geïntegreerde circuits (chips) waarvan de functie na de fysieke productie door de klant kan worden geconfigureerd. FPGA's zijn ontstaan uit de behoefte om grote digitale schakelingen in relatief kleine aantallen te realiseren. Vóór het FPGA‐ tijdperk moest alles met logische bouwstenen samengesteld worden, hetgeen erg veel tijd en printruimte kostte. Sinds de komst van de programmeerbare logica kunnen we zo'n schakeling als een soort programma schrijven (in bijvoorbeeld VHDL of Verilog), waarna het voor de chip gecompileerd wordt en in de chip "geladen". Op dezelfde manier is de schakeling ook weer eenvoudig te wijzigen. De basis van een FPGA is een array van identieke cellen welke op een aantal gedefinieerde manieren geconfigureerd kan worden. Zo'n cel bevat altijd tenminste een geheugenplaats (flipflop) voor 1 bit aan informatie met daarbij enkele logische poorten (AND, OR) welke de inhoud van deze of andere geheugenplaatsen controleren/bepalen. Door nu verschillende cellen aan elkaar te knopen kunnen verschillende functies worden gerealiseerd. De uiteindelijke functie van de FPGA wordt bepaald door de configuratie van iedere cel en de onderlinge verbindingen. Op deze manier kunnen zeer complexe digitale functies worden verkregen. Naast de FPGA is ook de CPLD (Complex Programmable Logic Device) een veel gebruikt programmeerbaar logisch IC. De goedkopere FPGA's worden meestal gebruikt in schakelingen waar men eenvoudige logische bewerkingen van signalen nodig heeft. (vergelijken, optellen aftrekken, verbindingen leggen, ...) Dit kan bv nuttig zijn om verschillende devices aan elkaar te hangen, of een adresdecoder te maken welke de processor aan de RAM, ROM en I/O hangt. Ook op het vlak van beveiliging tegen namaak is een FPGA interessant. Doordat de verbindingen in de FPGA niet zichtbaar zijn, is het interne programma zeer moeilijk te achterhalen. Men kan op de schakeling nu data gaan coderen op zo'n manier dat buitenstaanders er niets meer van snappen. Ik gebruik een FPGA van Altera. Zo’n chip is opgedeeld in 4 banken. Het voordeel van deze banken is dat ze op een verschillende spanning gevoed kunnen worden. Zodanig dat de I/O van deze bepaalde bank dan op dezelfde spanning werkt. Ze kunnen gevoed worden met volgende spanningen: 1.5‐V, 1.8‐V, 2.5‐V, en 3.3‐V. In mijn eindwerk is dit niet nodig, maar dit kan zeer handig zijn bij het gebruiken van IC’s die op lagere of hogere spanningen werken. figuur 18: banken FPGA Kris Sabbe
3AI1E0
Oostende 2007‐2008
Aansturen LED display via art‐net
33
Cyclone Device eigenschappen
(1) Hierbij zijn de klokpinnen bij gerekend. Tabel 4: eigenschappen FPGA Het kan met zijn 64 single purpose IO's geprogrammeerd worden naar de gebruiker zijn wensen. De Cyclone is opgebouwd uit logische elementen. Met deze logische elementen kan men verschillende hardwarecomponenten programmeren, bijvoorbeeld tellers, flipflops, registers, enzovoort. Dus: hoe meer logische elementen hoe meer men kan programmeren. Deze FPGA heeft 2910 Logic Elements (LEs). Deze Logic Elements worden nog eens per 10 gegroepeerd tot een LAB, een Logic Array Block. De LAB’s worden op hun beurt gegroepeerd in rijen en kolommen. Deze rijen en kolommen kan men onderling verbinden door de chip te programmeren en zo bekomt men een snel werkende hardware ontwerp. Er zijn ook lijnen en IO’s die geoptimaliseerd zijn om te functioneren als kloklijn. Kort overzicht:
tabel 5: overzicht EP1C3
Een nadeel van de FPGA die wij gebruiken is dat deze geen flash geheugen heeft. Dit wil zeggen dat we een externe Eprom nodig hebben om ons programma in te laden. Anders telkens we iets zouden programmeren, en we de spanning onderbreken, zou dit terug gewist worden. Dit is zeker niet gebruiksvriendelijk. In het gamma van Altera is dit voorzien, zodanig dat we hetzelfde merk kunnen nemen. Zo zijn we zeker dat ze compatibel zijn met elkaar. Wij gebruiken een EPC1 bouwsteentje. Dit IC heeft 8 pinnen en is gemakkelijk te verbinden met de FPGA. Dit is het aansluitingsschema met de FPGA. figuur 19: serial configuration device
Kris Sabbe
3AI1E0
Oostende 2007‐2008
Aansturen LED display via art‐net
34
figuur 20: programmeren via AS en JT Het programmeren kan op verschillende manieren gebeuren. Hieronder vind je het Cyclone FPGA configuratie tabel.
tabel 6: verschillende programmeermogelijkheden FPGA Ik gebruik de Active serial (AS) configuratie. Er is ook een JTAG configuratie voorzien. AS: In de AS configuratie, worden de Cyclone FPGA’s gevormd door de nieuwe seriële configuratie apparaten te gebruiken. Deze configuratie apparaten zijn low cost met een niet veranderlijk geheugen. Kenmerkend heeft deze een eenvoudige vier pin’s interface en een kleine omvang. Deze eigenschappen maken dit een ideale oplossing voor het vormen van goedkope Cyclone FPGA’s. De seriële configuratie verstrekt een seriële interface om data tot de configuratie toegankelijk te maken.
Kris Sabbe
3AI1E0
Oostende 2007‐2008
Aansturen LED display via art‐net
35
Gedurende deze configuratie, leest de Cyclone FPGA de data via de seriële interface in. Deze data wordt gereduceerd indien nodig. Hun SRAM cellen worden ook geconfigureerd. De seriële configuratie apparaten hebben een vier‐pin’s interface: seriële klokingang (DCLK), seriële data uitgang (DATA), AS data ingang (ASDI), en een actief chip select (nCS). Deze 4 pin’s interface verbindt de Cyclone FPGA zoals in figuur 20. JTAG: JTAG wordt gebruikt voor het monitoren van de hardware. JTAG staat voor: Joint Test Action Group. Met deze techniek kan van fan tot cpu worden gecontroleerd, zolang deze maar voldoet aan de standaard (IEEE1149.1). Een FPGA dat gebruikt wordt in JTAG‐mode gebruikt vier vereiste pinnen: TDI (Test Data Input), TDO (Test Data Output), TMS (Test Mode Select) en TCK (Test Clock Input). De drie JTAG ingangspinnen, TCK, TDI en TMS, hebben interne pull‐up weerstanden die liggen tussen 20 en 40 kΩ. Alle gebruikte I/O pinnen zijn tri‐state tijdens de JTAG‐ configuratie. Tijdens de JTAG‐configuratie, wordt de data gedownload in de FPGA. Hiervoor kunnen verschillende kabels gebruikt worden, nl. de USB Blaster, ByteBlaster II, ByteBlasterMV of MasterBlaster. In mijn toepassing gebruik ik de USB blaster.
Kris Sabbe
3AI1E0
Oostende 2007‐2008
Aansturen LED display via art‐net
36
3.4. TFP410 De TFP410 is een 64 pins Digital Transmitter in een TQFP package van Texas Instruments. Het is DVI compliant en kan functioneren op een voedingsspanning van 3,3Volt. Dit IC zet 23 bit of 12 bit digitale beeld data om in differentiële/analoge beeld data op een maximale klok van 165 MHz. Deze klok kan dual edge zijn. Het IC is ook aanstuurbaar via I²C. In deze toepassing zetten we op de negatieve flank van een 32 MHz klok, 24 bit kleurdata om in 3 differentieel datalijnen en 1 differentiële klok. figuur 21: pin layout TFP‐410
Kris Sabbe
figuur 22: blokschema TFP‐410
3AI1E0
Oostende 2007‐2008
Aansturen LED display via art‐net
37
3.5. HIN202 Dit ic is een omzetter van RS‐232 naar TTL en omgekeerd. Het grote voordeel van dit IC is dat het op een spanning van +5V werkt. Door het aansluiten van vier condensatoren genereert dit IC door middel van een charge pump en een voltage convertor een spanning van +10V en ‐10V.
Kris Sabbe
figuur 23: Blokschema HIN202
3AI1E0
Oostende 2007‐2008
Aansturen LED display via art‐net
38
3.6. MAX489 Dit IC wordt gebruikt voor het doorzenden van het RS‐232 signaal over de DVI‐kabel. De reden daarvoor is dat we een gebalanceerd signaal nodig hebben om mee te zenden met de DVI‐kabel.
figuur 24: Aansluiting MAX489
3.7. Ontkoppelcondensatoren Waarom ontkoppelcondensatoren In elk elektronisch apparaat willen we voorkomen dat de diverse deelcircuits elkaar beïnvloeden. Eén van de beïnvloedingsmogelijkheden is via de gemeenschappelijke voedingsspanning. Ontkoppelcondensatoren (tussen voedingsspanning en massa) moeten er voor zorgen dat signalen van het ene circuit niet via de voedingsleidingen in een ander circuit terecht komen. Vooral in digitale circuits waar vaak zeer hoogfrequente signalen omgaan moeten goede ontkoppelcondensatoren gebruikt worden, en deze moeten ook met zo kort mogelijke verbindingen aangesloten worden op de geïntegreerde circuits. Dit zal bij alle IC’s gebeuren.
Kris Sabbe
3AI1E0
Oostende 2007‐2008
Aansturen LED display via art‐net
39
3.8. Lichttafel en netlynx Als lichttafel wordt de Showtec Showmaster 24 gebruikt. Dit is een 24 kanaal lichttafel die zijn data in DMX uitzend. Om deze data om te zetten naar art‐net wordt de Net‐lynx van Artistic license. Met de lichttafel kunnen er 8 MiStrip’s aangestuurd worden als je voor elke MiStrip 3 kanalen gebruikt. Telken één kanaal voor rood, groen en blauw. Er kunnen ook programma’s of scènes opgeslagen worden in de tafel. Met de Net‐lynx wordt de data van de lichttafel omgevormd van DMX naar Art‐net. Figuur 25 is een afbeelding van de lichttafel en net‐lynx
Kris Sabbe
figuur 25: Showmaster 24 en Net‐lynx
3AI1E0
Oostende 2007‐2008
Aansturen LED display via art‐net
40
3.9. Software 3.9.1. Mplab Met dat softwarepakket bijgeleverd bij het Picdem.net2 development board is het programma voor de PIC gemaakt. Als basis voor het programma is een demoprogramma overgenomen waarin de initialisatie van de PIC en ethernetverbinding gebeurt. Dit programma is dan uitgebreid zodat je er UDP‐ paketten mee kan ontvangen, de data eruit lezen en die data doorzenden naar de FPGA. Het programmeren gebeurt in c18, een soort C taal. 3.9.2. Quartus II Met dit softwarepakket, die gratis te downloaden is via een studentenlicentie, wordt het programma voor de FPGA gemaakt. 3.9.3. Microsoft Network Monitor 3.1 Met Microsoft Network Monitor 3.1, die gratis te downloaden is heb worden de UDP pakketten, verzonden door de Net‐lynx, binnengelezen om te zien hoe de UDP‐ pakketten eruit zien. De data is telkens omkaderd in blauw. In figuur 26 staan alle schuifbalken op de lichttafel omhoog. In figuur 27 staan enkel de eerste en laatste schuifbalk omhoog.
figuur 26: ontvangen UDP‐pakket met alle schuifbalken omhoog
Kris Sabbe
3AI1E0
Oostende 2007‐2008
Aansturen LED display via art‐net
41
figuur 27: ontvangen UDP‐pakket met de eerste en laatste schuifbalk omhoog
Kris Sabbe
3AI1E0
Oostende 2007‐2008
Aansturen LED display via art‐net
42
3.9.4. Barco director toolset V1.6 Met deze software worden door middel van een RS‐232 verbinding de LED‐displays ingesteld. Op de eerste plaats wordt de positie van de displays ingesteld zodat de control box weet welk beeld er op welk display moet verschijnen. Alsook kan de helderheid en kleurintensiteit ingesteld worden. De LED‐displays kunnen ook gekalibreerd worden zodat elk afzonderlijk display dezelfde helderheid en kleurintensiteit vertoont. Op figuur 28 kan je de helderheid, kleurintensiteit en frequentie instellen van de displays.
Kris Sabbe
figuur 28: instellen MiStrip
3AI1E0
Oostende 2007‐2008
Aansturen LED display via art‐net
In figuur 29 zie je de acht MiStrip’s die aan de control box hangen. De vier bovenste hangen aan één uitgang van de control box en zijn rood gekleurd. De vier onderste hangen aan een tweede uitgang van de control box en zijn groen gekleurd. De kleur van de MiStrip’s zelf is dan ook gelijk aan de kleur zoals weergegeven op het beeldscherm. Opmerking: de kleur van de drie bovenste displays wijkt af omdat op deze MiStrip’s een diffusor is geplaatst. Deze verspreid het licht beter dan een gewone MiStrip.
Kris Sabbe
43
figuur 29: MiStrip’s in testopstelling
figuur 30: MiStrip’s geplaatst in director toolset
3AI1E0
Oostende 2007‐2008
Aansturen LED display via art‐net
44
In figuur 31 wordt de positie van de displays toegewezen. De MiStrip’s die ik heb gebruikt heb ik ingesteld op X positie 50 en Y positie 50. De horizontale resolutie is gelijk aan 112 pixels. Dit is het aantal LED’s dat één MiStrip bezit. De verticale resolutie is 8 pixels. Dit is het aantal MiStrip’s dat gebruikt is. figuur 31: Instellen positie MiStrip’s
Kris Sabbe
3AI1E0
Oostende 2007‐2008
Aansturen LED display via art‐net
45
4. Uitwerking en problemen 4.1. Uitwerking Ik ben begonnen met de software te schrijven voor het uitlezen van de data uit de UDP pakketten. Daarvoor heb ik gebruikt gemaakt van het Picdem.net2 development board van Microchip. Eerst heb ik enkele basisprogramma’s gemaakt om te leren programmeren in Mplab en te zien wat de functies van het bord zijn. Na enkele basisprogramma’s gemaakt te hebben ben ik begonnen met het bestuderen van een demoprogramma, bijgeleverd bij het development board, waarin de ethernet initialisatie gebeurt. Na het bestuderen en begrijpen van dit demoprogramma heb ik aanpassingen gemaakt zodat ik er UDP pakketten mee kon lezen. Na het lezen van de pakketten moest ik de data ook nog uit deze pakketten halen. Dit heb ik getest door uit dat ontvangen pakket de data van de eerste schuifbalk op de lichttafel te halen, en deze op de LED’s te plaatsen. Nadat dit werkte heb ik mijn programma nog verder uitgebreid zodat ik alle 24 kanalen van de lichttafel kon uitlezen. Ook heb ik er een beveiliging ingestoken zodat UDP pakketten die niet van de lichttafel komen geen invloed hebben op de data zodat er geen foute data binnen gelezen kan worden. Nadat dit werkte ben ik begonnen met het maken van de schakeling en print. De schakeling van de PIC heb ik grotendeels overgenomen uit de datasheet van het Picdem.net2 development board. De schakeling voor de FPGA is overgenomen uit de datasheet. De schakeling voor de TFP‐410 (digitale transmitter) heb ik deels overgenomen van een schakeling van Barco en deels uit de datasheet. Bij de PIC heb ik vijf ingangen voor drukknoppen. Eén daarvan is de reset knop. De andere vier zijn drukknoppen om programma’s te kiezen. Op één uitgangsbank van de PIC, die 25 mA kan leveren, heb ik 8 LED’s aangesloten zodat er een visuele indicatie is. Tussen de PIC en FPGA zijn er nog eens 2 banken voorzien voor overdracht van data en synchronisatiepulsen. Tussen de FPGA en de TFP‐410 zijn er 34 datalijnen voorzien. 24 daarvan zijn voor de overdracht van de kleurinformatie. Telkens 8 bits voor rood, groen en blauw. De andere datalijnen zijn voor horizontale/verticale synchronisatie, blanking, enable, klok, power down en keuze tussen positieve en negatieve flankdetectie. Terwijl de print besteld was ben ik begonnen met het maken van het programma voor de FPGA. Door een handige simulator in het softwarepakket kon ik de programma’s ook simuleren.
Kris Sabbe
3AI1E0
Oostende 2007‐2008
Aansturen LED display via art‐net
46
Toen ik de print heb ontvangen ben ik begonnen met het in delen solderen van de print. Eerst de voeding. Nadien ben ik begonnen met het solderen van de PIC. Na het solderen van de PIC heb ik die getest maar kon hem niet programmeren. Na het nog eens goed controleren van de schakeling heb ik ondervonden dat ik twee draden omgewisseld heb om te programmeren. Na het omwisselen van die draden werkte het programmeren wel. Toen de PIC werkte ben ik begonnen met het solderen van de FPGA. Tijdens het testen bleek dat ik deze moeilijk kon programmeren. De ene keer ging dit wel maar de andere keer kreeg ik een error tijdens het programmeren. Dit probleem heb ik opgelost door pull‐up weerstanden te plaatsen aan de klemmen voor het programmeren. Nadat de FPGA werkte ben ik begonnen met het solderen van de TFP‐410. Toen ik mijn eindwerk voor de eerste keer aansloot op een LED display kreeg ik geen beeld. Ik heb dan de DVI signalen gemeten en deze bleken te klein te zijn. Na het aanpassen van een weerstand was dit probleem verholpen. Voor mijn eerste beeld op het LED display had ik een programma geschreven zodat heel het display wit oplichtte. Nadat dit werkte ben ik begonnen met maar één horizontale lijn aan te sturen. Dit bleek moeilijker dan verwacht want het beeld rolde heel de tijd van boven naar beneden. Na het wijzigen van de synchronisatiepulsen was dit probleem opgelost. Toen heb ik enkele demoprogramma’s geschreven zodat mijn eindwerk ook beeld op het display kan krijgen zonder dat er een lichttafel op aangesloten is. Deze demoprogramma’s zijn: • Lus waarin de kleuren rood, groen, blauw, wit en zwart verschijnen op het display. • Programma waarin het display geleidelijk aan van zwart naar wit oplicht. Hierna ben ik begonnen met het aanpassen van de software zodat ik met de lichttafel acht MiStrip’s kon aansturen. Tijdens het testen heb ik ook ondervonden dat de spanningsstabilisator 7805 zeer warm werd. Dit kwam door het feit dat de ingangsspanning 9,5V was en het IC teveel vermogen moest dissiperen. Dit heb ik dan opgelost door enkele dioden in serie voor de spanningsstabilisator te plaatsen. De TFP‐410 ging redelijk rap stuk. Dit probleem was te wijten aan een vergeten massaverbinding. Na het aansluiten van die massaverbinding was het probleem opgelost. Kris Sabbe
3AI1E0
Oostende 2007‐2008
Aansturen LED display via art‐net
47
Figuur 32 is een foto van de print met de verschillende delen aangeduid.
figuur 32: gesoldeerde print Nadat alles werkte ben ik begonnen met het maken van de behuizing. Figuur 33 is een foto van de binnenkant van de behuizing.
Kris Sabbe
figuur 33: binnenkant behuizing
3AI1E0
Oostende 2007‐2008
Aansturen LED display via art‐net
48
4.2. Metingen • Metingen op de voeding De voeding heb ik als eerste gemaakt. De spanningen komen overeen met de opgegeven spanningen in de datasheet. De spanningen zijn goed afgevlakt want er is geen enkele rimpel waarneembaar. Tijdens het testen ondervond ik dat de spanningsregelaar van 5V, de 7805, redelijk warm werd. De reden hiervoor was doordat de voedingsspanning 9,6V was en het IC teveel vermogen moest dissiperen. Dit heb ik dan opgelost door enkele dioden in serie ervoor te plaatsen zodat de voedingsspanning daalt.
figuur 34: scoopbeeld: voedingsspanning
• Vermogenverbruik. Het toestel gebruikt ongeveer 1,28A op een spanning van 9,48V. Het vermogen dat het toestel gebruikt is 12,13Watt. Eén enkele MiStrip verbruikt 46 Watt nodig wanneer deze wit beeld geeft op de volle lichtsterkte. Dus voor de 8 MiStrip’s die ik gebruik is er 368 Watt nodig. Kris Sabbe
3AI1E0
Oostende 2007‐2008
Aansturen n LED displaay via art‐neet
49
n op de PIC C • Metingen o Klo okfrequenttie van 25M MHz
figuur 35: sscoopbeeld d: 25MHz
o Leeespulsen vverzonden van de PIC C naar de FPGA om dee data binn nen te lezzen. Er zijn 24 leespulsen. De to otale tijd om m de data te verzend den uit dee PIC en bin nnen te lezen in de FP PGA is 24,2 20µs.
Kris Saabbe
Figuur36: scoopbeeld d: leespulsen n
3AI1E0
O Oostende 2007‐2008
50
Aansturen n LED displaay via art‐neet
o Tijd van één leespuls
figuur 37: scoopbeeld d: één leespuls
wee leespu ulsen o Tijd tussen tw
Kris Saabbe
figuur 38: sscoopbeeld d: tijd tussen n 2 leespulseen
3AI1E0
O Oostende 2007‐2008
Aansturen LED display via art‐net
51
o 5‐bits teller die meegezonden wordt zodat de FPGA weet welke data hij ontvangt.
Kris Sabbe
figuur 39: scoopbeeld: Teller
3AI1E0
Oostende 2007‐2008
Aansturen n LED displaay via art‐neet
52
n op de FPG GA • Metingen o Klo okfrequenttie van de FPGA. Deze frequenttie is 32MH Hz en word dt op pgewekt meet een kristaloscillato or.
figuur 40: sscoopbeeld:: 32MHz
H_sync ben neden o Daata enable boven en H
Kris Saabbe
figuur 41: sscoopbeeld:: data enable en H_syn nc
3AI1E0
O Oostende 2007‐2008
Aansturen n LED displaay via art‐neet
53
o H__sync boven en V_Syn nc beneden.
f figuur 42: s coopbeeld: H_sync en V_sync
• Metingen n op de TFP P‐410 o Dee klok van 3 32MHz, op pgewekt do oor de VCO O, wordt oo ok aangeslo oten op dee TFP‐410. D Deze klok h hebben we e nodig om m een beeld d te genere eren van 840 pixels op 635 p pixels met een refresh rate van 60Hz. 40*635*60 = 32MHz. 84 Heet bovenstee beeld is TTXC‐ en hett onderste TXC+.
Kris Saabbe
3AI1E0
O Oostende 2007‐2008
Aansturen n LED displaay via art‐neet
figuur 43: sscoopbeeld d: TXC‐ en TX XC+
54
• Netwerkb belasting De UDP p pakketten w worden meet een gem middelde sn nelheid van n 11,2kB/s verzonden. Dit is geemeten wanneer de lichttafel co onstant an ndere data d door gebrruik te makken van de e fader. Perr uur komtt dit dan on ngeveer doorzend overeen m met 40MB. 40416KB Æ Æ 39,47MB B. 336,8KB ** 2 * 60 = 4
Kris Saabbe
figuur 44: netwerkbeelasting
3AI1E0
O Oostende 2007‐2008
Aansturen LED display via art‐net
55
4.3. Schakeling 1. Voeding Voeding van 8V, 5V, 3.3V en 1.5V. 2. Drukknoppen Eén drukknop om de PIC te resetten en vier drukknoppen voor keuze tussen programma’s. 3. Connector programmeren PIC Via een RJ11 connector programmeren we de PIC. 4. Ethernet connector Standaard ethernet connector met 2 LED’s. 5. Kristal 25MHz Klok met een frequentie van 25MHz voor de PIC. 6. LED’s 8 LED’s die aan een uitgang van de PIC hangen ter indicatie. 7. PIC18F97J60 Met deze PIC gebeurt de ethernet interface en het lezen van de UDP pakketten. 8. Connectoren programmeren FPGA en EPC1 Connectoren voor het programmeren van de FPGA en de EPC1 (serial configuration device). 9. FPGA FPGA, Altera Cyclone I. Met deze FPGA gebeurt de beeldopbouw. 10. VCO 32MHz Voltage controlled oscillator. Klokfrequentie van 32MHz voor de FPGA. 11. EPC1 De FPGA verliest zijn programma als de voedingsspanning afgelegd is. Met de EPC1 (serial configuration device) programmeren we de FPGA als we de spanning van het toestel aanleggen. 12. RS232 verbinding Verbinding voor het in te stellen van de MiStrip’s. (O.a. helderheid, positie) 13. TFP410 Dit is een digitale omzetter en zet de beeldopbouw gegenereerd in de FPGA om naar een DVI signaal. 14. DVI connector DVI connector om het DVI beeld aan te sluiten op een control box. Kris Sabbe
3AI1E0
Oostende 2007‐2008
Aansturen LED display via art‐net
56
figuur 45: schakeling deel 1
Kris Sabbe
3AI1E0
Oostende 2007‐2008
Kris Sabbe
Aansturen LED display via art‐net
57
Figuur 46: schakeling deel 2 3AI1E0
Oostende 2007‐2008
Aansturen LED display via art‐net
58
4.4. Ontwerp van de print Bij het ontwerpen van de print moest ervoor gezorgd worden dat alle voedingsspanningen aan de ic’s ontkoppeld werden. Dit om ervoor te zorgen dat er geen stoorpieken op de voeding kwamen. Ook moest ervoor gezorgd worden dat de verbindingen voor de ethernet verbinding en het DVI‐signaal zo kort mogelijk waren. De reden daarvoor is de hoge frequenties van deze signalen. De print die ik gemaakt heb, is een vierlaags print geworden. De bovenlaag en de twee tussenlagen zijn alle drie lagen waar gewone verbindingen gemaakt worden. De onderste laag is het massavlak.
4.5. Beeldopbouw 4.5.1. Geschiedenis De geschiedenis van bewegend beeld begon bij de film. Men nam dia’s van een bepaalde gebeurtenis. Deze dia’s projecteerden ze op een wit doek met een zodanige snelheid dat het oog niet kon onderscheiden dat het stilstaande beelden zijn. Om precies te zijn is deze snelheid boven 25 beelden per seconde. Hierna begon men de ontwikkeling van de kathodestraalbuis. Het principe hiervan is dat men een elektronenstroom afschiet naar een fluorescerende laag. Deze laag begint op te lichten wanneer er elektronen tegenvallen. Met spoelen kan men deze elektronenstraal afbuigen en kan er een beeld gevormd worden. Wanneer we nu deze beelden vlug laten veranderen zien we een bewegend beeld. Vandaag zijn er digitale beeldschermen. Deze werken niet meer met een elektronenstraal die op een fluolaag worden geprojecteerd, maar wel met led’s die met een sturingseenheid wel of niet oplichten. figuur 47: kathodestraalbuis
Kris Sabbe
3AI1E0
Oostende 2007‐2008
Aansturen LED display via art‐net
59
4.5.2. Blanking Om de spoelen van rechts naar links te laten bewegen na een geprojecteerde lijn moest een snelle verandering in de spoelen teweeg gebracht worden, hetzelfde geldt voor de beweging op het einde van het beeld wanneer men terug naar boven moet met de elektronenstraal. Dit is onmogelijk omdat de spoelen anders een te hoge inductiestroom zouden genereren. Blanking is de oplossing voor dit probleem. Tijdens de terugkeer van de elektronenstraal zorgt men ervoor dat er geen beeld geschreven wordt, dit noemen we blanking omdat we de elektronenstraal uitschakelen. In digitale beeldschermen moet de blanking tijd in principe niet zo groot zijn als bij analoge beeldschermen omdat er in een digitaal beeldscherm geen mechanische veranderingen nodig zijn voor het weergeven van beeld. Dit wordt meestal wel gedaan voor de compatibiliteit met analoge beeldschermen. In mijn eindwerk genereer ik een beeld met een resolutie van 840 x 635 pixels met een refresh rate van 60Hz. Het beeld dat zichtbaar is heeft een resolutie van 830 x 625 pixels. Voor zowel de verticale als horizontale synchronisatie blanking zijn 10 klokpulsen genomen.
figuur 48: beeldopbouw
Kris Sabbe
3AI1E0
Oostende 2007‐2008
Aansturen LED display via art‐net
60
4.6. Code PIC Voor het uitwerken van de code voor de PIC is een demoprogramma, bijgeleverd bij het Picdem.net2 development board, overgenomen. In dit demoprogramma gebeurt de initialisatie van de PIC en de ethernetverbinding. In dit demoprogramma is dan code toegevoegd voor het uitlezen van UDP‐ pakketten. Uit deze pakketten wordt dan de data van de 24 schuifbalken gehaald. Deze data wordt dan doorgezonden naar de FPGA.
Code voor het instellen van het IP en MAC adres Remote.IPAddr.Val=0x47071802; //IP-adres van het toestel die de UDP-paketten verzendt in hex formaat 2.24.7.71 Remote.MACAddr.v[0]=0x00; //MAC-adres van het toestel dat uitzendt Remote.MACAddr.v[1]=0x06; Remote.MACAddr.v[2]=0xA6; Remote.MACAddr.v[3]=0x01; Remote.MACAddr.v[4]=0x07; Remote.MACAddr.v[5]=0x47;
Openen van een UDPsocket // Openen van een UDP socket op poort 0x1936 MySocket = UDPOpen(0x1936, &Remote, 0x1936); // voor art-net altijd poort 0x1936 (6454 decimaal)
Binnenlezen van de data UDPGet(&c); //Eerste byte van het UDP-pakket lezen if (c==0x41) //Als deze byte gelijk is aan 0x41 (A), dan gaan we verder { while(UDPGet(&c)) //Lezen van het UDP-pakket { udpRxBuf[udpRxBufPut++] = c; //Byte lezen van UDP-pakket en opslaan in buffer if (udpRxBufPut >= 49) //Als we 49 bytes binnen gelezen hebben stoppen we. We hebben dan namelijk alle data die we moeten hebben. { break; //uit de lus springen als we 49 bytes hebben binnengelezen } }
Kris Sabbe
3AI1E0
Oostende 2007‐2008
Aansturen LED display via art‐net
61
Verzenden van de data ontv = udpRxBuf[17]; PORTF = ontv; PORTDbits.RD2 = 0; PORTDbits.RD3 = 0; PORTDbits.RD4 = 0; PORTHbits.RH1 = 0; PORTHbits.RH2 = 0; PORTDbits.RD1 = 1; PORTDbits.RD1 = 0;
//De data van de eerste schuifbalk staat op positie 17 //De data op PORTF plaatsen //teller =00000 //teller //teller //teller //teller //lees = 1 //lees = 0
ontv = udpRxBuf[18]; PORTF = ontv; PORTDbits.RD2 = 1; PORTDbits.RD3 = 0; PORTDbits.RD4 = 0; PORTHbits.RH1 = 0; PORTHbits.RH2 = 0; PORTDbits.RD1 = 1; PORTDbits.RD1 = 0;
//Data van de tweede schuifbalk //Data op PORTF plaatsen //teller =00001
ontv = udpRxBuf[39]; PORTF = ontv; PORTDbits.RD2 = 0; PORTDbits.RD3 = 1; PORTDbits.RD4 = 1; PORTHbits.RH1 = 0; PORTHbits.RH2 = 1; PORTDbits.RD1 = 1; PORTDbits.RD1 = 0; ontv = udpRxBuf[40]; PORTF = ontv; PORTDbits.RD2 = 1; PORTDbits.RD3 = 1; PORTDbits.RD4 = 1; PORTHbits.RH1 = 0; PORTHbits.RH2 = 1; PORTDbits.RD1 = 1; PORTDbits.RD1 = 0;
//lees = 1 //lees = 0
//Data van de tweede schuifbalk //Data op PORTF plaatsen //teller =10110
//lees = 1 //lees = 0 //Data van de tweede schuifbalk //Data op PORTF plaatsen //teller =10111
//lees = 1 //lees = 0
//de teller terug op 0 zetten PORTDbits.RD2 = 0; PORTDbits.RD3 = 0; PORTDbits.RD4 = 0; PORTHbits.RH1 = 0; PORTHbits.RH2 = 0;
//teller =00000
Kris Sabbe
3AI1E0
Oostende 2007‐2008
Aansturen LED display via art‐net
62
Code voor het kiezen tussen de 4 programma’s if(PORTBbits.RB0 == 0) { led1aan++; if (led1aan==1) { PORTDbits.RD0 = 1; PORTJbits.RJ2 = 1; PORTDbits.RD0 = 0; } if (led1aan>=2) { PORTDbits.RD0 = 1; PORTJbits.RJ2 = 0; PORTDbits.RD0 = 0; led1aan=0; } for(t = 0; t<500000 ; t++); }
//Drukken op drukknop 1 //Teller //RD0 = 1 Î Puls op RD0 //LED 1 aan //RD0 = 0
//RD0 = 1 Î Puls op RD0 //LED 1 uit //RD0 = 0 //Delay Î ontdenderen
if(PORTBbits.RB1 == 0) { led2aan++; if (led2aan==1) { PORTDbits.RD7 = 1; PORTJbits.RJ3 = 1; PORTDbits.RD7 = 0; } if (led2aan>=2) { PORTDbits.RD7 = 1; PORTJbits.RJ3 = 0; PORTDbits.RD7 = 0; led2aan=0; } for(t = 0; t<500000 ; t++); }
//Drukken op drukknop 2
if(PORTBbits.RB2 == 0) { led3aan++; if (led3aan==1) { PORTDbits.RD5 = 1; PORTJbits.RJ6 = 1; PORTDbits.RD5 = 0; } if (led3aan>=2) { PORTDbits.RD5 = 1; PORTJbits.RJ6 = 0; PORTDbits.RD5 = 0; led3aan=0; } for(t = 0; t<500000 ; t++);
//Drukken op drukknop 3
//Teller //RD7 = 1 Î Puls op RD7 //LED 2 aan //RD7 = 0
//RD7 = 1 Î Puls op RD7 //LED 2 uit //RD7 = 0 //Delay Î ontdenderen
//Teller //RD5 = 1 Î Puls op RD5 //LED 3 aan //RD0 = 0
//RD5 = 1 Î Puls op RD5 //LED 3 uit //RD0 = 0 //Delay Î ontdenderen
}
Kris Sabbe
3AI1E0
Oostende 2007‐2008
Aansturen LED display via art‐net
if(PORTBbits.RB3 == 0) { led4aan++; if (led4aan==1) { PORTDbits.RD6 = 1; PORTJbits.RJ1 = 1; PORTDbits.RD6 = 0; } if (led4aan>=2) { PORTDbits.RD6 = 1; PORTJbits.RJ1 = 0; PORTDbits.RD6 = 0; led4aan=0; } for(t = 0; t<500000 ; t++);
63
//Drukken op drukknop 4 //Teller //RD6 = 1 Î Puls op RD6 //LED 4 aan //RD0 = 0
//RD6 = 1 Î Puls op RD6 //LED 4 uit //RD0 = 0 //Delay Î ontdenderen
}
Kris Sabbe
3AI1E0
Oostende 2007‐2008
Aansturen LED display via art‐net
64
4.7. Code FPGA Software voor de syncpulsen
figuur 49: software voor sync‐pulsen
Code H_sync // Port Declaration // {{ALTERA_IO_BEGIN}} DO NOT REMOVE THIS LINE! input klokje; //Declareren van de variabelen output H_sync; output blank; output tel_0; reg H_sync; reg blank; reg [19:0] teller; reg tel_0; // {{ALTERA_IO_END}} DO NOT REMOVE THIS LINE! always @ (posedge klokje) //Uitvoeren bij iedere positieve flank van de klok begin if(teller < 830) blank <=0; //als de teller <830 is blank=0 if(teller >= 830 && teller <835) //blank =1 als teller tussen 830 en 835 begin blank <=1; end if(teller >=835 && teller <840) //H_sync = 1 en blank = 1 begin H_sync <=1; blank <=1; end if(teller >= 840) begin //teller terug op 0 als teller =840 H_sync <=0; blank <=0; //blank en H_sync ook terug 0 teller =0; end teller = teller + 1;//Bij iedere klokpuls de teller laten optellen end endmodule
Kris Sabbe
3AI1E0
Oostende 2007‐2008
Aansturen LED display via art‐net
65
Code V_sync // Port Declaration // {{ALTERA_IO_BEGIN}} DO NOT REMOVE THIS LINE! input klokje; //Declareren van de variabelen output V_sync; output blank; output tel_0; reg V_sync; reg blank; reg [19:0] teller; reg tel_0; // {{ALTERA_IO_END}} DO NOT REMOVE THIS LINE! always @ (posedge klokje) //Uitvoeren bij iedere positieve flank van de klok begin if(teller < 533390) blank <=0; //als de teller <533390 is blank=0 if(teller >= 533390 && teller <533395) //blank =1 begin blank <=1; end if(teller >= 533395 && teller <533400) //V_sync = 1 en blank = 1 begin V_sync <=1; blank <=1; end if(teller >= 533400) begin //teller terug op 0 als teller =533400 V_sync <=0; //533400 = 840 * 635 blank <=0; //blank en V_sync ook terug 0 teller =0; end teller = teller + 1; //Bij iedere klokpuls de teller laten optellen end endmodule
Kris Sabbe
3AI1E0
Oostende 2007‐2008
Aansturen LED display via art‐net
66
Software voor de beeldopbouw Dit programma wordt gekozen door het indrukken van de eerste (linkse) drukknop. Zie punt 5 blz. voor meer info over dit programma.
figuur 50: software voor de beeldopbouw
Code voor de beeldopbouw //Code voor het inlezen van de data always //@(posedge lees) begin if(teller >=0 && teller <=25) begin if (lees ==1 && enable==1) begin datain0[teller] <= data0; datain1[teller] <= data1; datain2[teller] <= data2; datain3[teller] <= data3; datain4[teller] <= data4; datain5[teller] <= data5; datain6[teller] <= data6; datain7[teller] <= data7; end end end
Kris Sabbe
3AI1E0
//Uitvoeren bij positieve flank op lees //(verzonden uit PIC) //Enkel als de teller tussen 0 en 25 is //(verzonden uit PIC) //Uitvoeren als lees en enable 1 zijn //Verzonden uit PIC //Inlezen van de data en opslaan //24 x 8bit = 192bits
Oostende 2007‐2008
Aansturen LED display via art‐net
//Genereren van de beeldopbouw always @(posedge klok) begin if(enable==1) begin if(teller_H == 840) begin teller_H=0; teller_V = teller_V+1; end if(V_sync == 1) begin teller_H=0; teller_V=0; end if(blank==1) begin teller_H=0; end teller_H = teller_H+1;
case(teller_V)
67
//Uitvoeren bij een positieve flank van de klok //Enkel als enable = 1 (data uit PIC)
//Resetten van Horizontale teller //Verticale teller+1 //Wanneer de vertical sync 1 is uitvoeren //Reset Horizontale en vertical teller
//Uitvoeren bij blank =1 //Resetten van horizontale teller //Horizontale teller + 1
//Case vertical teller, output
50: begin //Aansturen bovenste MiStrip uit5 <= datain0[0]; //data1 rood uit10 <= datain1[0]; //data2 rood uit0 <= datain2[0]; //data3 rood uit1 <= datain3[0]; //data4 rood uit2 <= datain4[0]; //data5 rood uit3 <= datain5[0]; //data6 rood uit4 <= datain6[0]; //data7 rood uit6 <= datain7[0]; //data8 rood uit11 <= datain0[1]; uit16 <= datain1[1]; uit7 <= datain2[1]; uit8 <= datain3[1]; uit9 <= datain4[1]; uit12 <= datain5[1]; uit13 <= datain6[1]; uit14 <= datain7[1];
//data1 groen //data2 groen //data3 groen //data4 groen //data5 groen //data6 groen //data7 groen //data8 groen
uit17 <= datain0[2]; uit23 <= datain1[2]; uit15 <= datain2[2]; uit18 <= datain3[2]; uit19 <= datain4[2]; uit20 <= datain5[2]; uit21 <= datain6[2]; uit22 <= datain7[2];
//data1 blauw //data2 blauw //data3 blauw //data4 blauw //data5 blauw //data6 blauw //data7 blauw //data8 blauw
end
Kris Sabbe
3AI1E0
Oostende 2007‐2008
Aansturen LED display via art‐net
68
51: begin //Aansturen 2de MiStrip uit5 <= datain0[3]; uit10 <= datain1[3]; uit0 <= datain2[3]; uit1 <= datain3[3]; uit2 <= datain4[3]; uit3 <= datain5[3]; uit4 <= datain6[3]; uit6 <= datain7[3]; uit11 <= datain0[4]; uit16 <= datain1[4]; uit7 <= datain2[4]; uit8 <= datain3[4]; uit9 <= datain4[4]; uit12 <= datain5[4]; uit13 <= datain6[4]; uit14 <= datain7[4]; uit17 <= datain0[5]; uit23 <= datain1[5]; uit15 <= datain2[5]; uit18 <= datain3[5]; uit19 <= datain4[5]; uit20 <= datain5[5]; uit21 <= datain6[5]; uit22 <= datain7[5]; end 57: begin //Aansturen 8ste MiStrip uit5 <= datain0[21]; uit10 <= datain1[21]; uit0 <= datain2[21]; uit1 <= datain3[21]; uit2 <= datain4[21]; uit3 <= datain5[21]; uit4 <= datain6[21]; uit6 <= datain7[21]; uit11 <= datain0[22]; uit16 <= datain1[22]; uit7 <= datain2[22]; uit8 <= datain3[22]; uit9 <= datain4[22]; uit12 <= datain5[22]; uit13 <= datain6[22]; uit14 <= datain7[22]; uit17 <= datain0[23]; uit23 <= datain1[23]; uit15 <= datain2[23]; uit18 <= datain3[23]; uit19 <= datain4[23]; uit20 <= datain5[23]; uit21 <= datain6[23]; uit22 <= datain7[23]; end endcase end
Kris Sabbe
3AI1E0
Oostende 2007‐2008
Aansturen LED display via art‐net
if(enable==0) begin uit0 <= 1'b0; uit1 <= 1'b0; uit2 <= 1'b0; uit3 <= 1'b0; uit4 <= 1'b0; uit5 <= 1'b0; uit6 <= 1'b0; uit7 <= 1'b0; uit8 <= 1'b0; uit9 <= 1'b0; uit10 <= 1'b0; uit11 <= 1'b0; uit12 <= 1'b0; uit13 <= 1'b0; uit14 <= 1'b0; uit15 <= 1'b0; uit16 <= 1'b0; uit17 <= 1'b0; uit18 <= 1'b0; uit19 <= 1'b0; uit20 <= 1'b0; uit21 <= 1'b0; uit22 <= 1'b0; uit23 <= 1'b0; end
69
//Uitvoeren als enable = 0 //Alle uitgangsbits op 0 zetten Î geen beeld
end endmodule
Kris Sabbe
3AI1E0
Oostende 2007‐2008
Aansturen LED display via art‐net
70
5. Werking van het toestel 5.1. Achterpaneel Op het achterpaneel worden de voeding, RS‐232 en ethernet kabel aangesloten. Voor de ethernet kabel moet een crossed kabel gebruikt worden. De RS‐232 verbinding is voor het instellen van de LED‐displays. Op het achterpaneel zit ook een zekeringhouder.
figuur 51: achterpaneel
5.2. Frontpaneel
Op het frontpaneel hebben we vier drukknoppen en de DVI uitgang. Als signalisatie dat de drukknop actief is, brandt er een LED. Het DVI‐signaal kan enkel maar gebruikt worden voor het aan te sturen van Barco LED‐displays. Dit komt door het feit dat Barco enkele draden heeft omgewisseld. Bij mij is dit echter softwarematig gebeurd zodat je door verandering van de software een gestandaardiseerd DVI‐signaal krijgt. In het toestel zitten enkele verschillende programma’s. figuur 52: frontpaneel • Eerste drukknop (links): Met dit programma kan je de rode, groene en blauwe kleur van de MiStrip wijzigen d.m.v. drie schuifbalken. Met de lichttafel Showtec showmaster 24 kunnen er op deze manier 8 MiStrip’s aangestuurd worden met telkens drie kanalen per MiStrip. • Tweede drukknop: Dit is een demoprogramma waarvoor je de lichttafel niet nodig hebt. In dit programma verschijnen de kleuren rood, groen, blauw, wit en zwart continu in een lus. Kris Sabbe
3AI1E0
Oostende 2007‐2008
Aansturen LED display via art‐net
71
• Derde drukknop: Dit is ook een demoprogramma waarvoor je de lichttafel niet nodig hebt. In dit programma gaat het beeld geleidelijk aan van zwart naar wit. • Vierde drukknop (rechts): Eén pixel op de MiStrip brandt en gaat van links naar rechts en terug. Met de drie eerste schuifbalken van de lichttafel kan de kleur gewijzigd worden volgens het RGB principe. Met de vierde schuifbalk kan de snelheid waarmee de pixel verschuift gewijzigd worden. Met de vijfde schuifbalk kunnen het aantal pixels die branden ingesteld worden (van 1 tot 60 pixels). o Vierde en eerste drukknop Nu gaan twee pixels van links naar rechts en terug. Van deze twee pixels kunnen de kleur en snelheid geregeld worden. o Vierde en tweede drukknop Nu gaan vier pixels van links naar rechts en terug. Ook hier kan de snelheid en kleur terug geregeld worden. o Vierde en derde drukknop Eén pixel van de MiStrip brandt. Van deze pixel kan je de kleur wijzigen met de eerste drie schuifbalken. De positie waar de LED oplicht kan gekozen worden met de vierde schuifbalk.
Kris Sabbe
3AI1E0
Oostende 2007‐2008
Aansturen LED display via art‐net
72
6. Kostprijsberaming Omschrijving Print Ethernet connector RJ‐11 connector Regulator 1.5V Regulator 3.3V Regulator 5V Regulator 8V Altera EPCS1 DVI connector Drukknoppen LED's VCO 32MHz Kristal 25MHz MAX 489 CPD+ TFP‐410 Altera Cyclone 1 PIC 18F97J60 Condensatoren Weerstanden Behuizing Totaal
Kris Sabbe
Prijs in Euro 300 10,87 1,68 3,68 1,06 0,69 0,7 3,39 3,1 4,05 5,35 4,72 0,96 2,85 7,75 16,2 11,49 10,78 4,73 16,36 410,41 Tabel 7: kostprijsberaming
3AI1E0
Oostende 2007‐2008
Aansturen LED display via art‐net
73
7. Algemeen besluit Het doel van mijn eindwerk is behaald. Ik kan videopixels aansturen door middel van ethernet. Dit komt mede door het opsplitsen van het probleem in meerdere delen. Het gebruik van nieuwe componenten (pic, fpga en tfp) was hiervoor een noodzaak. Hierdoor heb ik ook veel bijgeleerd over het implementeren van deze technologie in een bepaalde toepassing. Alsook hoe je ermee werkt, programmeert en fouten opspoort.
Kris Sabbe
3AI1E0
Oostende 2007‐2008
Aansturen LED display via art‐net
74
8. Bijlagen
Kris Sabbe
3AI1E0
Oostende 2007‐2008
77
Bovenkant van de print
Tweede laag van de print
78
Derde laag van de print
Onderzijde print
Sabbe Kris
Code PIC
79
/********************************************************************* * * Main Application Entry Point and TCP/IP Stack Demo * Module for Microchip TCP/IP Stack * Sabbe Kris * 3AI1EO ********************************************************************/ #define THIS_IS_STACK_APPLICATION #define BAUD_RATE (19200) // bps // This header includes all headers for any enabled TCPIP Stack functions #include "TCPIP Stack/TCPIP.h" // This is used by other stack elements. // Main application must define this and initialize it with proper values. APP_CONFIG AppConfig; BYTE AN0String[8]; BYTE myDHCPBindCount = 0xFF; #if !defined(STACK_USE_DHCP_CLIENT) #define DHCPBindCount (1) #endif #pragma udata BUFFER1_50BYTES //Buffer om het ontvangen UDP‐pakket in op te bergen BYTE udpRxBuf[50]; #pragma udata // Set configuration fuses #if defined(__18CXX) #if defined(__EXTENDED18__) #pragma config XINST=ON #elif !defined(HI_TECH_C) #pragma config XINST=OFF #endif #if defined(__18F8722) // PICDEM HPC Explorer board #pragma config OSC=HSPLL, FCMEN=OFF, IESO=OFF, PWRT=OFF, WDT=OFF, LVP=OFF #elif defined(_18F8722) // HI‐TECH PICC‐18 compiler // PICDEM HPC Explorer board __CONFIG(1, HSPLL); __CONFIG(2, WDTDIS); __CONFIG(3, MCLREN); __CONFIG(4, XINSTDIS & LVPDIS); #elif defined(__18F87J10) || defined(__18F86J15) || defined(__18F86J10) || defined(__18F85J15) || defined(__18F85J10) || defined(__18F67J10) || defined(__18F66J15) || defined(__18F66J10) || defined(__18F65J15) || defined(__18F65J10) // PICDEM HPC Explorer board #pragma config WDTEN=OFF, FOSC2=ON, FOSC=HSPLL #elif defined(__18F97J60) || defined(__18F96J65) || defined(__18F96J60) || defined(__18F87J60) || defined(__18F86J65) || defined(__18F86J60) || defined(__18F67J60) || defined(__18F66J65) || defined(__18F66J60) // PICDEM.net 2 or any other PIC18F97J60 family device #pragma config WDT=OFF, FOSC2=ON, FOSC=HSPLL, ETHLED=ON #elif defined(_18F97J60) || defined(_18F96J65) || defined(_18F96J60) || defined(_18F87J60) || defined(_18F86J65) || defined(_18F86J60) || defined(_18F67J60) || defined(_18F66J65) || defined(_18F66J60) // PICDEM.net 2 board with HI‐TECH PICC‐18 compiler __CONFIG(1, WDTDIS & XINSTDIS); __CONFIG(2, HSPLL); __CONFIG(3, ETHLEDEN); #elif defined(__18F4620) // PICDEM Z board #pragma config OSC=HSPLL, WDT=OFF, MCLRE=ON, PBADEN=OFF, LVP=OFF #endif #elif defined(__PIC24F__) // Explorer 16 board _CONFIG2(FNOSC_PRIPLL & POSCMOD_XT) // Primary XT OSC with 4x PLL _CONFIG1(JTAGEN_OFF & FWDTEN_OFF) // JTAG off, watchdog timer off #elif defined(__dsPIC33F__) || defined(__PIC24H__) // Explorer 16 board _FOSCSEL(FNOSC_PRIPLL) // PLL enabled
Sabbe Kris
Code PIC
80
_FOSC(OSCIOFNC_OFF & POSCMD_XT) // XT Osc _FWDT(FWDTEN_OFF) // Disable Watchdog timer // JTAG should be disabled as well #elif defined(__dsPIC30F__) // dsPICDEM 1.1 board _FOSC(XT_PLL16) // XT Osc + 16X PLL _FWDT(WDT_OFF) // Disable Watchdog timer _FBORPOR(MCLR_EN & PBOR_OFF & PWRT_OFF) #elif defined(__PIC32MX__) #pragma config FPLLODIV = DIV_1, FPLLMUL = MUL_18, FPLLIDIV = DIV_2, FWDTEN = OFF, FPBDIV = DIV_1, POSCMOD = XT, FNOSC = PRIPLL, CP = OFF #endif void delay (void) //Eenvoudige delay, tellertje laten tellen tot 50000 { unsigned int i; for(i = 0; i<50000 ; i++); } void delay2 (void) //Kleinere delay { unsigned int i; for(i = 0; i<2000 ; i++); } void receiveUDP2(void) { BYTE udpRxBufPut; //variabelen declareren UDP_SOCKET MySocket; NODE_INFO Remote; WORD wTemp; BYTE *buffer; static DWORD dwCounter = 1; BYTE c; BYTE ontv; BYTE ontv1; BYTE testbyte; unsigned int teller=0; unsigned int t = 0; UDPInit(); // Suppress transmissions if we don't have an Ethernet link so our counter starts correctly at 0x00000001 if(!MACIsLinked()) return; udpRxBufPut = 0; //Op 0 zetten zodat we altijd op de eerste plaats in het buffer beginnen opslaan Remote.IPAddr.Val=0x47071802; //IP‐adres van het toestel die de UDP‐paketten verzend in hex formaat Remote.MACAddr.v[0]=0x00; //MAC‐adres van het toestel dat uitzend Remote.MACAddr.v[1]=0x06; Remote.MACAddr.v[2]=0xA6; Remote.MACAddr.v[3]=0x01; Remote.MACAddr.v[4]=0x07; Remote.MACAddr.v[5]=0x47; // Openen van een UDP socket op poort 0x1936 MySocket = UDPOpen(0x1936, &Remote, 0x1936); // voor art‐net altijd poort 0x1936 (6454 decimaal) if(MySocket == INVALID_UDP_SOCKET) //Terugkeren als er een probleem is met de socket return; if (UDPIsGetReady(MySocket)) //Als er data staat op de socket voeren we de code uit { UDPGet(&c); //Eerste byte van het UDP‐pakket lezen if (c==0x41) //Als deze byte 0x41 (A), dan gaan we verder {
Sabbe Kris udpRxBuf[udpRxBufPut++] = c; if (udpRxBufPut >= 49) namelijk alle data die we moeten hebben break; } } //
Code PIC
81
while(UDPGet(&c)) //Lezen van het UDP‐pakket { //Byte lezen van UDP‐pakket en opslaan in buffer //Als we 51 bytes binnen gelezen hebben stoppen we. We hebben dan
{
UDPDiscard(); ontv = udpRxBuf[17]; PORTF = ontv; PORTDbits.RD2 = 0; PORTDbits.RD3 = 0; PORTDbits.RD4 = 0; PORTHbits.RH1 = 0; PORTHbits.RH2 = 0; PORTDbits.RD1 = 1; PORTDbits.RD1 = 0; ontv = udpRxBuf[18]; PORTF = ontv; PORTDbits.RD2 = 1; PORTDbits.RD3 = 0; PORTDbits.RD4 = 0; PORTHbits.RH1 = 0; PORTHbits.RH2 = 0; PORTDbits.RD1 = 1; PORTDbits.RD1 = 0; ontv = udpRxBuf[19]; PORTF = ontv; PORTDbits.RD2 = 0; PORTDbits.RD3 = 1; PORTDbits.RD4 = 0; PORTHbits.RH1 = 0; PORTHbits.RH2 = 0; PORTDbits.RD1 = 1; for(t = 0; t<5 ; t++); PORTDbits.RD1 = 0; ontv = udpRxBuf[20]; PORTF = ontv; PORTDbits.RD2 = 1; PORTDbits.RD3 = 1; PORTDbits.RD4 = 0; PORTHbits.RH1 = 0; PORTHbits.RH2 = 0; PORTDbits.RD1 = 1; PORTDbits.RD1 = 0; ontv = udpRxBuf[21]; PORTF = ontv; PORTDbits.RD2 = 0; PORTDbits.RD3 = 0; PORTDbits.RD4 = 1; PORTHbits.RH1 = 0; PORTHbits.RH2 = 0; PORTDbits.RD1 = 1; PORTDbits.RD1 = 0; ontv = udpRxBuf[22]; PORTF = ontv; PORTDbits.RD2 = 1; PORTDbits.RD3 = 0; PORTDbits.RD4 = 1; PORTHbits.RH1 = 0; PORTHbits.RH2 = 0; PORTDbits.RD1 = 1; PORTDbits.RD1 = 0;
//teller =00000
//lees = 1 //lees = 0
//teller =00001
//lees = 1 //lees = 0
//teller =00010
//lees = 1
//lees = 0
//teller =00011
//lees = 1 //lees = 0
//teller =00100
//lees = 1 //lees = 0
//teller =00101
//lees = 1 //lees = 0
Sabbe Kris
Code PIC
ontv = udpRxBuf[23]; PORTF = ontv; PORTDbits.RD2 = 0; PORTDbits.RD3 = 1; PORTDbits.RD4 = 1; PORTHbits.RH1 = 0; PORTHbits.RH2 = 0; PORTDbits.RD1 = 1; PORTDbits.RD1 = 0;
ontv = udpRxBuf[24]; PORTF = ontv; PORTDbits.RD2 = 1; PORTDbits.RD3 = 1; PORTDbits.RD4 = 1; PORTHbits.RH1 = 0; PORTHbits.RH2 = 0; PORTDbits.RD1 = 1; PORTDbits.RD1 = 0;
ontv = udpRxBuf[25]; PORTF = ontv; PORTDbits.RD2 = 0; PORTDbits.RD3 = 0; PORTDbits.RD4 = 0; PORTHbits.RH1 = 1; PORTHbits.RH2 = 0; PORTDbits.RD1 = 1; PORTDbits.RD1 = 0;
ontv = udpRxBuf[26]; PORTF = ontv; PORTDbits.RD2 = 1; PORTDbits.RD3 = 0; PORTDbits.RD4 = 0; PORTHbits.RH1 = 1; PORTHbits.RH2 = 0; PORTDbits.RD1 = 1; PORTDbits.RD1 = 0;
//
ontv = udpRxBuf[27]; PORTF = ontv; PORTDbits.RD2 = 0; PORTDbits.RD3 = 1; PORTDbits.RD4 = 0; PORTHbits.RH1 = 1; PORTHbits.RH2 = 0; PORTDbits.RD1 = 1; for(t = 0; t<5 ; t++); PORTDbits.RD1 = 0;
ontv = udpRxBuf[28]; PORTF = ontv; PORTDbits.RD2 = 1; PORTDbits.RD3 = 1; PORTDbits.RD4 = 0; PORTHbits.RH1 = 1; PORTHbits.RH2 = 0; PORTDbits.RD1 = 1; PORTDbits.RD1 = 0;
ontv = udpRxBuf[29]; PORTF = ontv; PORTDbits.RD2 = 0; PORTDbits.RD3 = 0; PORTDbits.RD4 = 1; PORTHbits.RH1 = 1; PORTHbits.RH2 = 0; PORTDbits.RD1 = 1; PORTDbits.RD1 = 0;
82
//teller =00110
//lees = 1 //lees = 0
//teller =00111
//lees = 1 //lees = 0
//teller =01000
//lees = 1 //lees = 0
//teller =01001
//lees = 1 //lees = 0
//teller =01010
//lees = 1
//lees = 0
//teller =01011
//lees = 1 //lees = 0
//teller =01100
//lees = 1 //lees = 0
Sabbe Kris
Code PIC
ontv = udpRxBuf[30]; PORTF = ontv; PORTDbits.RD2 = 1; PORTDbits.RD3 = 0; PORTDbits.RD4 = 1; PORTHbits.RH1 = 1; PORTHbits.RH2 = 0; PORTDbits.RD1 = 1; PORTDbits.RD1 = 0;
ontv = udpRxBuf[31]; PORTF = ontv; PORTDbits.RD2 = 0; PORTDbits.RD3 = 1; PORTDbits.RD4 = 1; PORTHbits.RH1 = 1; PORTHbits.RH2 = 0; PORTDbits.RD1 = 1; PORTDbits.RD1 = 0;
ontv = udpRxBuf[32]; PORTF = ontv; PORTDbits.RD2 = 1; PORTDbits.RD3 = 1; PORTDbits.RD4 = 1; PORTHbits.RH1 = 1; PORTHbits.RH2 = 0; PORTDbits.RD1 = 1; PORTDbits.RD1 = 0;
ontv = udpRxBuf[33]; PORTF = ontv; PORTDbits.RD2 = 0; PORTDbits.RD3 = 0; PORTDbits.RD4 = 0; PORTHbits.RH1 = 0; PORTHbits.RH2 = 1; PORTDbits.RD1 = 1; PORTDbits.RD1 = 0;
ontv = udpRxBuf[34]; PORTF = ontv; PORTDbits.RD2 = 1; PORTDbits.RD3 = 0; PORTDbits.RD4 = 0; PORTHbits.RH1 = 0; PORTHbits.RH2 = 1; PORTDbits.RD1 = 1; PORTDbits.RD1 = 0;
ontv = udpRxBuf[35]; PORTF = ontv; PORTDbits.RD2 = 0; PORTDbits.RD3 = 1; PORTDbits.RD4 = 0; PORTHbits.RH1 = 0; PORTHbits.RH2 = 1; PORTDbits.RD1 = 1; PORTDbits.RD1 = 0;
ontv = udpRxBuf[36]; PORTF = ontv; PORTDbits.RD2 = 1; PORTDbits.RD3 = 1; PORTDbits.RD4 = 0; PORTHbits.RH1 = 0; PORTHbits.RH2 = 1; PORTDbits.RD1 = 1; PORTDbits.RD1 = 0;
83
//teller =01101
//lees = 1 //lees = 0
//teller =01110
//lees = 1 //lees = 0
//teller =01111
//lees = 1 //lees = 0
//teller =10000
//lees = 1 //lees = 0
//teller =10001
//lees = 1 //lees = 0
//teller =10010
//lees = 1 //lees = 0
//teller =10011
//lees = 1 //lees = 0
Sabbe Kris
Code PIC
84
ontv = udpRxBuf[37]; PORTF = ontv; PORTDbits.RD2 = 0; //teller =10100 PORTDbits.RD3 = 0; PORTDbits.RD4 = 1; PORTHbits.RH1 = 0; PORTHbits.RH2 = 1; PORTDbits.RD1 = 1; //lees = 1 PORTDbits.RD1 = 0; //lees = 0 ontv = udpRxBuf[38]; PORTF = ontv; //teller =10101 PORTDbits.RD2 = 1; PORTDbits.RD3 = 0; PORTDbits.RD4 = 1; PORTHbits.RH1 = 0; PORTHbits.RH2 = 1; PORTDbits.RD1 = 1; //lees = 1 PORTDbits.RD1 = 0; //lees = 0 ontv = udpRxBuf[39]; PORTF = ontv; PORTDbits.RD2 = 0; //teller =10110 PORTDbits.RD3 = 1; PORTDbits.RD4 = 1; PORTHbits.RH1 = 0; PORTHbits.RH2 = 1; PORTDbits.RD1 = 1; //lees = 1 PORTDbits.RD1 = 0; //lees = 0 ontv = udpRxBuf[40]; PORTF = ontv; PORTDbits.RD2 = 1; //teller =10111 PORTDbits.RD3 = 1; PORTDbits.RD4 = 1; PORTHbits.RH1 = 0; PORTHbits.RH2 = 1; PORTDbits.RD1 = 1; //lees = 1 PORTDbits.RD1 = 0; //lees = 0 //alles terug op 0 PORTDbits.RD2 = 0; //teller =00000 PORTDbits.RD3 = 0; PORTDbits.RD4 = 0; PORTHbits.RH1 = 0; PORTHbits.RH2 = 0; } else { } } } // Private helper functions. // These may or may not be present in all applications. static void InitAppConfig(void); static void InitializeBoard(void); //static void ProcessIO(void); #if defined(STACK_USE_SMTP_CLIENT) static void SMTPDemo(void); #endif #if defined(STACK_USE_ICMP_CLIENT) static void PingDemo(void); #endif #if defined(STACK_USE_SNMP_SERVER) && !defined(SNMP_TRAP_DISABLED) static void SNMPTrapDemo(void);
Sabbe Kris
Code PIC
85
#endif //static void DisplayIPValue(IP_ADDR IPVal); void FormatNetBIOSName(BYTE Name[16]); #if defined(STACK_USE_UART) static void SetConfig(void); #endif #if defined(MPFS_USE_EEPROM) && (defined(STACK_USE_MPFS) || defined(STACK_USE_MPFS2)) void SaveAppConfig(void); #if defined(STACK_USE_UART) && defined(STACK_USE_MPFS) static BOOL DownloadMPFS(void); #endif #else #define SaveAppConfig() #endif // // PIC18 Interrupt Service Routines // // NOTE: Several PICs, including the PIC18F4620 revision A3 have a RETFIE FAST/MOVFF bug // The interruptlow keyword is used to work around the bug when using C18 #if defined(__18CXX) #if defined(HI_TECH_C) void interrupt low_priority LowISR(void) #else #pragma interruptlow LowISR void LowISR(void) #endif { TickUpdate(); } #if defined(HI_TECH_C) void interrupt HighISR(void) #else #pragma interruptlow HighISR void HighISR(void) #endif { #if defined(STACK_USE_UART2TCP_BRIDGE) UART2TCPBridgeISR(); #endif } #if !defined(HI_TECH_C) #pragma code lowVector=0x18 void LowVector(void){_asm goto LowISR _endasm} #pragma code highVector=0x8 void HighVector(void){_asm goto HighISR _endasm} #pragma code // Return to default code section #endif // // // // // unsigned int schakelaar1=0; unsigned int i; unsigned int ontdender1=0; unsigned int tel=0; unsigned int t; unsigned int tt; unsigned int led1aan=0; unsigned int led2aan=0; unsigned int led3aan=0; unsigned int led4aan=0; #elif defined(__C30__)
Sabbe Kris
Code PIC
86
void _ISR __attribute__((__no_auto_psv__)) _AddressError(void) { Nop(); Nop(); } void _ISR __attribute__((__no_auto_psv__)) _StackError(void) { Nop(); Nop(); } #elif defined(__C32__) void _general_exception_handler(unsigned cause, unsigned status) { Nop(); Nop(); } #endif // // Main application entry point. // //#if defined(__18CXX) void main(void) //#else //int main(void) //#endif { // TCPPerformanceTask(); static TICK t = 0; BYTE i; // Initialize any application specific hardware. InitializeBoard(); #ifdef USE_LCD // Initialize and display the stack version on the LCD LCDInit(); for(i = 0; i < 100; i++) DelayMs(1); strcpypgm2ram((char*)LCDText, "TCPStack " VERSION " " " "); // LCDUpdate(); #endif // Initialize all stack related components. // Following steps must be performed for all applications using // the Microchip TCP/IP Stack. // TickInit(); #if defined(STACK_USE_MPFS) || defined(STACK_USE_MPFS2) // Initialize Microchip File System module MPFSInit(); #endif // Initialize Stack and application related NV variables into AppConfig. InitAppConfig(); // Initiates board setup process if button is depressed // on startup if(BUTTON0_IO == 0u) { #if defined(MPFS_USE_EEPROM) && (defined(STACK_USE_MPFS) || defined(STACK_USE_MPFS2)) // Invalidate the EEPROM contents if BUTTON0 is held down for more than 4 seconds TICK StartTime = TickGet(); while(BUTTON0_IO == 0u) {
Sabbe Kris
Code PIC
87
if(TickGet() ‐ StartTime > 4*TICK_SECOND) { XEEBeginWrite(0x0000); XEEWrite(0xFF); XEEEndWrite(); #if defined(STACK_USE_UART) putrsUART("\r\n\r\nBUTTON0 held for more than 4 seconds. EEPROM contents erased.\r\n\r\n"); #endif LED0_TRIS = 0; LED1_TRIS = 0; LED2_TRIS = 0; LED3_TRIS = 0; LED0_IO = 1; LED1_IO = 1; LED2_IO = 1; LED3_IO = 1; while((LONG)(TickGet() ‐ StartTime) <= (LONG)(9*TICK_SECOND/2)); Reset(); break; } } #endif #if defined(STACK_USE_UART) SetConfig(); #endif } // Initialize core stack layers (MAC, ARP, TCP, UDP) StackInit(); //#if defined(STACK_USE_UART2TCP_BRIDGE) // UART2TCPBridgeInit(); //#endif //#if defined(STACK_USE_HTTP_SERVER) || defined(STACK_USE_HTTP2_SERVER) // HTTPInit(); //#endif //#if defined(STACK_USE_SSL_SERVER) // SSLInit(); //#endif //#if defined(STACK_USE_FTP_SERVER) && defined(MPFS_USE_EEPROM) && defined(STACK_USE_MPFS) // FTPInit(); //#endif //#if defined(STACK_USE_SNMP_SERVER) // SNMPInit(); //#endif //#if defined(STACK_USE_DHCP_CLIENT) // if(!AppConfig.Flags.bIsDHCPEnabled) // { // DHCPDisable(); // } //#endif TRISJ=0x00; TRISB=0xFF; PORTJ=0x00; TRISD=0x00; PORTD=0x00; //TRISB=0x00; //PORTB=0x00; TRISC=0x00; PORTC=0x00; TRISF=0x00; PORTF=0x00; TRISH=0x00; PORTH=0x00;
Sabbe Kris
Code PIC
88
// Once all items are initialized, go into infinite loop and let // stack items execute their tasks. // If application needs to perform its own task, it should be // done at the end of while loop. // Note that this is a "co‐operative mult‐tasking" mechanism // where every task performs its tasks (whether all in one shot // or part of it) and returns so that other tasks can do their // job. // If a task needs very long time to do its job, it must be broken // down into smaller pieces so that other tasks can have CPU time. while(1) { // Blink LED0 (right most one) every second. // if(TickGet() ‐ t >= TICK_SECOND/2ul) // { // t = TickGet(); // LED0_IO ^= 1; // } // This task performs normal stack task including checking // for incoming packet, type of packet and calling // appropriate stack entity to process it. StackTask(); //#if defined(STACK_USE_UART2TCP_BRIDGE) // UART2TCPBridgeTask(); //#endif //#if defined(STACK_USE_HTTP_SERVER) || defined(STACK_USE_HTTP2_SERVER) // This is a TCP application. It listens to TCP port 80 // with one or more sockets and responds to remote requests. // HTTPServer(); //#endif //#if defined(STACK_USE_SSL_SERVER) // SSLServer(); //#endif //#if defined(STACK_USE_FTP_SERVER) && defined(MPFS_USE_EEPROM) && defined(STACK_USE_MPFS) // FTPServer(); //#endif //#if defined(STACK_USE_SNMP_SERVER) // SNMPTask(); //#endif //#if defined(STACK_USE_ANNOUNCE) // DiscoveryTask(); //#endif //#if defined(STACK_USE_NBNS) // NBNSTask(); //#endif //#if defined(STACK_USE_DHCP_SERVER) // DHCPServerTask(); //#endif //#if defined(STACK_USE_GENERIC_TCP_CLIENT_EXAMPLE) // GenericTCPClient(); //#endif //#if defined(STACK_USE_GENERIC_TCP_SERVER_EXAMPLE) // GenericTCPServer(); //#endif //#if defined(STACK_USE_TELNET_SERVER) // TelnetTask(); //#endif //#if defined(STACK_USE_REBOOT_SERVER)
Sabbe Kris
Code PIC
89
// RebootTask(); //#endif //#if defined(STACK_USE_SNTP_CLIENT) // SNTPClient(); //#endif //#if defined(STACK_USE_UDP_PERFORMANCE_TEST) //ReceiveUDP(); receiveUDP2(); if(PORTBbits.RB0 == 0) { led1aan++; if (led1aan==1) { PORTDbits.RD0 = 1; PORTJbits.RJ2 = 1; PORTDbits.RD0 = 0; } if (led1aan>=2) { PORTDbits.RD0 = 1; PORTJbits.RJ2 = 0; PORTDbits.RD0 = 0; led1aan=0; } for(t = 0; t<500000 ; t++); } if(PORTBbits.RB1 == 0) { led2aan++; if (led2aan==1) { PORTDbits.RD7 = 1; PORTJbits.RJ3 = 1; PORTDbits.RD7 = 0; } if (led2aan>=2) { PORTDbits.RD7 = 1; PORTJbits.RJ3 = 0; PORTDbits.RD7 = 0; led2aan=0; } for(t = 0; t<500000 ; t++); } if(PORTBbits.RB2 == 0) { led3aan++; if (led3aan==1) { PORTDbits.RD5 = 1; PORTJbits.RJ6 = 1; PORTDbits.RD5 = 0; } if (led3aan>=2) { PORTDbits.RD5 = 1; PORTJbits.RJ6 = 0;
Sabbe Kris
Code PIC
90
PORTDbits.RD5 = 0; led3aan=0; } for(t = 0; t<500000 ; t++); } if(PORTBbits.RB3 == 0) { led4aan++; if (led4aan==1) { PORTDbits.RD6 = 1; PORTJbits.RJ1 = 1; PORTDbits.RD6 = 0; } if (led4aan>=2) { PORTDbits.RD6 = 1; PORTJbits.RJ1 = 0; PORTDbits.RD6 = 0; led4aan=0; } for(t = 0; t<500000 ; t++); } //#if defined(STACK_USE_TCP_PERFORMANCE_TEST) // TCPPerformanceTask(); //#endif //#if defined(STACK_USE_SMTP_CLIENT) // SMTPTask(); // SMTPDemo(); //#endif //#if defined(STACK_USE_ICMP_CLIENT) // PingDemo(); //#endif //#if defined(STACK_USE_SNMP_SERVER) && !defined(SNMP_TRAP_DISABLED) // SNMPTrapDemo(); //#endif // Add your application specific tasks here. //ProcessIO(); // For DHCP information, display how many times we have renewed the IP // configuration since last reset. if(DHCPBindCount != myDHCPBindCount) { myDHCPBindCount = DHCPBindCount; #if defined(STACK_USE_UART) putrsUART((ROM char*)"New IP Address: "); #endif // DisplayIPValue(AppConfig.MyIPAddr); // Print to UART #if defined(STACK_USE_UART) putrsUART((ROM char*)"\r\n"); #endif #if defined(STACK_USE_ANNOUNCE) AnnounceIP(); #endif } } }
Sabbe Kris
Code PIC
91
/*static void DisplayIPValue(IP_ADDR IPVal) { // printf("%u.%u.%u.%u", IPVal.v[0], IPVal.v[1], IPVal.v[2], IPVal.v[3]); BYTE IPDigit[4]; BYTE i; #ifdef USE_LCD BYTE j; BYTE LCDPos=16; #endif for(i = 0; i < sizeof(IP_ADDR); i++) { uitoa((WORD)IPVal.v[i], IPDigit); #if defined(STACK_USE_UART) putsUART(IPDigit); #endif #ifdef USE_LCD for(j = 0; j < strlen((char*)IPDigit); j++) { LCDText[LCDPos++] = IPDigit[j]; } if(i == sizeof(IP_ADDR)‐1) break; LCDText[LCDPos++] = '.'; #else if(i == sizeof(IP_ADDR)‐1) break; #endif #if defined(STACK_USE_UART) while(BusyUART()); WriteUART('.'); #endif } #ifdef USE_LCD if(LCDPos < 32) LCDText[LCDPos] = 0; LCDUpdate(); #endif }*/ /*static void ProcessIO(void) { #if defined(__C30__) || defined(__C32__) // Convert potentiometer result into ASCII string uitoa((WORD)ADC1BUF0, AN0String); #else // AN0 should already be set up as an analog input ADCON0bits.GO = 1; // Wait until A/D conversion is done while(ADCON0bits.GO); // AD converter errata work around (ex: PIC18F87J10 A2) #if !defined(__18F87J50) && !defined(_18F87J50) PRODL = ADCON2; ADCON2bits.ADCS0 = 1; ADCON2bits.ADCS1 = 1; ADCON2 = PRODL; #endif // Convert 10‐bit value into ASCII string uitoa(*((WORD*)(&ADRESL)), AN0String); #endif }*/
Sabbe Kris
Code PIC
92
#if defined(STACK_USE_SMTP_CLIENT) static void SMTPDemo(void) { // Send an email once if someone pushes BUTTON2 and BUTTON3 at the same time // This is a simple message example, where the message // body must already be in RAM. // LED1 will be used as a busy indicator // LED2 will be used as a mail sent successfully indicator static enum { MAIL_HOME = 0, MAIL_BEGIN, MAIL_SMTP_FINISHING, MAIL_DONE } MailState = MAIL_HOME; static TICK WaitTime; switch(MailState) { case MAIL_HOME: if((BUTTON2_IO == 0u) && (BUTTON3_IO == 0u)) { // Start sending an email LED1_IO = 1; MailState++; LED2_IO = 0; } break; case MAIL_BEGIN: if(SMTPBeginUsage()) { // Note that these strings must stay allocated in // memory until SMTPIsBusy() returns FALSE. To // guarantee that the C compiler does not reuse this // memory, you must allocate the strings as static. static BYTE RAMStringTo[] = "
[email protected]"; //static BYTE RAMStringCC[] = "
[email protected], \"Jane Smith\"
"; //static BYTE RAMStringBCC[] = ""; static BYTE RAMStringBody[] = "Message generated by stack " VERSION " \r\n\r\nButtons: 3210"; RAMStringBody[sizeof(RAMStringBody)‐2] = '0' + BUTTON0_IO; RAMStringBody[sizeof(RAMStringBody)‐3] = '0' + BUTTON1_IO; RAMStringBody[sizeof(RAMStringBody)‐4] = '0' + BUTTON2_IO; RAMStringBody[sizeof(RAMStringBody)‐5] = '0' + BUTTON3_IO; SMTPClient.Server.szROM = (ROM BYTE*)"mail"; // SMTP server address SMTPClient.ROMPointers.Server = 1; //SMTPClient.Username.szROM = (ROM BYTE*)"mchpboard"; //SMTPClient.ROMPointers.Username = 1; //SMTPClient.Password.szROM = (ROM BYTE*)"secretpassword"; //SMTPClient.ROMPointers.Password = 1; SMTPClient.To.szRAM = RAMStringTo; SMTPClient.From.szROM = (ROM BYTE*)"\"SMTP Service\" "; SMTPClient.ROMPointers.From = 1; SMTPClient.Subject.szROM = (ROM BYTE*)"Hello world! SMTP Test."; SMTPClient.ROMPointers.Subject = 1; SMTPClient.Body.szRAM = RAMStringBody; SMTPSendMail(); MailState++; } break; case MAIL_SMTP_FINISHING: if(!SMTPIsBusy()) { // Finished sending mail
Sabbe Kris
Code PIC
93
LED1_IO = 0; MailState++; WaitTime = TickGet(); LED2_IO = (SMTPEndUsage() == SMTP_SUCCESS); } break; case MAIL_DONE: // Wait for the user to release BUTTON2 or BUTTON3 and for at // least 1 second to pass before allowing another // email to be sent. This is merely to prevent // accidental flooding of email boxes while // developing code. Your application may wish to // remove this. if(BUTTON2_IO && BUTTON3_IO) { if(TickGet() ‐ WaitTime > TICK_SECOND) MailState = MAIL_HOME; } break; } } #endif //#if defined(STACK_USE_SMTP_CLIENT)
Sabbe Kris
Code Horizontale synchronisatie FPGA
94
// WARNING: Do NOT edit the input and output ports in this file in a text // editor if you plan to continue editing the block that represents it in // the Block Editor! File corruption is VERY likely to occur. // Copyright (C) 1991‐2007 Altera Corporation // Your use of Altera Corporation's design tools, logic functions // and other software and tools, and its AMPP partner logic // functions, and any output files from any of the foregoing // (including device programming or simulation files), and any // associated documentation or information are expressly subject // to the terms and conditions of the Altera Program License // Subscription Agreement, Altera MegaCore Function License // Agreement, or other applicable license agreement, including, // without limitation, that your use is for the sole purpose of // programming logic devices manufactured by Altera and sold by // Altera or its authorized distributors. Please refer to the // applicable agreement for further details. // Generated by Quartus II Version 7.2 (Build Build 175 11/20/2007) // Created on Thu Mar 06 10:01:11 2008 // Module Declaration module H_sync ( // {{ALTERA_ARGS_BEGIN}} DO NOT REMOVE THIS LINE! klokje, H_sync, blank, tel_0 // {{ALTERA_ARGS_END}} DO NOT REMOVE THIS LINE! ); // Port Declaration // {{ALTERA_IO_BEGIN}} DO NOT REMOVE THIS LINE! input klokje; output H_sync; output blank; output tel_0; reg H_sync; reg blank; reg [19:0] teller; reg tel_0; // {{ALTERA_IO_END}} DO NOT REMOVE THIS LINE! always @ (posedge klokje) begin if(teller < 830) blank <=0; if(teller >= 830 && teller <835) begin //H_sync <=1; blank <=1; end if(teller >=835 && teller <840) begin H_sync <=1; blank <=1; end if(teller >= 840) begin H_sync <=0; blank <=0; teller =0; end teller = teller + 1; end endmodule
Sabbe Kris
Code verticale synchronisatie FPGA
// WARNING: Do NOT edit the input and output ports in this file in a text // editor if you plan to continue editing the block that represents it in // the Block Editor! File corruption is VERY likely to occur. // Copyright (C) 1991‐2007 Altera Corporation // Your use of Altera Corporation's design tools, logic functions // and other software and tools, and its AMPP partner logic // functions, and any output files from any of the foregoing // (including device programming or simulation files), and any // associated documentation or information are expressly subject // to the terms and conditions of the Altera Program License // Subscription Agreement, Altera MegaCore Function License // Agreement, or other applicable license agreement, including, // without limitation, that your use is for the sole purpose of // programming logic devices manufactured by Altera and sold by // Altera or its authorized distributors. Please refer to the // applicable agreement for further details. // Generated by Quartus II Version 7.2 (Build Build 175 11/20/2007) // Created on Thu Mar 06 10:59:34 2008 // Module Declaration module V_sync ( // {{ALTERA_ARGS_BEGIN}} DO NOT REMOVE THIS LINE! klokje, V_sync, blank, tel_0 // {{ALTERA_ARGS_END}} DO NOT REMOVE THIS LINE! ); // Port Declaration // {{ALTERA_IO_BEGIN}} DO NOT REMOVE THIS LINE! input klokje; output V_sync; output blank; output tel_0; reg V_sync; reg blank; reg [19:0] teller; reg tel_0; // {{ALTERA_IO_END}} DO NOT REMOVE THIS LINE! always @ (posedge klokje) begin if(teller < 533390) blank <=0; if(teller >= 533390 && teller <533395) begin //V_sync <=1; blank <=1; end if(teller >= 533395 && teller <533400) begin V_sync <=1; blank <=1; end if(teller >= 533400) begin V_sync <=0; blank <=0; teller =0; end teller = teller + 1; end endmodule
95
Sabbe Kris
Code beeld‐enabler FPGA
96
Softwarecode om de keuze te maken tussen de verschillende beeld blokken. // WARNING: Do NOT edit the input and output ports in this file in a text // editor if you plan to continue editing the block that represents it in // the Block Editor! File corruption is VERY likely to occur. // Copyright (C) 1991‐2007 Altera Corporation // Your use of Altera Corporation's design tools, logic functions // and other software and tools, and its AMPP partner logic // functions, and any output files from any of the foregoing // (including device programming or simulation files), and any // associated documentation or information are expressly subject // to the terms and conditions of the Altera Program License // Subscription Agreement, Altera MegaCore Function License // Agreement, or other applicable license agreement, including, // without limitation, that your use is for the sole purpose of // programming logic devices manufactured by Altera and sold by // Altera or its authorized distributors. Please refer to the // applicable agreement for further details. // Generated by Quartus II Version 7.2 (Build Build 175 11/20/2007) // Created on Tue Apr 01 08:37:47 2008 // Module Declaration module enabler_2 ( // {{ALTERA_ARGS_BEGIN}} DO NOT REMOVE THIS LINE! enable1, enable2, enable3, enable4, uit1, uit2, uit3, uit4_1, uit4_2, uit4_3, uit4_4 // {{ALTERA_ARGS_END}} DO NOT REMOVE THIS LINE! ); // Port Declaration // {{ALTERA_IO_BEGIN}} DO NOT REMOVE THIS LINE! input enable1; input enable2; input enable3; input enable4; output uit1; output uit2; output uit3; output uit4_1; output uit4_2; output uit4_3; output uit4_4; reg uit1; reg uit2; reg uit3; reg uit4_1; reg uit4_2; reg uit4_3; reg uit4_4; // {{ALTERA_IO_END}} DO NOT REMOVE THIS LINE! always begin if (enable1==0 && enable2==0 && enable3==0 && enable4==0) begin uit1 <= 1'b0; uit2 <= 1'b0; uit3 <= 1'b0; uit4_1 <= 1'b0; uit4_2 <= 1'b0; uit4_3 <= 1'b0; uit4_4 <= 1'b0; end if (enable1==1 && enable2==0 && enable3==0 && enable4==0) begin uit1 <= 1'b1; uit2 <= 1'b0; uit3 <= 1'b0;
Sabbe Kris end endmodule
Code beeld‐enabler FPGA
97
uit4_1 <= 1'b0; uit4_2 <= 1'b0; uit4_3 <= 1'b0; uit4_4 <= 1'b0; end if (enable1==0 && enable2==1 && enable3==0 && enable4==0) begin uit1 <= 1'b0; uit2 <= 1'b1; uit3 <= 1'b0; uit4_1 <= 1'b0; uit4_2 <= 1'b0; uit4_3 <= 1'b0; uit4_4 <= 1'b0; end if (enable1==0 && enable2==0 && enable3==1 && enable4==0) begin uit1 <= 1'b0; uit2 <= 1'b0; uit3 <= 1'b1; uit4_1 <= 1'b0; uit4_2 <= 1'b0; uit4_3 <= 1'b0; uit4_4 <= 1'b0; end if (enable1==0 && enable2==0 && enable3==0 && enable4==1) begin uit1 <= 1'b0; uit2 <= 1'b0; uit3 <= 1'b0; uit4_1 <= 1'b1; uit4_2 <= 1'b0; uit4_3 <= 1'b0; uit4_4 <= 1'b0; end if (enable1==1 && enable2==0 && enable3==0 && enable4==1) begin uit1 <= 1'b0; uit2 <= 1'b0; uit3 <= 1'b0; uit4_1 <= 1'b0; uit4_2 <= 1'b1; uit4_3 <= 1'b0; uit4_4 <= 1'b0; end if (enable1==0 && enable2==1 && enable3==0 && enable4==1) begin uit1 <= 1'b0; uit2 <= 1'b0; uit3 <= 1'b0; uit4_1 <= 1'b0; uit4_2 <= 1'b0; uit4_3 <= 1'b1; uit4_4 <= 1'b0; end if (enable1==0 && enable2==0 && enable3==1 && enable4==1) begin uit1 <= 1'b0; uit2 <= 1'b0; uit3 <= 1'b0; uit4_1 <= 1'b0; uit4_2 <= 1'b0; uit4_3 <= 1'b0; uit4_4 <= 1'b1; end
Sabbe Kris
Code beeldopbouw FPGA
98
Softwarecode om de data ontvangen uit de pic, afkomstig van de lichttafel, om te zetten naar beeld // WARNING: Do NOT edit the input and output ports in this file in a text // editor if you plan to continue editing the block that represents it in // the Block Editor! File corruption is VERY likely to occur. // Copyright (C) 1991‐2007 Altera Corporation // Your use of Altera Corporation's design tools, logic functions // and other software and tools, and its AMPP partner logic // functions, and any output files from any of the foregoing // (including device programming or simulation files), and any // associated documentation or information are expressly subject // to the terms and conditions of the Altera Program License // Subscription Agreement, Altera MegaCore Function License // Agreement, or other applicable license agreement, including, // without limitation, that your use is for the sole purpose of // programming logic devices manufactured by Altera and sold by // Altera or its authorized distributors. Please refer to the // applicable agreement for further details. // Generated by Quartus II Version 7.2 (Build Build 175 11/20/2007) // Created on Tue Mar 11 13:15:29 2008 // Module Declaration module beeldopbouw ( // {{ALTERA_ARGS_BEGIN}} DO NOT REMOVE THIS LINE! data0, data1, data2, data3, data4, data5, data6, data7, lees, update, klok, enable, teller, H_sync, V_sync, blank, uit0, uit1, uit2, uit3, uit4, uit5, uit6, uit7, uit8, uit9, uit10, uit11, uit12, uit13, uit14, uit15, uit16, uit17, uit18, uit19, uit20, uit21, uit22, uit23 // {{ALTERA_ARGS_END}} DO NOT REMOVE THIS LINE! ); // Port Declaration // {{ALTERA_IO_BEGIN}} DO NOT REMOVE THIS LINE! input data0; input data1; input data2; input data3; input data4; input data5; input data6; input data7; input lees; input update; input klok; input enable; input [4:0] teller; input H_sync; input V_sync; input blank; output uit0; output uit1; output uit2; output uit3; output uit4; output uit5; output uit6; output uit7; output uit8; output uit9; output uit10; output uit11; output uit12; output uit13; output uit14; output uit15;
Sabbe Kris
Code beeldopbouw FPGA
99
output uit16; output uit17; output uit18; output uit19; output uit20; output uit21; output uit22; output uit23; reg uit0; reg uit1; reg uit2; reg uit3; reg uit4; reg uit5; reg uit6; reg uit7; reg uit8; reg uit9; reg uit10; reg uit11; reg uit12; reg uit13; reg uit14; reg uit15; reg uit16; reg uit17; reg uit18; reg uit19; reg uit20; reg uit21; reg uit22; reg uit23; reg [19:0] bla1; reg [19:0] bla2; reg [20:0] teller_V; reg [20:0] teller_H; reg [23:0] datain0; reg [23:0] datain1; reg [23:0] datain2; reg [23:0] datain3; reg [23:0] datain4; reg [23:0] datain5; reg [23:0] datain6; reg [23:0] datain7; // {{ALTERA_IO_END}} DO NOT REMOVE THIS LINE! always @(posedge klok) begin /*teller_H=teller_H+1; if(teller_H==840) begin teller_V = teller_V+1; end if (V_sync == 1) begin teller_V=0; teller_H=0; end*/ if(enable==1) begin if(teller_H == 840) begin teller_H=0; teller_V = teller_V+1; end if(V_sync == 1)
Sabbe Kris
Code beeldopbouw FPGA begin teller_H=0; teller_V=0; end if(blank==1) begin //teller_V=0; teller_H=0; end teller_H = teller_H+1; /*if(enable==1) begin*/ case(teller_V) 50: 51:
begin end begin
100
uit5 <= datain0[0]; uit10 <= datain1[0]; uit0 <= datain2[0]; uit1 <= datain3[0]; uit2 <= datain4[0]; uit3 <= datain5[0]; uit4 <= datain6[0]; uit6 <= datain7[0]; uit11 <= datain0[1]; uit16 <= datain1[1]; uit7 <= datain2[1]; uit8 <= datain3[1]; uit9 <= datain4[1]; uit12 <= datain5[1]; uit13 <= datain6[1]; uit14 <= datain7[1]; uit17 <= datain0[2]; uit23 <= datain1[2]; uit15 <= datain2[2]; uit18 <= datain3[2]; uit19 <= datain4[2]; uit20 <= datain5[2]; uit21 <= datain6[2]; uit22 <= datain7[2];
uit5 <= datain0[3]; uit10 <= datain1[3]; uit0 <= datain2[3]; uit1 <= datain3[3]; uit2 <= datain4[3]; uit3 <= datain5[3]; uit4 <= datain6[3]; uit6 <= datain7[3]; uit11 <= datain0[4]; uit16 <= datain1[4]; uit7 <= datain2[4]; uit8 <= datain3[4]; uit9 <= datain4[4]; uit12 <= datain5[4]; uit13 <= datain6[4]; uit14 <= datain7[4]; uit17 <= datain0[5]; uit23 <= datain1[5]; uit15 <= datain2[5]; uit18 <= datain3[5]; uit19 <= datain4[5]; uit20 <= datain5[5]; uit21 <= datain6[5];
Sabbe Kris
Code beeldopbouw FPGA
52: 53: 54:
end begin end begin end begin
101
uit22 <= datain7[5];
uit5 <= datain0[6]; uit10 <= datain1[6]; uit0 <= datain2[6]; uit1 <= datain3[6]; uit2 <= datain4[6]; uit3 <= datain5[6]; uit4 <= datain6[6]; uit6 <= datain7[6]; uit11 <= datain0[7]; uit16 <= datain1[7]; uit7 <= datain2[7]; uit8 <= datain3[7]; uit9 <= datain4[7]; uit12 <= datain5[7]; uit13 <= datain6[7]; uit14 <= datain7[7]; uit17 <= datain0[8]; uit23 <= datain1[8]; uit15 <= datain2[8]; uit18 <= datain3[8]; uit19 <= datain4[8]; uit20 <= datain5[8]; uit21 <= datain6[8]; uit22 <= datain7[8];
uit5 <= datain0[9]; uit10 <= datain1[9]; uit0 <= datain2[9]; uit1 <= datain3[9]; uit2 <= datain4[9]; uit3 <= datain5[9]; uit4 <= datain6[9]; uit6 <= datain7[9]; uit11 <= datain0[10]; uit16 <= datain1[10]; uit7 <= datain2[10]; uit8 <= datain3[10]; uit9 <= datain4[10]; uit12 <= datain5[10]; uit13 <= datain6[10]; uit14 <= datain7[10]; uit17 <= datain0[11]; uit23 <= datain1[11]; uit15 <= datain2[11]; uit18 <= datain3[11]; uit19 <= datain4[11]; uit20 <= datain5[11]; uit21 <= datain6[11]; uit22 <= datain7[11];
uit5 <= datain0[12]; uit10 <= datain1[12]; uit0 <= datain2[12]; uit1 <= datain3[12]; uit2 <= datain4[12]; uit3 <= datain5[12]; uit4 <= datain6[12]; uit6 <= datain7[12]; uit11 <= datain0[13]; uit16 <= datain1[13]; uit7 <= datain2[13];
Sabbe Kris
Code beeldopbouw FPGA
55: 56:
end begin end begin end
102
uit8 <= datain3[13]; uit9 <= datain4[13]; uit12 <= datain5[13]; uit13 <= datain6[13]; uit14 <= datain7[13]; uit17 <= datain0[14]; uit23 <= datain1[14]; uit15 <= datain2[14]; uit18 <= datain3[14]; uit19 <= datain4[14]; uit20 <= datain5[14]; uit21 <= datain6[14]; uit22 <= datain7[14];
uit5 <= datain0[15]; uit10 <= datain1[15]; uit0 <= datain2[15]; uit1 <= datain3[15]; uit2 <= datain4[15]; uit3 <= datain5[15]; uit4 <= datain6[15]; uit6 <= datain7[15]; uit11 <= datain0[16]; uit16 <= datain1[16]; uit7 <= datain2[16]; uit8 <= datain3[16]; uit9 <= datain4[16]; uit12 <= datain5[16]; uit13 <= datain6[16]; uit14 <= datain7[16]; uit17 <= datain0[17]; uit23 <= datain1[17]; uit15 <= datain2[17]; uit18 <= datain3[17]; uit19 <= datain4[17]; uit20 <= datain5[17]; uit21 <= datain6[17]; uit22 <= datain7[17];
uit5 <= datain0[18]; uit10 <= datain1[18]; uit0 <= datain2[18]; uit1 <= datain3[18]; uit2 <= datain4[18]; uit3 <= datain5[18]; uit4 <= datain6[18]; uit6 <= datain7[18]; uit11 <= datain0[19]; uit16 <= datain1[19]; uit7 <= datain2[19]; uit8 <= datain3[19]; uit9 <= datain4[19]; uit12 <= datain5[19]; uit13 <= datain6[19]; uit14 <= datain7[19]; uit17 <= datain0[20]; uit23 <= datain1[20]; uit15 <= datain2[20]; uit18 <= datain3[20]; uit19 <= datain4[20]; uit20 <= datain5[20]; uit21 <= datain6[20]; uit22 <= datain7[20];
Sabbe Kris
Code beeldopbouw FPGA
103
57: begin uit5 <= datain0[21]; uit10 <= datain1[21]; uit0 <= datain2[21]; uit1 <= datain3[21]; uit2 <= datain4[21]; uit3 <= datain5[21]; uit4 <= datain6[21]; uit6 <= datain7[21]; uit11 <= datain0[22]; uit16 <= datain1[22]; uit7 <= datain2[22]; uit8 <= datain3[22]; uit9 <= datain4[22]; uit12 <= datain5[22]; uit13 <= datain6[22]; uit14 <= datain7[22]; uit17 <= datain0[23]; uit23 <= datain1[23]; uit15 <= datain2[23]; uit18 <= datain3[23]; uit19 <= datain4[23]; uit20 <= datain5[23]; uit21 <= datain6[23]; uit22 <= datain7[23]; end endcase end if(enable==0) begin uit0 <= 1'b0; uit1 <= 1'b0; uit2 <= 1'b0; uit3 <= 1'b0; uit4 <= 1'b0; uit5 <= 1'b0; uit6 <= 1'b0; uit7 <= 1'b0; uit8 <= 1'b0; uit9 <= 1'b0; uit10 <= 1'b0; uit11 <= 1'b0; uit12 <= 1'b0; uit13 <= 1'b0; uit14 <= 1'b0; uit15 <= 1'b0; uit16 <= 1'b0; uit17 <= 1'b0; uit18 <= 1'b0; uit19 <= 1'b0; uit20 <= 1'b0; uit21 <= 1'b0; uit22 <= 1'b0; uit23 <= 1'b0; end end always //@(posedge lees) begin if(teller >=0 && teller <=25) begin if (lees ==1 && enable==1) begin case (teller) 0: begin datain0[0] <= data0; datain1[0] <= data1; datain2[0] <= data2; datain3[0] <= data3; datain4[0] <= data4;
Sabbe Kris
Code beeldopbouw FPGA
1: 2: 3: 4: 5: 6: 7:
end begin end begin end begin end begin end begin end begin end begin
104
datain5[0] <= data5; datain6[0] <= data6; datain7[0] <= data7;
datain0[1] <= data0; datain1[1] <= data1; datain2[1] <= data2; datain3[1] <= data3; datain4[1] <= data4; datain5[1] <= data5; datain6[1] <= data6; datain7[1] <= data7;
datain0[2] <= data0; datain1[2] <= data1; datain2[2] <= data2; datain3[2] <= data3; datain4[2] <= data4; datain5[2] <= data5; datain6[2] <= data6; datain7[2] <= data7;
datain0[3] <= data0; datain1[3] <= data1; datain2[3] <= data2; datain3[3] <= data3; datain4[3] <= data4; datain5[3] <= data5; datain6[3] <= data6; datain7[3] <= data7;
datain0[4] <= data0; datain1[4] <= data1; datain2[4] <= data2; datain3[4] <= data3; datain4[4] <= data4; datain5[4] <= data5; datain6[4] <= data6; datain7[4] <= data7;
datain0[5] <= data0; datain1[5] <= data1; datain2[5] <= data2; datain3[5] <= data3; datain4[5] <= data4; datain5[5] <= data5; datain6[5] <= data6; datain7[5] <= data7;
datain0[6] <= data0; datain1[6] <= data1; datain2[6] <= data2; datain3[6] <= data3; datain4[6] <= data4; datain5[6] <= data5; datain6[6] <= data6; datain7[6] <= data7;
datain0[7] <= data0; datain1[7] <= data1; datain2[7] <= data2; datain3[7] <= data3; datain4[7] <= data4; datain5[7] <= data5;
Sabbe Kris
Code beeldopbouw FPGA
8: 9: 10: 11: 12: 13: 14:
end begin end begin end begin end begin end begin end begin end begin
105
datain6[7] <= data6; datain7[7] <= data7;
datain0[8] <= data0; datain1[8] <= data1; datain2[8] <= data2; datain3[8] <= data3; datain4[8] <= data4; datain5[8] <= data5; datain6[8] <= data6; datain7[8] <= data7;
datain0[9] <= data0; datain1[9] <= data1; datain2[9] <= data2; datain3[9] <= data3; datain4[9] <= data4; datain5[9] <= data5; datain6[9] <= data6; datain7[9] <= data7;
datain0[10] <= data0; datain1[10] <= data1; datain2[10] <= data2; datain3[10] <= data3; datain4[10] <= data4; datain5[10] <= data5; datain6[10] <= data6; datain7[10] <= data7;
datain0[11] <= data0; datain1[11] <= data1; datain2[11] <= data2; datain3[11] <= data3; datain4[11] <= data4; datain5[11] <= data5; datain6[11] <= data6; datain7[11] <= data7;
datain0[12] <= data0; datain1[12] <= data1; datain2[12] <= data2; datain3[12] <= data3; datain4[12] <= data4; datain5[12] <= data5; datain6[12] <= data6; datain7[12] <= data7;
datain0[13] <= data0; datain1[13] <= data1; datain2[13] <= data2; datain3[13] <= data3; datain4[13] <= data4; datain5[13] <= data5; datain6[13] <= data6; datain7[13] <= data7;
datain0[14] <= data0; datain1[14] <= data1; datain2[14] <= data2; datain3[14] <= data3; datain4[14] <= data4; datain5[14] <= data5; datain6[14] <= data6;
Sabbe Kris
Code beeldopbouw FPGA
15: 16: 17: 18: 19: 20: 21:
end begin end begin end begin end begin end begin end begin end begin
106
datain7[14] <= data7;
datain0[15] <= data0; datain1[15] <= data1; datain2[15] <= data2; datain3[15] <= data3; datain4[15] <= data4; datain5[15] <= data5; datain6[15] <= data6; datain7[15] <= data7;
datain0[16] <= data0; datain1[16] <= data1; datain2[16] <= data2; datain3[16] <= data3; datain4[16] <= data4; datain5[16] <= data5; datain6[16] <= data6; datain7[16] <= data7;
datain0[17] <= data0; datain1[17] <= data1; datain2[17] <= data2; datain3[17] <= data3; datain4[17] <= data4; datain5[17] <= data5; datain6[17] <= data6; datain7[17] <= data7;
datain0[18] <= data0; datain1[18] <= data1; datain2[18] <= data2; datain3[18] <= data3; datain4[18] <= data4; datain5[18] <= data5; datain6[18] <= data6; datain7[18] <= data7;
datain0[19] <= data0; datain1[19] <= data1; datain2[19] <= data2; datain3[19] <= data3; datain4[19] <= data4; datain5[19] <= data5; datain6[19] <= data6; datain7[19] <= data7;
datain0[20] <= data0; datain1[20] <= data1; datain2[20] <= data2; datain3[20] <= data3; datain4[20] <= data4; datain5[20] <= data5; datain6[20] <= data6; datain7[20] <= data7;
datain0[21] <= data0; datain1[21] <= data1; datain2[21] <= data2; datain3[21] <= data3; datain4[21] <= data4; datain5[21] <= data5; datain6[21] <= data6; datain7[21] <= data7;
Sabbe Kris end endmodule
Code beeldopbouw FPGA end
end
endcase
22: 23:
end begin end begin end
107
datain0[22] <= data0; datain1[22] <= data1; datain2[22] <= data2; datain3[22] <= data3; datain4[22] <= data4; datain5[22] <= data5; datain6[22] <= data6; datain7[22] <= data7;
datain0[23] <= data0; datain1[23] <= data1; datain2[23] <= data2; datain3[23] <= data3; datain4[23] <= data4; datain5[23] <= data5; datain6[23] <= data6; datain7[23] <= data7;
Sabbe Kris
Code beeldopbouw 2 FPGA
108
Softwarecode om de lus met kleuren rood, groen, blauw, wit en zwart op het beeldscherm te krijgen // WARNING: Do NOT edit the input and output ports in this file in a text // editor if you plan to continue editing the block that represents it in // the Block Editor! File corruption is VERY likely to occur. // Copyright (C) 1991‐2007 Altera Corporation // Your use of Altera Corporation's design tools, logic functions // and other software and tools, and its AMPP partner logic // functions, and any output files from any of the foregoing // (including device programming or simulation files), and any // associated documentation or information are expressly subject // to the terms and conditions of the Altera Program License // Subscription Agreement, Altera MegaCore Function License // Agreement, or other applicable license agreement, including, // without limitation, that your use is for the sole purpose of // programming logic devices manufactured by Altera and sold by // Altera or its authorized distributors. Please refer to the // applicable agreement for further details. // Generated by Quartus II Version 7.2 (Build Build 175 11/20/2007) // Created on Thu Mar 13 11:53:25 2008 // Module Declaration module beeldopbouw2 ( // {{ALTERA_ARGS_BEGIN}} DO NOT REMOVE THIS LINE! data0, data1, data2, data3, data4, data5, data6, data7, lees, update, klok, enable, teller, H_sync, V_sync, blank, uit0, uit1, uit2, uit3, uit4, uit5, uit6, uit7, uit8, uit9, uit10, uit11, uit12, uit13, uit14, uit15, uit16, uit17, uit18, uit19, uit20, uit21, uit22, uit23 // {{ALTERA_ARGS_END}} DO NOT REMOVE THIS LINE! ); // Port Declaration // {{ALTERA_IO_BEGIN}} DO NOT REMOVE THIS LINE! input data0; input data1; input data2; input data3; input data4; input data5; input data6; input data7; input lees; input update; input klok; input enable; input [4:0] teller; input H_sync; input V_sync; input blank; output uit0; output uit1; output uit2; output uit3; output uit4; output uit5; output uit6; output uit7; output uit8; output uit9; output uit10; output uit11; output uit12; output uit13; output uit14; output uit15;
Sabbe Kris
Code beeldopbouw 2 FPGA
109
output uit16; output uit17; output uit18; output uit19; output uit20; output uit21; output uit22; output uit23; reg uit0; reg uit1; reg uit2; reg uit3; reg uit4; reg uit5; reg uit6; reg uit7; reg uit8; reg uit9; reg uit10; reg uit11; reg uit12; reg uit13; reg uit14; reg uit15; reg uit16; reg uit17; reg uit18; reg uit19; reg uit20; reg uit21; reg uit22; reg uit23; reg [4:0] telraam; reg [30:0] teller3; // {{ALTERA_IO_END}} DO NOT REMOVE THIS LINE! always @(posedge klok) begin if (enable==1) begin teller3=teller3+1; if (teller3==16000000) begin telraam = telraam+1; teller3 = 0; end case (telraam) 1: begin//rood uit0 <= 1'b1; uit1 <= 1'b1; uit2 <= 1'b1; uit3 <= 1'b1; uit4 <= 1'b1; uit5 <= 1'b1; uit6 <= 1'b1; uit7 <= 1'b0; uit8 <= 1'b0; uit9 <= 1'b0; uit10 <= 1'b1; uit11 <= 1'b0; uit12 <= 1'b0; uit13 <= 1'b0; uit14 <= 1'b0; uit15 <= 1'b0; uit16 <= 1'b0; uit17 <= 1'b0; uit18 <= 1'b0; uit19 <= 1'b0; uit20 <= 1'b0; uit21 <= 1'b0;
Sabbe Kris
Code beeldopbouw 2 FPGA
110
uit22 <= 1'b0; uit23 <= 1'b0; end 2: begin//groen uit0 <= 1'b0; uit1 <= 1'b0; uit2 <= 1'b0; uit3 <= 1'b0; uit4 <= 1'b0; uit5 <= 1'b0; uit6 <= 1'b0; uit7 <= 1'b1; uit8 <= 1'b1; uit9 <= 1'b1; uit10 <= 1'b0; uit11 <= 1'b1; uit12 <= 1'b1; uit13 <= 1'b1; uit14 <= 1'b1; uit15 <= 1'b0; uit16 <= 1'b1; uit17 <= 1'b0; uit18 <= 1'b0; uit19 <= 1'b0; uit20 <= 1'b0; uit21 <= 1'b0; uit22 <= 1'b0; uit23 <= 1'b0; end 3: begin//blauw uit0 <= 1'b0; uit1 <= 1'b0; uit2 <= 1'b0; uit3 <= 1'b0; uit4 <= 1'b0; uit5 <= 1'b0; uit6 <= 1'b0; uit7 <= 1'b0; uit8 <= 1'b0; uit9 <= 1'b0; uit10 <= 1'b0; uit11 <= 1'b0; uit12 <= 1'b0; uit13 <= 1'b0; uit14 <= 1'b0; uit15 <= 1'b1; uit16 <= 1'b0; uit17 <= 1'b1; uit18 <= 1'b1; uit19 <= 1'b1; uit20 <= 1'b1; uit21 <= 1'b1; uit22 <= 1'b1; uit23 <= 1'b1; end 4: begin//wit uit0 <= 1'b1; uit1 <= 1'b1; uit2 <= 1'b1; uit3 <= 1'b1; uit4 <= 1'b1; uit5 <= 1'b1; uit6 <= 1'b1; uit7 <= 1'b1; uit8 <= 1'b1; uit9 <= 1'b1; uit10 <= 1'b1; uit11 <= 1'b1; uit12 <= 1'b1;
Sabbe Kris endmodule
Code beeldopbouw 2 FPGA end
111
uit13 <= 1'b1; uit14 <= 1'b1; uit15 <= 1'b1; uit16 <= 1'b1; uit17 <= 1'b1; uit18 <= 1'b1; uit19 <= 1'b1; uit20 <= 1'b1; uit21 <= 1'b1; uit22 <= 1'b1; uit23 <= 1'b1; end 5: begin//zwart uit0 <= 1'b0; uit1 <= 1'b0; uit2 <= 1'b0; uit3 <= 1'b0; uit4 <= 1'b0; uit5 <= 1'b0; uit6 <= 1'b0; uit7 <= 1'b0; uit8 <= 1'b0; uit9 <= 1'b0; uit10 <= 1'b0; uit11 <= 1'b0; uit12 <= 1'b0; uit13 <= 1'b0; uit14 <= 1'b0; uit15 <= 1'b0; uit16 <= 1'b0; uit17 <= 1'b0; uit18 <= 1'b0; uit19 <= 1'b0; uit20 <= 1'b0; uit21 <= 1'b0; uit22 <= 1'b0; uit23 <= 1'b0; telraam = 0; end endcase end if (enable==0) begin uit0 <= 1'b0; uit1 <= 1'b0; uit2 <= 1'b0; uit3 <= 1'b0; uit4 <= 1'b0; uit5 <= 1'b0; uit6 <= 1'b0; uit7 <= 1'b0; uit8 <= 1'b0; uit9 <= 1'b0; uit10 <= 1'b0; uit11 <= 1'b0; uit12 <= 1'b0; uit13 <= 1'b0; uit14 <= 1'b0; uit15 <= 1'b0; uit16 <= 1'b0; uit17 <= 1'b0; uit18 <= 1'b0; uit19 <= 1'b0; uit20 <= 1'b0; uit21 <= 1'b0; uit22 <= 1'b0; uit23 <= 1'b0; telraam = 0; end
Sabbe Kris
Code beeldopbouw 3 FPGA
112
Softwarecode om één pixel op het beeldscherm te besturen vanaf de lichttafel. // WARNING: Do NOT edit the input and output ports in this file in a text // editor if you plan to continue editing the block that represents it in // the Block Editor! File corruption is VERY likely to occur. // Copyright (C) 1991‐2007 Altera Corporation // Your use of Altera Corporation's design tools, logic functions // and other software and tools, and its AMPP partner logic // functions, and any output files from any of the foregoing // (including device programming or simulation files), and any // associated documentation or information are expressly subject // to the terms and conditions of the Altera Program License // Subscription Agreement, Altera MegaCore Function License // Agreement, or other applicable license agreement, including, // without limitation, that your use is for the sole purpose of // programming logic devices manufactured by Altera and sold by // Altera or its authorized distributors. Please refer to the // applicable agreement for further details. // Generated by Quartus II Version 7.2 (Build Build 175 11/20/2007) // Created on Tue Apr 01 08:31:55 2008 // Module Declaration module beeld_pix ( // {{ALTERA_ARGS_BEGIN}} DO NOT REMOVE THIS LINE! data0, data1, data2, data3, data4, data5, data6, data7, lees, update, klok, enable1, enable2, enable3, enable4, teller, H_sync, V_sync, blank, uit0, uit1, uit2, uit3, uit4, uit5, uit6, uit7, uit8, uit9, uit10, uit11, uit12, uit13, uit14, uit15, uit16, uit17, uit18, uit19, uit20, uit21, uit22, uit23 // {{ALTERA_ARGS_END}} DO NOT REMOVE THIS LINE! ); // Port Declaration // {{ALTERA_IO_BEGIN}} DO NOT REMOVE THIS LINE! input data0; input data1; input data2; input data3; input data4; input data5; input data6; input data7; input lees; input update; input klok; input enable1; input enable2; input enable3; input enable4; input [4:0] teller; input H_sync; input V_sync; input blank; output uit0; output uit1; output uit2; output uit3; output uit4; output uit5; output uit6; output uit7; output uit8; output uit9; output uit10; output uit11; output uit12; output uit13;
Sabbe Kris
Code beeldopbouw 3 FPGA
113
output uit14; output uit15; output uit16; output uit17; output uit18; output uit19; output uit20; output uit21; output uit22; output uit23; reg uit0; reg uit1; reg uit2; reg uit3; reg uit4; reg uit5; reg uit6; reg uit7; reg uit8; reg uit9; reg uit10; reg uit11; reg uit12; reg uit13; reg uit14; reg uit15; reg uit16; reg uit17; reg uit18; reg uit19; reg uit20; reg uit21; reg uit22; reg uit23; reg [20:0] teller_V; reg [20:0] teller_H; reg [8:0] sab1; reg [30:0] tel2; reg d0; reg d1; reg d2; reg d3; reg d4; reg d5; reg d6; reg d7; reg d8; reg d9; reg d10; reg d11; reg d12; reg d13; reg d14; reg d15; reg d16; reg d17; reg d18; reg d19; reg d20; reg d21; reg d22; reg d23; reg d24; reg d25; reg d26; reg d27; reg d28; reg d29; reg d30; reg d31; reg d32;
Sabbe Kris
Code beeldopbouw 3 FPGA
114
reg d33; reg d34; reg d35; reg d36; reg d37; reg d38; reg d39; reg [112:0] tel3; reg [50:0] tel4; reg [50:0] tel5; reg [1:0] richting; reg [50:0] tellertje; reg [7:0] welkelijn; // {{ALTERA_IO_END}} DO NOT REMOVE THIS LINE! always @ (posedge klok) begin if(lees==1 && teller==0) begin d0 <= data0; d1 <= data1; d2 <= data2; d3 <= data3; d4 <= data4; d5 <= data5; d6 <= data6; d7 <= data7; end if(lees==1 && teller==1) begin d8 <= data0; d9 <= data1; d10 <= data2; d11 <= data3; d12 <= data4; d13 <= data5; d14 <= data6; d15 <= data7; end if(lees==1 && teller==2) begin d16 <= data0; d17 <= data1; d18 <= data2; d19 <= data3; d20 <= data4; d21 <= data5; d22 <= data6; d23 <= data7; end if(lees==1 && teller==3) begin d24 <= data0; d25 <= data1; d26 <= data2; d27 <= data3; d28 <= data4; d29 <= data5; d30 <= data6; d31 <= data7; end if(lees==1 && teller==4) begin d32 <= data0; d33 <= data1; d34 <= data2; d35 <= data3; d36 <= data4; d37 <= data5; d38 <= data6; d39 <= data7; end
Sabbe Kris
Code beeldopbouw 3 FPGA if(enable1 ==1) begin
115
tel2 = tel2 + 1; tel3 = tel3 + 1; tel4 = 8400*8*(d24*1+d25*2+d26*4+d27*8+d28*16+d29*32+d30*64+d31*128); tel5 = (d32*1+d33*2+d34*4+d35*8+d36*16+d37*32+d38*64+d39*128)/5; if(tel2>=(17740800‐tel4)) begin if(richting==0) begin sab1 = sab1+1; end if(richting==1) begin sab1 = sab1‐1; end tel2=0; end if(sab1>=111‐tel5) /////////111 of 27 of 55 begin richting=1; end if(sab1<=0) begin richting=0; end if(teller_H == 840) begin teller_H=0; teller_V = teller_V+1; end if(V_sync == 1) begin teller_V=0; end if(blank==1) begin //teller_V=0; teller_H=0; end teller_H = teller_H+1; //teller_V = teller_V+1; if(teller_V >=50 && teller_V <=57) begin if ( teller_H >=55+sab1 && teller_H <= 55+sab1+tel5) begin uit0 <= d2; uit1 <= d3; uit2 <= d4; uit3 <= d5; uit4 <= d6; uit5 <= d0; uit6 <= d7; uit7 <= d10; uit8 <= d11; uit9 <= d12; uit10 <= d1; uit11 <= d8; uit12 <= d13; uit13 <= d14; uit14 <= d15; uit15 <= d18; uit16 <= d9; uit17 <= d16; uit18 <= d19; uit19 <= d20; uit20 <= d21;
Sabbe Kris
Code beeldopbouw 3 FPGA
end
if(enable2 ==1) begin
else begin end end
end
116
uit21 <= d22; uit22 <= d23; uit23 <= d17;
uit0 <= 1'b0; uit1 <= 1'b0; uit2 <= 1'b0; uit3 <= 1'b0; uit4 <= 1'b0; uit5 <= 1'b0; uit6 <= 1'b0; uit7 <= 1'b0; uit8 <= 1'b0; uit9 <= 1'b0; uit10 <= 1'b0; uit11 <= 1'b0; uit12 <= 1'b0; uit13 <= 1'b0; uit14 <= 1'b0; uit15 <= 1'b0; uit16 <= 1'b0; uit17 <= 1'b0; uit18 <= 1'b0; uit19 <= 1'b0; uit20 <= 1'b0; uit21 <= 1'b0; uit22 <= 1'b0; uit23 <= 1'b0;
tel2 = tel2 + 1; tel3 = tel3 + 1; tel4 = 8400*8*(d24*1+d25*2+d26*4+d27*8+d28*16+d29*32+d30*64+d31*128); if(tel2>=(17740800‐tel4)) begin if(richting==0) begin sab1 = sab1+1; end if(richting==1) begin sab1 = sab1‐1; end tel2=0; end if(sab1>=55) /////////111 of 27 of 55 begin richting=1; end if(sab1<=0) begin richting=0; end if(teller_H == 840) begin teller_H=0; teller_V = teller_V+1; end if(V_sync == 1) begin teller_V=0; end
Sabbe Kris
Code beeldopbouw 3 FPGA
if(blank==1) begin //teller_V=0; teller_H=0; end
end
teller_H = teller_H+1; //teller_V = teller_V+1; if(teller_V >=50 && teller_V <=57) begin if ( teller_H ==55+sab1 || teller_H ==166‐sab1) begin uit0 <= d2; uit1 <= d3; uit2 <= d4; uit3 <= d5; uit4 <= d6; uit5 <= d0; uit6 <= d7; uit7 <= d10; uit8 <= d11; uit9 <= d12; uit10 <= d1; uit11 <= d8; uit12 <= d13; uit13 <= d14; uit14 <= d15; uit15 <= d18; uit16 <= d9; uit17 <= d16; uit18 <= d19; uit19 <= d20; uit20 <= d21; uit21 <= d22; uit22 <= d23; uit23 <= d17; end else begin uit0 <= 1'b0; uit1 <= 1'b0; uit2 <= 1'b0; uit3 <= 1'b0; uit4 <= 1'b0; uit5 <= 1'b0; uit6 <= 1'b0; uit7 <= 1'b0; uit8 <= 1'b0; uit9 <= 1'b0; uit10 <= 1'b0; uit11 <= 1'b0; uit12 <= 1'b0; uit13 <= 1'b0; uit14 <= 1'b0; uit15 <= 1'b0; uit16 <= 1'b0; uit17 <= 1'b0; uit18 <= 1'b0; uit19 <= 1'b0; uit20 <= 1'b0; uit21 <= 1'b0; uit22 <= 1'b0; uit23 <= 1'b0; end end
117
Sabbe Kris ==166‐sab1)
Code beeldopbouw 3 FPGA
118
if(enable3 ==1) begin tel2 = tel2 + 1; tel3 = tel3 + 1; tel4 = 8400*8*(d24*1+d25*2+d26*4+d27*8+d28*16+d29*32+d30*64+d31*128); if(tel2>=(17740800‐tel4)) begin if(richting==0) begin sab1 = sab1+1; end if(richting==1) begin sab1 = sab1‐1; end tel2=0; end
if(sab1>=27) /////////111 of 27 of 55 begin richting=1; end if(sab1<=0) begin richting=0; end if(teller_H == 840) begin teller_H=0; teller_V = teller_V+1; end if(V_sync == 1) begin teller_V=0; end if(blank==1) begin //teller_V=0; teller_H=0; end
teller_H = teller_H+1; //teller_V = teller_V+1; if(teller_V >=50 && teller_V <=57) begin if ( teller_H ==55+sab1 || teller_H ==110‐sab1 || teller_H ==111+sab1 || teller_H
begin
uit0 <= d2; uit1 <= d3; uit2 <= d4; uit3 <= d5; uit4 <= d6; uit5 <= d0; uit6 <= d7; uit7 <= d10; uit8 <= d11; uit9 <= d12; uit10 <= d1; uit11 <= d8; uit12 <= d13; uit13 <= d14; uit14 <= d15; uit15 <= d18; uit16 <= d9; uit17 <= d16; uit18 <= d19;
Sabbe Kris
Code beeldopbouw 3 FPGA
119
uit19 <= d20; uit20 <= d21; uit21 <= d22; uit22 <= d23; uit23 <= d17; end else begin uit0 <= 1'b0; uit1 <= 1'b0; uit2 <= 1'b0; uit3 <= 1'b0; uit4 <= 1'b0; uit5 <= 1'b0; uit6 <= 1'b0; uit7 <= 1'b0; uit8 <= 1'b0; uit9 <= 1'b0; uit10 <= 1'b0; uit11 <= 1'b0; uit12 <= 1'b0; uit13 <= 1'b0; uit14 <= 1'b0; uit15 <= 1'b0; uit16 <= 1'b0; uit17 <= 1'b0; uit18 <= 1'b0; uit19 <= 1'b0; uit20 <= 1'b0; uit21 <= 1'b0; uit22 <= 1'b0; uit23 <= 1'b0; end end end if(enable4 ==1) begin tel2 = tel2 + 1; tel3 = tel3 + 1; tel4 = (d24*1+d25*2+d26*4+d27*8+d28*16+d29*32+d30*64+d31*128)/2; if(tel2>=(17740800‐tel4)) begin if(richting==0) begin sab1 = sab1+1; end if(richting==1) begin sab1 = sab1‐1; end tel2=0; end
if(sab1>=23) /////////111 of 27 of 55 begin richting=0; sab1=0; end if(sab1<=0) begin richting=0; end if(teller_H == 840) begin teller_H=0; teller_V = teller_V+1; end if(V_sync == 1)
Sabbe Kris
Code beeldopbouw 3 FPGA
begin teller_V=0; end if(blank==1) begin //teller_V=0; teller_H=0; end
teller_H = teller_H+1; //teller_V = teller_V+1; if(teller_V >=50 && teller_V <=57) begin if ( teller_H ==55+tel4) begin uit0 <= d2; uit1 <= d3; uit2 <= d4; uit3 <= d5; uit4 <= d6; uit5 <= d0; uit6 <= d7; uit7 <= d10; uit8 <= d11; uit9 <= d12; uit10 <= d1; uit11 <= d8; uit12 <= d13; uit13 <= d14; uit14 <= d15; uit15 <= d18; uit16 <= d9; uit17 <= d16; uit18 <= d19; uit19 <= d20; uit20 <= d21; uit21 <= d22; uit22 <= d23; uit23 <= d17; end else begin uit0 <= 1'b0; uit1 <= 1'b0; uit2 <= 1'b0; uit3 <= 1'b0; uit4 <= 1'b0; uit5 <= 1'b0; uit6 <= 1'b0; uit7 <= 1'b0; uit8 <= 1'b0; uit9 <= 1'b0; uit10 <= 1'b0; uit11 <= 1'b0; uit12 <= 1'b0; uit13 <= 1'b0; uit14 <= 1'b0; uit15 <= 1'b0; uit16 <= 1'b0; uit17 <= 1'b0; uit18 <= 1'b0; uit19 <= 1'b0; uit20 <= 1'b0; uit21 <= 1'b0; uit22 <= 1'b0; uit23 <= 1'b0; end
120
Sabbe Kris end endmodule
Code beeldopbouw 3 FPGA
121
end end if(enable1 == 0 && enable2 == 0 && enable3 == 0 && enable4 == 0) begin sab1=0; richting=0; welkelijn=0; uit0 <= 1'b0; uit1 <= 1'b0; uit2 <= 1'b0; uit3 <= 1'b0; uit4 <= 1'b0; uit5 <= 1'b0; uit6 <= 1'b0; uit7 <= 1'b0; uit8 <= 1'b0; uit9 <= 1'b0; uit10 <= 1'b0; uit11 <= 1'b0; uit12 <= 1'b0; uit13 <= 1'b0; uit14 <= 1'b0; uit15 <= 1'b0; uit16 <= 1'b0; uit17 <= 1'b0; uit18 <= 1'b0; uit19 <= 1'b0; uit20 <= 1'b0; uit21 <= 1'b0; uit22 <= 1'b0; uit23 <= 1'b0; end
Aansturen LED display via art‐net
122
9. Literatuurlijst Altera (2006). Pinconfiguration Cyclone I [Datasheet]. s.l.: s.n. Altera (s.d.). Cyclone FPGA family datasheet [Datasheet]. s.l.: s.n. Altera (s.d.). Serial configuration device EPCS1 [Datasheet]. s.l.: s.n. Microchip Technology Incorporated, (2005). MPLAB ® C18 C Compiler User’s Guide [Brochure]. USA: s.n. Microchip Technology Incorporated, (2005). MPLAB ® C18 C Compiler Getting Started [Brochure]. USA: s.n. Microchip Technology Incorporated, (2005). MPLAB ® C18 C Compiler Libraries [Brochure]. USA: s.n. Microchip Technology Incorporated, (2007). MPLAB ® ICD 2 In‐Circuit Debugger User’s Guide [Brochure]. USA: s.n. Reynaert , H. (2006). Art‐net controlled video. Onuitgegeven eindwerk gegradueerde in elektriciteit, optie elektronica. Oostende: KHBO. Showtec, (s.d.). Showtec showmaster 24[Datasheet]. s.l.: s.n. Texas Instruments (2002). TI Panelbus ™ digital transmitter [Brochure]. s.l.: s.n. Website Altera, (1995). Geraadpleegd op 30 april 2008, op http://www.altera.com/ Website Barco, (s.d.). Geraadpleegd op 30 april 2008, op http://www.barco.com/ Website Farnell, (s.d.). Geraadpleegd op 30 april 2008, op http://be.farnell.com/ Website Google, (s.d.) Geraadpleegd op 13 mei 2008, op http://www.google.be/firefox?client=firefox‐a&rls=org.mozilla:nl:official Website Wikipedia, (s.d.). Geraadpleegd op 13 mei 2008, op http://nl.wikipedia.org/wiki/Hoofdpagina
Kris Sabbe
3AI1E0
Oostende 2007‐2008