[EIP] Led Klok

Pagina: 1
Acties:
  • 2.801 views sinds 30-01-2008
  • Reageer

Acties:
  • 0 Henk 'm!

  • Anthor
  • Registratie: Juni 2002
  • Niet online
Ik ben al een tijdje bezig met een projectje, en het lijkt me leuk om hier eens een [EIP] te posten, want als ze dat in CM kunnen, kan dat hier ook.

Mijn doel is een PIC gestuurde klok te maken mbv een pic16f628a

Dit is het schema dat ik er voor heb gemaakt gemaakt:
Afbeeldingslocatie: http://www.scrap.cistron.nl/Picklok/schema4klein.png
(klikken voor een plaatje dat wel leesbaar is, update 9-2-'07)

Ik heb besloten dmv een decade teller en 7+1 uitgangen op de PIC een 7x6 led matrix te maken.
(Ik was al bezig voordat het led kubus topic er was ;), en ik denk dat als ik een schuifregister gebruik dat ik dan meer instructies gebruik dan met een decade.)

De display maak ik van ledjes dus ik heb geen 7segment encoders, maar een uln2803 (die ik nog had liggen) zodat ik iets heb dat vergelijkbaar is met een common cathode display.
In de software die ik al grotendeels geschreven heb worden de uitgangen gecodeerd naar 7seg. getallen.

De klok wordt gestruurd door een timer aan een 32.768 KHz kristel en PIC draait mbv een kristal op RA6 en RA7 op 20 MHz om zoveel mogelijk bewerkingen uit te kunnen voeren tijdens een seconde.
Het doel is namelijk om de cijfers die veranderen dmv pwm te faden. Daarom verdeel ik de secondes in 256 'tikken'

Ik heb ruzie met Eagle dus heb ik daarin alleen het schema gemaakt, voor de layout heb ik autocad gebruikt. Het is een beetje onorthodoxe manier, maar voor mij werkt het. Ik heb een raster van 2.54 mm en daarop plaats ik de omtrekken van de componenten (de footprint zet ik er niet altijd bij)
En dan krijg je dit:
Afbeeldingslocatie: http://www.scrap.cistron.nl/Picklok/layout.png

Met de componenten op de printplaat krijg je dan zoiets:
Afbeeldingslocatie: http://www.scrap.cistron.nl/Picklok/layout2.jpg

(de layout is een iets oudere versie, maar ik had geen zin om al die gaatjes opnieuw te prikken voor een kleine wijziging)

De display bestaat uit 3 aparte prints, die met flatcables aangesloten worden
Afbeeldingslocatie: http://www.scrap.cistron.nl/Picklok/digit.jpg

Daar komt dan een plaat voor, waar de vorm van de segmenten uit gehaald is.
Afbeeldingslocatie: http://www.scrap.cistron.nl/Picklok/digits.png
De uiteindelijk display wordt dan ongeveer 25,5 x 5,5 cm

En dit is de stand van zaken:
- Ik heb een schema, layout en de componenten voor de 'hoofdprint', en al één print met ledjes, en het materiaal voor de andere 2.
- De software voor de klok is al voor een groot deel geschreven, en getest met een output van één cijfer.
Ik weet nog niet of het gaat werken met de decade, want die heb ik nog niet kunnnen testen op mijn kleine breadboardje.

De volgende stap zal het solderen van de hoofdprint zijn, maar ik twijfel nog een beetje aan het schema en de layout.

-Dit is de eerste keer dat ik met kristallen werk, en ik vraag me af of ze zo goed geplaatst zijn. Ik vind dat het allemaal wel erg dicht op elkaar zit en vraag me af of ik zo geen last krijg van storing.

- De pic heeft een 0,1 uF condensator tussen Vdd en GND nodig die zo dicht mogelijk bij de PIC geplaatst moet worden, maar ik heb begrepen dat kristallen dat ook moeten, en nu vraag ik me af welke van de twee voorrang heeft.

Misschien dat iemand daar wat meer over kan zeggen?

Dat was het dan voor nu, updates volgen nog.

Acties:
  • 0 Henk 'm!

  • naftebakje
  • Registratie: Februari 2002
  • Laatst online: 12-10 07:15
-Dat ontstoringscondensatortje voor de PIC wordt doorgaans onder de ICvoet van de PIC gezet, die kan daar net onder en zit in niemand zijn weg.
-Kristallen zijn niet echt storingsgevoelig AFAIK, als je enige problemen verwacht kan je de metalen behuizing van het kristal aan de massa hangen.

Voor storing is het wel belangerijk de massa goed te routen, voedingslijnen en ontstoringslijnen moeten goed gescheiden zijn, en met aparte draden naar het centrale massapunt lopen. Dat is nu niet voorzien op je printje, je hebt flinke kans dat het wel gewoon werkt, maar het is toch veiliger om dat goed te voorzien, gelijktijdig hardware en software debuggen is erg moeilijk.

Als de boer zijn koeien kust, zijn ze jarig wees gerust. Varkens op een landingsbaan, leiden nooit een lang bestaan. Als de boer zich met stront wast, zijn zijn hersens aangetast. Als het hooi is in de schuur, zit het wijf bij den gebuur.


Acties:
  • 0 Henk 'm!

  • M-ThijZ
  • Registratie: Maart 2003
  • Laatst online: 23:32

M-ThijZ

Riding on Rails

Waarom kies je eigenlijk niet voor 6 7-segment displays? Dat is toch veel makkelijker (met BCD?) aan te sturen?

Acties:
  • 0 Henk 'm!

  • bazzzzzz
  • Registratie: Januari 2007
  • Laatst online: 13-10 16:00
hoe kom je aan je klokpuls? je doet dat met een kristal maar daar heb je er 2 van? Met eentje lukt het toch ook? en idd ik had mijn voorkeur gegeven aan een schuifregister:P maar dit werkt vast en zeker net zo goed

Acties:
  • 0 Henk 'm!

  • Anthor
  • Registratie: Juni 2002
  • Niet online
@naftebakje
De 0,1 uF condensatoren die ik heb lijken mij te hoog om onder de pic te passen. Ik laat sowieso een extra ic voetje aan de pic zitten zodat er geen pinnetjes afbreken als ik hem uit het voetje haal om te proggen. Dus onder twee voetjes past het net maar dat lijkt me wat raar.

Ik laat nu een signaal lijn (RA0) onder de PIC doorlopen, ik weet niet of dat kwaad kan, maar daardoor kan de condensator niet tussen de IC voet.

Ik kan je niet helemaal volgen qua onstoringslijnen, zijn dat andere lijnen dan de gnd verbindingen?
of bedoel je dat ik in het midden een flinke plak tin moet maken en de gnd van de 4017 daar met een draadbrug aan moet verbinden, en dan de verbinding tussen de 4017 en de spanningsregelaar weg moet halen? (of denk ik nu te makkelijk en kan ik beter een nieuwe layout verzinnen?)

@M-ThijZ
Ik heb er wel over nagedacht, maar uiteindelijk besloten het met ledjes te doen omdat er anders weer meer componenten bij zouden komen voor iets dat softwarematig kan.

En daar komt bij dat een enkele 5cm 7-segment display iets van 8 euro gaat kosten. 46 ledjes zijn dan goedkoper.

@bazzzzzz
hoe kom je aan je klokpuls? je doet dat met een kristal maar daar heb je er 2 van? Met eentje lukt het toch ook? en idd ik had mijn voorkeur gegeven aan een schuifregister:P maar dit werkt vast en zeker net zo goed

Het ene kristal is om de PIC op 20 Mhz te laten draaien. De interne oscillator is 4 Mhz en ik heb voor het extra kristal gekozen om tussen twee klok tikken meer code uit te kunnen laten voeren.

Het andere kristal is een zogenaamd horloge kristal (32,768 Khz) die timer 1 aanstuurt voor de tijdbepaling (ik heb ook overwogen om dcf77 te gebruiken, maar dat is misschien iets voor later)

Acties:
  • 0 Henk 'm!

  • Cassettebandje
  • Registratie: Juli 2002
  • Laatst online: 19:06

Cassettebandje

SA-C90 TDK

Anthor schreef op maandag 29 januari 2007 @ 00:08:
Ik laat nu een signaal lijn (RA0) onder de PIC doorlopen, ik weet niet of dat kwaad kan, maar daardoor kan de condensator niet tussen de IC voet.
Neu, gaat wel goed. Je hoeft je niet zo heel druk te maken om storingen e.d. Meestal gaat het wel goed.
Wat misschien op de lange duur een probleem kan worden is de reset van de 4017. Stel nou dat die per ongeluk een keertje getriggerd wordt door de storing van een afgaande telefoon dan staat ie anders dan de pic denkt. Gevolg is dat je hele weergave verandert. Het is dat je geen pootje over hebt op je pic, anders zou ik regelmatig een reset geven. Eventueel kun je nog een pootje besparen door het kristal extern te versterken ipv door de pic.

Acties:
  • 0 Henk 'm!

  • naftebakje
  • Registratie: Februari 2002
  • Laatst online: 12-10 07:15
Anthor schreef op maandag 29 januari 2007 @ 00:08:
@naftebakje
De 0,1 uF condensatoren die ik heb lijken mij te hoog om onder de pic te passen. Ik laat sowieso een extra ic voetje aan de pic zitten zodat er geen pinnetjes afbreken als ik hem uit het voetje haal om te proggen. Dus onder twee voetjes past het net maar dat lijkt me wat raar.

Ik laat nu een signaal lijn (RA0) onder de PIC doorlopen, ik weet niet of dat kwaad kan, maar daardoor kan de condensator niet tussen de IC voet.

Ik kan je niet helemaal volgen qua onstoringslijnen, zijn dat andere lijnen dan de gnd verbindingen?
of bedoel je dat ik in het midden een flinke plak tin moet maken en de gnd van de 4017 daar met een draadbrug aan moet verbinden, en dan de verbinding tussen de 4017 en de spanningsregelaar weg moet halen? (of denk ik nu te makkelijk en kan ik beter een nieuwe layout verzinnen?)
...
Doorgaans worden voor die 100nF onstoringscondensator zo'n kleine blauwe of geelbruine condensatortjes gebruikt (ik dacht sibatiet condensatoren, maar mijn elektroboer , zoals rechtsboven in deze foto, die kan netjes onder een voetje:
Afbeeldingslocatie: http://content.answers.com/main/content/wp/en-commons/thumb/c/cb/270px-Photo-SMDcapacitors.jpg
die kan gerust er naast zitten (als hij er vlakbij zit), maar dan heb je wat meer moeite om em te verbinden zonder kruisingen.

Wat ik bedoel met die onstorting: Normaal neem je een centraal massapunt, waar alle draden naar massa op toekomen, bij jou is de meest logische plaats de massapin van de 7805. Dan ga je de massa's waar "rommel" op kan staan (aan die condensatortjes bij de kristallen bijvoorbeeld) een aparte draad naar het centrale massapunt geven, een draadje voor beide kristallen is genoeg, dit noem ik gemakshalve de ontstoringsdraden. De voedingsdraden naar de IC's uitgezonderd de 2803 mogen geen storing hebben, vandaar dat die een ander draadje naar het centrale massapunt krijgen (zo komt de storing van het kristal de PIC niet binnen via zijn voeding), de pull-downs bij de schakelaars mogen daar gerust bij, die geven ook geen storing. De 2803 is een gevalletje apart, die IC wordt vaak gebruikt voor zaken waar veel storing bij komt kijken (bijvoorbeeld motoren of spoelen aansturen, krijg je piekstromen enzo, of wanneer er lange draden aan hangen), dus geef je die doorgaans beter ook een aparte massadraad, maar hier zal dat niet noodzakelijk zijn (die ledje geven geen storing, en de piekstromen vallen wel mee), dus mag je die eventueel toch samennemen met de voeding van de andere IC's.

Het is hier waarschijnlijk overbodig, maar tis wel interessant om er al eens van gehoord te hebben, als je een motor aanstuurt en de µC doet enorm raar, dan weet je dat het storing zou kunnen zijn O-)

Als de boer zijn koeien kust, zijn ze jarig wees gerust. Varkens op een landingsbaan, leiden nooit een lang bestaan. Als de boer zich met stront wast, zijn zijn hersens aangetast. Als het hooi is in de schuur, zit het wijf bij den gebuur.


Acties:
  • 0 Henk 'm!

  • Anthor
  • Registratie: Juni 2002
  • Niet online
Cassettebandje schreef op maandag 29 januari 2007 @ 08:52:
Wat misschien op de lange duur een probleem kan worden is de reset van de 4017. Stel nou dat die per ongeluk een keertje getriggerd wordt door de storing van een afgaande telefoon dan staat ie anders dan de pic denkt. Gevolg is dat je hele weergave verandert. Het is dat je geen pootje over hebt op je pic, anders zou ik regelmatig een reset geven. Eventueel kun je nog een pootje besparen door het kristal extern te versterken ipv door de pic.
Goed punt. Ik heb het me op een gegeven moment ook gerealiseerd, maar dat was dus kennelijk weer even weggezakt.

na eerst een hoop onzin getypt te hebben kom ik hier op uit:

Ik had RA2/3/4 gereserveerd voor het instellen van de klok.
Qua software heb ik daar nog niks voor gemaakt, dus ik weet nog niet precies welke pin waar voor gebruikt wordt. Ik zat te denken aan een set knop die je ingedrukt houdt om met de andere knoppen uren en minuten in te stellen. Waarom ik RA5 niet gebruikt heb weet ik niet, ik gebruik geen ICP en LVP en de MCLR staat ook uit. Ik kan de knoppen die ik voor RA2/3/4 in gedachte had dus een pinnetje opschuiven en RA2 ergens anders voor gebruiken.

maar ik kan de sync op twee manieren laten gebeuren
1: de 4017 te laten vertellen waar hij is.
- De 4017 telt van 0 tot 5, en reset meteen naar 0 als hij bij 6 is.
op de IC zit op pin 12 een 1/10 functie die (als je tot tien telt) van 0-4 hoog is en van 5-9 laag is.
Deze kan ik op een input aansluiten en de hele handel syncen met een 'do, loop until' lus in de software

2: Iedere cyclus een reset meegeven aan de 4017 door RA1 als output te gebruiken en aan de reset van de 4017 te koppelen. (RA2 wordt dan de clock)

Optie 2 lijkt me toch beter omdat het niet echt fout kan gaan, het kost wel een pin die ik misschien nog ergens anders voor had kunnen gebruiken.

@Naftebakje
Ik was al adhv je vorige post aan de slag gegaan. Ik heb zoals je in het onderstaande ontwerp kan zien, de term 'centraal massapunt' iets te letterlijk genomen.
Dit schema heb ik toch maar met Eagle gemaakt. De interface van dat programma ligt me niet zo, maar ik heb er weer een plusje op m'n skills bij ;)
edit:
plaatje weggehaald
Ik vond ook nog een fout in het oorspronkelijke ontwerp.
Ik was in de veronderstelling dat pin 14 de clock was en pin 13 een geinverteerde clock.
De clock telt bij een opgaande flank dus ik dacht even dat als pin 13 ook aan zou sluiten, dat hij dan ook zou tellen bij de neergaande flank, en dat dat een extra bewerking zou schelen.
Maar pin13 moet dus aan de GND

[ Voor 3% gewijzigd door Anthor op 09-02-2007 13:43 ]


Acties:
  • 0 Henk 'm!

  • Zjosh
  • Registratie: November 2004
  • Laatst online: 16:29
1 klein commentaar op je pcb ontwerp. Je maakt overal rechte hoeken, mij is altijd geleerd om dat niet te doen. Er zou namelijk ets materiaal in die hoek kunnen blijven zitten ofzo. Ik zou overal mooie 45 graden hoeken van maken.

Acties:
  • 0 Henk 'm!

  • naftebakje
  • Registratie: Februari 2002
  • Laatst online: 12-10 07:15
Zjosh schreef op dinsdag 30 januari 2007 @ 09:25:
1 klein commentaar op je pcb ontwerp. Je maakt overal rechte hoeken, mij is altijd geleerd om dat niet te doen. Er zou namelijk ets materiaal in die hoek kunnen blijven zitten ofzo. Ik zou overal mooie 45 graden hoeken van maken.
Klopt, de meeste programma's doen dat trouwens automagisch.
Dat centrale massapunt dat je nu hebt is geen probleem hoor, alleen zou ik nog een wat dikkere draad naar de voeding (7805) gebruiken.
Tis te zeggen, ik teken gewoon mijn simpele printen zonder de massa's aan te sluiten, en maak dan een groot massavlak, dat etst sneller (minder koper dat weg moet) en is gemakkelijk voor uitmeten (massa zit altijd vlakbij) en aanpassen (nog snel een onstoringsC'tje bij naar de massa).

Als de boer zijn koeien kust, zijn ze jarig wees gerust. Varkens op een landingsbaan, leiden nooit een lang bestaan. Als de boer zich met stront wast, zijn zijn hersens aangetast. Als het hooi is in de schuur, zit het wijf bij den gebuur.


Acties:
  • 0 Henk 'm!

  • Anthor
  • Registratie: Juni 2002
  • Niet online
Dit is eigenlijk de eerste grote update al.

Ik heb gisteren flink door gesoldeerd en de prints zijn nu bijna af. Ik heb 'on the fly' een paar kleine aanpassingen gedaan aan de layout, maar voor het schema heeft het geen gevolgen.

Zie hier het resultaat:
Afbeeldingslocatie: http://www.scrap.cistron.nl/Picklok/print1-voorkant.jpg

De weerstand tussen de grond, reset van de 4017 en RA2 heb ik nog niet aangesloten aan de pin.
Kan het kwaad om direct 5 volt op een pin te zetten die als uitgang ingesteld is. De pull-up staat uit, maar als ik die aanzet kan ik de pin toch niet meer op 5 volt zetten?
De potmeters heb ik er nog niet op gezet omdat ik eerst wilde zien hoe de kabels er het beste op konden.

Afbeeldingslocatie: http://www.scrap.cistron.nl/Picklok/print1-achterkant.jpg

De draadjes heb ik voor jullie zo goed mogelijk in mooie bochten proberen te buigen ;)
Ik was iets te enthousiast bij het maken van de grote kwak tin in het midden, maar die laat ik zo, omdat ik als het netjes ga maken veel warmte toe moet voeren, en ik ben bang dat er dan dingen kapot gaan (de 4017 bv) Of het uit had gemaakt weet ik niet, maar ik soldeer nog met loodhoudende tin. Dat schijnt makkelijker te gaan.

En hier een achterkantje van een cijfer. Er is niet zoveel te zien, maar de ledjes zitten precies zo op de print, dat mijn 7segment ontwerp dat ik in autocad heb gemaakt er precies overheen gaat vallen.
Voor de connectoren heb ik een oude flatcables gerecycled.

Afbeeldingslocatie: http://www.scrap.cistron.nl/Picklok/digit-achterkant.jpg

En dit is het resultaat van een hoop soldeerwerk:
Afbeeldingslocatie: http://www.scrap.cistron.nl/Picklok/totaal1.jpg

De software die ik klaar had liggen had een paar kleine aanpassingen nodig, maar het werkt op het eerste gezicht beter dan verwacht. Toen ik aan het testen was met 1 cijfer op een breadboard knipperde het cijfer zichtbaar ipv een geleidelijk fade, Maar dat probleem heb ik nu niet. Wel knipperen de cijfers die veranderen een keer te veel (behalve de enkele secondes), maar ik ga nog aan de software werken, dus dat is niet zo'n probleem.

Hier staat een filmpje van de klok in 'actie'
De cijfers zijn niet heel erg duidelijk (ligt ook aan m'n camera)
Zoals je ziet springt de klok ook even 24:00:00, dit is bewust gedaan dus geen foutje.

Om de ledjes helderder te krijgen kan ik proberen de code te optimaliseren, en anders kan ik óf de voorschakel weerstandjes omsolderen naar 150 Ohm (lastig omdat de pootjes omgebogen zijn en als verbinding dienen), óf er 1K weerstanden parallel bij zetten.

[/update]

Acties:
  • 0 Henk 'm!

  • SA007
  • Registratie: Oktober 2002
  • Laatst online: 11-10 16:24

SA007

Moderator Tweaking
@naftebakje, die grote groundplaten etsen niet alleen sneller, is is ook goedkoper, omdat je minder etsmiddel gebruikt, verder is het ook meteen een gedeelte afscherming ;)

Acties:
  • 0 Henk 'm!

  • naftebakje
  • Registratie: Februari 2002
  • Laatst online: 12-10 07:15
Direct spanning binnensteken op een uitgang is erg gevaarlijk, als die uitgang laag wordt ga je een kortsluiting maken door het IC. Plaats er een weerstand tussen, zo berekend dat er niet meer dan de maximale stroom door het IC kan lopen.

Als de boer zijn koeien kust, zijn ze jarig wees gerust. Varkens op een landingsbaan, leiden nooit een lang bestaan. Als de boer zich met stront wast, zijn zijn hersens aangetast. Als het hooi is in de schuur, zit het wijf bij den gebuur.


Acties:
  • 0 Henk 'm!

  • Anthor
  • Registratie: Juni 2002
  • Niet online
Dit topic is al weer een beetje weggezakt dus even een update kickje Afbeeldingslocatie: http://www.scrap.cistron.nl/kick.gif © /me

Het lag eventjes stil omdat ik mijn PIC niet meer geprogrammeerd kreeg.
Ik heb nu een andere (die ik min of meer al afschreven had) weer aan de praat gekregen. Er schijnt een probleem te kunnen onstaan als je in winpic instelt als jdm(2) programmer en iets doet met intosc en mclr, misschien dat er toen zoiets gebeurd is. Maar ik vraag me ondertussen wel af of mijn programmer wel binnen de marges blijft, ik heb nu al bij 2 PICs gehad dat ik ze een tijdje zonder problemen kon programmeren, maar dat ze op een gegeven moment foutmeldingen gaven.
naftebakje schreef op woensdag 31 januari 2007 @ 22:10:
Direct spanning binnensteken op een uitgang is erg gevaarlijk, als die uitgang laag wordt ga je een kortsluiting maken door het IC. Plaats er een weerstand tussen, zo berekend dat er niet meer dan de maximale stroom door het IC kan lopen.
De PIC die ik gebruikte voor m'n clock krijg ik nu niet meer aan de praat dus ik het zou kunnen dat ik ietsjes te laat ben met die weerstand. Ik heb ondertussen al nieuwe pics besteld (en binnen), maar het kan geen kwaad om backups te hebben.

Er mag maximaal 25 mA 'gesinkt' worden door een i/o pin. Als ik dat op 20 mA zet voor de zekerheid kom ik uit op een 250 Ohm weerstand bij 5 V. Dat heb ik getest door de draabrug door te knippen en er een weerstandje op te solderen, maar dan bleef er te weinig spanning over om de 4017 te resetten (bij lagere waardes of enkel een diode ook). Ik heb het nu opgeslost door er een BC547b transistor tussen te zetten met een 10 K weerstand tussen de basis en de i/o pin van de PIC. (10K was het één na hoogste dat ik thuis had liggen en 1M werkte niet)

Als de klok nu loopt gebruikt hij totaal ongeveer 40 mA @ 9,4 V dus het moet makkelijk zijn om een adapter te vinden die rechtstreeks het stopcontact in kan.

Dit is de nieuwe layout
Afbeeldingslocatie: http://www.scrap.cistron.nl/Picklok/layout4.png
Ik heb ook het schema in de startpost vervangen.

Ik ben ondertussen ook nog even bezig geweest met de 'display plaat'
Ik had nog een stuk 0,75 mm staalplaat liggen waarop ik de layout van de cijfers heb overgebracht. Daar heb ik de dremel op gezet, maar ik denk dat ik niet precies genoeg kan slijpen om het netjes te krijgen. Ik kan proberen hoe het gaat met een plasmabrander, maar dat kan even duren omdat de compressor momenteel in revisie is. (Als iemand nog een adresje weet om aan een lap pakkingsmateriaal te komen om een pakking uit te snijden houd ik me aanbevolen)
Misschien dat ik maar overstap op aluminium plaat. Dat kan ik thuis wel bewerken, en de plaat wordt geen dragend onderdeel van een behuizing.

Hier staat een nieuw filmpje met een test opstelling. Je ziet een uit een A4'tje gesneden display. Daaronder ligt een mat gemaakt stukje landbouwfolie op een plexiglas plaat. De rolletjes tape zijn voor de hoogte (+/- 3,5 cm van printplaat). Door die hoogte krijgt de klok wel een 'maximale kijkhoek' maar dat maakt niet uit, want de secondes zijn misschien te druk om steeds te zien. Ik moet denk ik wel tussenschotjes maken voor de cijfers, zodat ze niet over stralen (of hoe je dat precies noemt) Het effect van een diffuus verlicht segment met een feller middelpunt, is precies waar ik voor ging
Dat valt dus ook weer mee :)

Voor software heb ik nu een while, wend loop voor de pwm van de klok, maar een aparte display routine voor het instellen. Ik ben er nog niet helemaal uit of ik dat samen ga voegen zodat ik ik één mooie display functie of procedure krijg. Ik moet de code nog oppoetsen en commenten, dan zal ik hem posten.

Ik ben er al wel achter dat in de onderstaande voorbeeld code de vervangende for,next ongeveer 4x zo langzaam is als alle losse regels (en dit wordt erger naarmate er meer code herhaald moet worden). Door dit soort constructies te vermijden heb ik de leds een stuk feller gekregen omdat er nog ruimte was voor delays. Helaas wordt de code er niet mooier van.

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
while 1

  porta = 0

  'for i = 0 to 5
  portb = 0
  portb = 255
  'next i

  portb = 0
  portb = 255

  portb = 0
  portb = 255

  portb = 0
  portb = 255

  portb = 0
  portb = 255

  portb = 0
  portb = 255
wend
end.



[/update]

Acties:
  • 0 Henk 'm!

  • Anthor
  • Registratie: Juni 2002
  • Niet online
Het is weer een tijdje geleden dat ik hier gepost heb, maar ik geef dit topic weer een kickje
(ik ben nogsteeds voorstander van het [EIP] principe)

Ik ben bezig geweest met het maken van de front plaat van de display. Hier had ik niet zoveel zin in dus heb ik steeds een klein stukje gedaan. Het is aluminium plaat geworden, en de gaten heb ik gemaakt door te boren, frezen en vijlen. Achter de aluminium plaat zit een plaatje plexiglas dat ik met scotch-pad heb bewerkt zodat het licht beter verspreid wordt over de segmenten. (de beste methode is in één richting opschuren, haaks op lengte van een segment.)

De frontplaat is nu nog niet helemaal op maat gemaakt, omdat ik nog niet precies weet watvoor behuizing ik ga gebruiken. (ik zit te denken aan een omgebouwd 17" audio element dat qua stijl tussen de rest van m'n stereo past)

Afbeeldingslocatie: http://www.scrap.cistron.nl/Picklok/display-voorkant.jpg
er zijn nog een paar segmenten die ik een beetje bij moet werken
Hieroverheen komt nog een laag plexiglas. Daar verzink ik dan de middelste schroeven in zodat die door de 'lijst' van de uiteindelijke behuizing niet meer zichtbaar zijn.

Afbeeldingslocatie: http://www.scrap.cistron.nl/Picklok/display-boven.jpg
De afstandshouders zijn aluminium buisjes die niet strak om de schroeven zitten, daarom lijkt het alsof er een paar schroeven behoorlijk scheef zitten, maar dat valt mee

Qua hardware en software heeft het project ook stilgelegen, maar ik heb het weer opgepakt, omdat ik de plaat nu even goed genoeg vind om verder te gaan met de rest.

Hardware:
De lichtopbrengst valt mij toch een beetje tegen, maar ik kan de ledjes nog feller krijgen
Er blijkt maar 4,5 V op een uitgang te staan, terwijl ik uit ging van 5 V
Ook ben ik er achter gekomen dat er per kanaal iets van iets van 0,7 V over de ULN staat.
Dus ik kan de weerstanden veranderen in ongeveer 80 Ohm (zal wel 82 Ohm worden dan)

Software:
Dit is de code die ik nu heb:
Visual Basic:
1
2
3
4
5
6
7
8
9
program kloktest

Dim tijd as byte[6]     'Tijd in HHMMSS
Dim PWMmask as byte     'bitmask voor pwm
Dim i as byte           'index
Dim tick as byte        '1/x deel van seconde
Dim cycle as byte       'teller voor PWM
Dim DutyCycle as byte    'Dutycycle voor PWM
Dim PWMrichting  as byte 'Aanduiding voor PWM fader (in of uit)
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
sub procedure klok()
inc(tijd[5])
PWMmask = %00100000                'aanduiding voor welk getal gaat veranderen
                                   'bit 5:0 5 = enkele seconde 0 is 10-tal uren
                                   'Seconde verandert altijd

    if tijd[0] = 2 then            '(pas) als klok op 24:00 staat alles resetten
      if tijd[1] = 4 then
        for i = 0 to 4             'secondes niet resetten want er staat nu 00:00:01
            tijd[i] = 0
        next i

      PWMmask = %00111111          'alle cijfers pwm'en

      goto klokjerond
      end if
    end if

   if tijd[5] = 10 then            'klok routine
   tijd[5] = 0
   inc(tijd[4])
   PWMmask.4 = 1                   'Cijfer verandert dus PWM display

     if tijd[4] = 6 then            ' hele minuut
     tijd[4] = 0
     inc(tijd[3])
     PWMmask.3 = 1

       if tijd[3] = 10 then         '10 minuten
       tijd[3] = 0
       inc(tijd[2])
       PWMmask.2 = 1

        if tijd[2] = 6 then         'heel uur
        tijd[2] = 0
        inc(tijd[1])
        PWMmask.1 = 1

          if tijd[1] = 10 then         '10 uur
          tijd[1] = 0
          inc(tijd[0])
          PWMmask.0 = 1
          end if

        end if
      end if
     end if
   end if

klokjerond:
end sub

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
sub procedure Display(dim getal as byte) '7-segment codes voor display

    Select case getal
          Case 0
          setbit(PORTA, 0)
          PORTB = %00110111

          case 1
          setbit(PORTA, 0)
          PORTB = %00100000

          case 2
          clearbit(PORTA, 0)
          PORTB = %00111101

          case 3
          setbit(PORTA, 0)
          PORTB = %00111100

          case 4
          setbit(PORTA, 0)
          PORTB = %00101010

          case 5
          setbit(PORTA, 0)
          PORTB = %00011110

          case 6
          setbit(PORTA, 0)
          PORTB = %00011111

          case 7
          setbit(PORTA, 0)
          PORTB = %00110000

          case 8
          setbit(PORTA, 0)
          PORTB = %00111111

          case 9
          setbit(PORTA, 0)
          PORTB = %00111110

          end select
end sub

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Sub procedure interrupt
    TMR1L = %10000000       'Kristal en TMR1H en TMR1L hoevaak de timer per seconde een overflow interrupt geven
    TMR1H = %11111111       'Timer1 wordt hier ingesteld op 256 overflows per seconde

    inc(tick)               '

    if pwmrichting = 0 then         'kijken of displays in of uit moeten faden
                                    '0 = fade out 1 = fade in
                                    '
        DutyCycle = DutyCycle - 2   'Verander de dutycycle in juiste richting
        else
        DutyCycle = DutyCycle + 2
    end if


    if tick = 0 then          'na seconde als de klok e
      klok()                  'klok routine
      DutyCycle = 0           'PWM op veranderede cijfers,
      PWMrichting = 1         'fade in
    end if

    if tick = 128 then         'halve seconde
      DutyCycle = 255
      pwmmask = %00100000         'stop fade alles behalve secondes
      PWMrichting = 0             'fade out
    end if

    PIR1.0 = 0        ' Clear Timer1 interrupt (TMR1IF)
end sub

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
main:
'Begin
'     instellingen
  CMCON = $07                   'Comperatoren uit
  delay_ms(2000)                'twee seconde delay voor start-up tijd kristallen

  TMR1H = %11111111                'Hoge byte timer1
  TMR1L = %10000000                'Lage byte timer1

  TRISA = %11111000                'In/uitgangen PortA instellen
  PORTA = 0
  TRISB = %11000000                'In/uitgangen PortB instellen
  PORTB = 0

  TIJD[0] = 2                      'Begin tijd voor de klok (voor testen)
  TIJD[1] = 3
  TIJD[2] = 5
  TIJD[3] = 9
  TIJD[4] = 4
  TIJD[5] = 5


  INTCON = %11000000             'peripheral interrupts aan
  T1CON = %00001111              'timer1 instellingen
  PIE1.0 = 1                     'Timer1 overflow interrupt aan (klok start)


While 1 'main loop,
        'multiplex en eventueel pwm op 6 displays met 7 leds

   If testbit(porta, 3) = 1 then          'testfunctie, zet 1 display op '8'
        clearbit(PORTA, 0)
        PORTB = 0
        delay_ms(10)             'ontdender
       If porta.3 = 1 then
          Display(8)
          delay_ms(500)

          while testbit(porta, 3) = 0
          wend
          delay_ms(300)
       end if
    end if


    inc(cycle)                   'teller voor pwm

    'begin display
    'tientallen uur
    clearbit(PORTA, 1)           'clock 74HCT4017 = 0
    clearbit(PORTA, 0)           'Wis display
    PORTB = 0                    '
    setbit(porta, 2)             'reset de 74HCT4017 teller (synchronisatie)

    if PWMmask.0 = 1 then        'check of de display PWM heeft
         if cycle > DutyCycle then goto nextdigit1 end if 'PWM = dutycycle/cycle
    end if

    'stuur 7-segment code naar portb en porta
    'stuur geen nul naar display 0 voor tiental-uur
    if tijd[0] > 0 then  display(tijd[0]) end if

nextdigit1:

    delay_cyc(4)                  'Delay om de ledjes beter op te laten lichten.
                                  'delay = 4 x 10 cycles
    clearbit(PORTA, 0)            'wis display
    PORTB = 0
    setbit(PORTA, 1)              'volgende cijfer

    if PWMmask.1 = 1 then
         if cycle > DutyCycle then goto nextdigit2 end if
    end if

    display(tijd[1])

nextdigit2:

    delay_cyc(4)

    'tiental minuten
    clearbit(PORTA, 1)
    clearbit(PORTA, 0)
    PORTB = 0
    setbit(porta, 1)

    if PWMmask.2 = 1 then
         if cycle > DutyCycle then goto nextdigit3 end if
    end if

    display(tijd[2])

nextdigit3:

    delay_cyc(4)

    'minuten
    clearbit(PORTA, 1)
    clearbit(PORTA, 0)
    PORTB = 0
    setbit(porta, 1)

    if PWMmask.3 = 1 then
         if cycle > DutyCycle then goto nextdigit4 end if
    end if

    display(tijd[3])

nextdigit4:

    delay_cyc(4)

    'tiental seconden
    clearbit(PORTA, 1)
    clearbit(PORTA, 0)
    PORTB = 0
    setbit(porta, 1)

    if PWMmask.4 = 1 then
         if cycle > DutyCycle then goto nextdigit5 end if
    end if

    display(tijd[4])

nextdigit5:

    delay_cyc(4)

    'seconden
    clearbit(PORTA, 1)
    clearbit(PORTA, 0)
    PORTB = 0
    setbit(porta, 1)

    if PWMmask.5 = 1 then
         if cycle > DutyCycle then goto nextdigit0 end if
    end if

    display(tijd[5])



nextdigit0:
    delay_cyc(4)

wend

end.


Ik had werkende functie gemaakt om de klok cijfer voor cijfer in te kunnen stellen, maar dat heb ik weggegooid omdat het me niet aan stond. Ik ga eerst proberen om de code voor de klok te optimaliseren.

Misschien ben ik wel erg pietluttig bezig, maar hoe groter bv. de delay op een display, hoe duidelijker de getallen worden. Maar als ik een te grote delay neem, dan begint de seconde zichtbaar te knipperen (te trage pwm)

Hier loop ik atm tegenaan:
Door de 'case select' zit er nu een klein verschil in cycles die nodig zijn om te bepalen wat er op de display komt (een negen zoeken duurt langer dan een twee)

Ik dacht dat ik dat wel op kon lossen met een array met de constante waardes:

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
const SegmentCode as byte[10] = (55,32,61,60,42,30,31,48,63,62)

'0 = %00110111
'1 = %00100000
'2 = %00111101
'3 = %00111100
'4 = %00101010
'5 = %00011110
'6 = %00011111
'7 = %00110000
'8 = %00111111
'9 = %00111110

'PORTA, 0 = 0 bij 2, anders 1

'ipv bv. Display(tijd[5]):
PORTB = SegmentCode[tijd[5]]
if tijd[5] <> 2 then setbit(porta, 0) end if

Zoiets zou dan sneller kunnen gaan.

Maar in de debugger duurt 1x de 'main loop' ongeveer even lang (0,11/0,12 ms) en de ASM ziet er ook niet echt optimaal uit
Ik denk dat ik dit met een pointer op zou kunnen lossen. Het robleem is even ik nog nooit iets met pointers heb gedaan, dus nog geen idee heb van hoe ik dat dan moet doen. Er zit bij mikrobasic wel een voorbeeld hoe je iets met een array doet met een pointer, maar dat stukje begrijp ik nog niet helemaal.

Ook heb ik er soms last van dat de seconde een keer over slaat, dan lijkt het alsof de klok even stil staat. De hele display is dan nog zichtbaar, dus ik denk dat er dan iets mis gaat met de interrupt.

Acties:
  • 0 Henk 'm!

  • Anthor
  • Registratie: Juni 2002
  • Niet online
Ik speelde al een tijdje met het idee op een uur signaal te maken voor de klok.

Ik zocht relatief gemakkelijke methode om geluid af te spelen mbv een PIC. Ik heb er aan gedacht om met bv een winbond ChipCorder ic een sample af te spelen, maar tijdens een zoektocht op iternet kwam ik de volgende paginas tegen:

http://www.romanblack.com/picsound.htm
http://www.romanblack.com/btc_alg.htm

Hier staat een methode beschreven om op een eenvoudige manier geluid uit een pic te halen.
Aangezien ik deze methode niet op GoT terug kan vinden is hier een soort van [HOWTO]
Misschien dat dit een apart topic waard is, maar dat laat ik over aan een Modje

Zo zou het ongeveer zo moeten werken:
Een .wav bestand wordt volgens speciaal algoritme omgezet naar een 'look-up' tabel (een enorme lijst met waardes die gereturned worden).
De PIC gaat één voor één de bytes van het tabel af, en schuift de bits langs een data pin waar een RC netwerk aan hangt.

Bij het encoderen rekent het algoritme de geluidsgolven door op basis van de Tc van het RC filter. Op deze manier kan je met een 1-bit datastroom een geluidsfragment benaderen.
Het algoritme kan ook ingesteld worden op een 1.5-bit datastroom. Voor zover ik het door heb, is de bedoeling is dan dat de waarde van de data pin wordt doorgeschoven op een andere uitgang.
Dan wordt de vorige waarde van de pin in de berekening, en door een extra data pin te gebruiken kan.

Na nog wat zoeken kwam ik ook een site tegen, waar ene Bert van Dam deeze methode heeft gebruikt in JAL (1-bit):
http://members.home.nl/b.vandam/lonely/pagina47.html (klik onderaan op de link om de frames goed te krijgen)

Ik heb eerst geprobeerd om een look-up table te maken in Mikrobasic, maar dat lukt niet helemaal.
Daarom heb ik maar een poging gedaan in pic assembly.

Ik had alleen nog nooit in assembly geprogrameerd, dus dat heb ik mezelf een beetje aan moeten leren.
(ik heb de knipperende led maar overgeslagen ;) )

Deze methode werkt als volgt:

Het door Roman Black gemaakte programma maakt van een .wav file een .asm file met de data aan
Die data gaat dan in een enorme 'look-up table' (meer info: Microchip technote AN556
Software in de PIC moet dan het tabel aanspreken en op het juiste moment Data pinnen aan/uit zetten.


De hoofdlus doet het volgende:

- Byte ophalen uit het tabel
- 8x:
- porta uitlezen om de waarde van de vorige bit te bepalen
- nieuwe bit ophalen
- Wachten op interrupt
- nieuwe waarde naar PORTA schrijven
- De byte uit het tabel verschuiven, zodat de volgende bit op de positie van de vorige komt

Als het hele tabel is doorlopen begint de PIC weer aan het begin.
Je kan het laatste 'retlw' commando vervangen door b.v. sleep of een goto

Het is een deel knip en plak werk van o.a. piclist.org:
Dit heb ik als basis genomen voor mijn tabel:
http://www.sxlist.com/techref/microchip/bigtable.htm
http://www.sxlist.com/techref/microchip/tables.htm

Ik kan niet zeggen dat ik alles begrijp wat er gebeurt, maar ik heb er wel iets werkends uit gekregen.

Wat te doen om dit werkend te krijgen
Dit voorbeeld werkt op de 16F628a, misschien moet er iets veranderd worden om het op andere pics aan de praat te krijgen.

Deze PIC heeft maar 2048 Kwords programma geheugen. Voor mij is het geen probleem omdat ik maar een sample van ongeveer 2 seconden nodig heb, maar voor langere fragmenten moet je al snel naar 8 Kwords (of een losse eeprom)
In mijn PIC processor heb ik als ik bij locatie 0x0100 begin nog ruimte voor 7 blokken van 256 bytes
op 7812.5 bit/s is dat ongeveer 1.8 seconde

• Download en unzip de BTc sound encoder
Zoek of maak een wave file.
Ik heb een sample met de Winamp diskwriter uit een aflevering van een serie gehaald en de trial versie van Goldwave gebruikt om hem te bewerken.

Resample het geluidsfragment naar een geschikte bitrate, en sla het op als 'PCM unsigned 8-bit mono'
Ik heb de software getest op 15625 en 7812.5 Hz. (van de laatste ben ik niet zeker of de halve hz ook is meegnomen door goldwave en de BTc software)
Deze bitrates zijn makkelijk te maken met de timer van een PIC. De pic draait op de interne oscillator op 4 MHz. Iedere instructie cycle (Fosc/4) wordt TMR0 opgehoogd. bij '256' geeft de timer een overflow interrupt. (bij 10 ns per instructie is dat dus met een frequentie van 3906,25 Hz)

Als je voor een lagere bitrate kiest moet je met de prescaler gaan werken, een hogere frequentie kan bereikt worden door een waarde naar het TMR0 register te schrijven.

In de code onderaan deze post staat in de interrupt service routine:

movlw b'10000000'
movwf TMR0

Dit is voor 7812.5 Hz
Als je een bitrate van 15625 kiest dan moet het "movlw b'11000000'" worden

Open het .wav bestand in de BTc encoder.
Kies het 1.5 bits algoritme en BTc32 als fineness

Je kan het oorspronkelijke geluidsfragment afspelen en een benadering van hoe het klinkt op uit PIC.

Kies in het file menu: export PIC assembler file en sla het bestand op.

• Maak het asm bestand klaar om te compilen[/u]
In Microchip MPLAB:
- Maak een nieuw project aan en voeg de juiste 'Linker' script en Header file toe.
- Voeg het door BTc gegenereerde bestand toe, en bewerk het als volgt:

- Zoek alle "org (" en vervang met "org 0x0" (zonder "" )
- Zoek alle " *256)" en vervang met "00"

Er hoort nu bv "org 0x0100" te staan
(dit gaat waarschijnlijk niet helemaal goed als je meer dan 15 blocks hebt )

- Verwijder alles wat niet in het geheugen past
Als je bij 0x100 begint, is dat in de 16f628a alles vanaf block 8

- Verwijder het voorbeeld tabel uit de code[/u]
- Voeg op de eerste retlw b'xxxxxxxx' regel de tabel naam TStart toe
- Plak de onderstaande code aan het begin van het bestand
- Pas eventueel de de waarde aan die naar TMR0 geschreven wordt (afhankelijk van oscillator en bitrate)
- Pas eventueel de config bits, ik gebruik interne oscillator op 4 MHz en geen ISP
- Zorg dat "end" helemaal onderaan staat

Maak de hex file, en programmeer de PIC processor

Bouw een standaard experimenteer opstelling op een breadboard
- maak het schema zoals gegenereerd in het BTc bestand op pin 1 en 2 (PORTA,2 en PORTA,3)
- sluit een standaard pc speaker aan tussen de 'analoge ouput' en de gnd

Nu zou je een werkende opstelling moeten hebben waar geluid uit komt.
Verwacht alleen geen muziekale hoogstandjes, deze methode is vrij grof.
Je kan een beetje spelen met de waardes van de weerstanden en de condensator om het geluid beter te krijgen.

Nog een paar opmerkingen
Als de BTc sound encoder erg hoge weerstand waardes opgeeft kan je er een opamp achter zetten.
Ik heb een TL 072 gebruikt. Die kan je aansluiten volgens het schema op de site van bert van dam, maar dan moet niet pin 7 maar pin 8 aan 5v, en pin 1 is in plaats van pin 6 de output (die ook terug gaat naar pin 2)

Zoals Bert van Dam op zijn site opmerkt kan er een irritante geluidsgolf ontstaan door de rijen met afwisselende enen en nullen. Soms helpt het om alle '10101010' en '01010101' bytes te vervangen door '00000000'

Ook lijkt het gewoon te werken als je de condensator weghaalt

En nu even terug naar het onderwerp:
Ik heb alle ledjes in de klok vervangen voor felle leds (ik weet de licht opbrengst niet maar het scheelt een hoop) De leds zelf heb ik een beetje opgeschuurd (in één righting) om het licht beter te spreiden in de richting van een segment

Zoals ik in het begin al zei, was de bedoeling om een geluidsfragment af te spelen als uur signaal.
De pics praten nog niet met elkaar, maar de bedoeling is om het signaal één of twee keer af te spelen als de klok van uur verspringt.

Dit is het resultaat:
http://www.scrap.cistron.nl/Picklok/geluid.mpg
Het moet dus het geluidje van '24' zijn, maar de kwaliteit valt nogal tegen op 7812 Hz

Ik heb ook nog een vraagje, wanneer gebruik je 'equ' en wanneer 'set' als je een variable declareerd in mplab?


Dit is de assembly code voor MPLAB:

GAS:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
; BTc 1.5 bit sound playback from PIC program memory
; Modified example from: http://www.sxlist.com/techref/microchip/tables.htm

    list p=16F628a
    #include "p16f628a.inc"
     __config 3f18        ; int osc, alles uit


OffsetH EQU 0x20        ; Hoge byte voor Tabel rij
OffsetL EQU 0x21        ; Lage byte voor Tabel rij
Bitstream EQU 0x22        ; Byte uit tabel
COUNT EQU 0x23            ; Teller voor For..Next
Interrupt EQU 0x24        ; Interrupt check
BTc EQU 0x25            ; Tijdlijke opslag voor PORTA bits


; the fcall macro
; by Roger Froud of Amytech Ltd.
;(execution starts here)

fcall macro subname    ; uit voorbeeld van de piclist, schijnt geen effect te hebbenm op deze PIC
    local here
    lcall subname ; set PCLATH correctly
    pagesel here ; set PCLATH correctly
here:
    endm


RST    code 0x0000
    GOTO Start

INT    code 0x0004       ;Interrupt Vector
    GOTO ServInt      ;Jump to service interrupt

; main:
isr     org 0x008          ;Interrupt Service Routine
ServInt
    MOVLW b'10000000'    ; schrijft een waarde voor de bitrate naar de timer    
    banksel TMR0  
    MOVWF TMR0    

    banksel Interrupt          ;Wis interrupt check    
    BSF Interrupt, 0

    banksel INTCON            ;Select INTCON Bank (0)
    BCF     INTCON, T0IF      ;Clear overflow flag
      RETFIE                  ;Return from interrupt
 
Start                        ;configuratie
    MOVLW 8
    banksel OPTION_REG
    MOVWF OPTION_REG        ;Timer0 prescaler naar WDT (niet nodig) 
    
    MOVLW    7                
    banksel CMCON
    MOVWF    CMCON            ;Comperatoren uit
   
    banksel TRISA            ; PORTA is uitgang
    CLRF TRISA
    
    banksel OffsetH            ; Wis alle variabelen
    CLRF OffsetH
    CLRF OffsetL
    CLRF Bitstream
    CLRF COUNT
    CLRF Interrupt
    CLRF PORTA 

    banksel INTCON
    BSF INTCON, GIE       ;Enable Global Int's  
    BSF INTCON, T0IE      ;Enable Timer0 Int

SoundLoop  
        fcall Table        ;Roep het tabel aan (fcall is volgens de compiler niet nodig?)
        
        banksel Bitstream ; W komt nu uit het tabel
        MOVWF Bitstream    ; 
        
        MOVLW  0x08            ; 8x loop
        MOVWF  COUNT 

        Loop_bitstream:        ;Begin loop
            
            banksel BTc        
    
            CLRF BTc         
            BTFSC PORTA,3    ; schuif waarde van porta.3 door op 
                BSF BTc,2                    
    
            BTFSC Bitstream, 7    ; Bekijk de volgende bit, en zet indien nodig 
            Bsf BTc,3            ; porta.3 op hoog    

            BCF Interrupt,0        
            waitforinterrupt:        ; Wachten
                BTFSS Interrupt,0
            GOTO waitforinterrupt
    
            
            MOVFW BTc
            MOVWF PORTA
    
            RLF Bitstream,1        ; shift is maar 7x nodig
            DECFSZ COUNT,1

        GOTO Loop_bitstream

        INCF OffsetL , 1    ; add 1 to data pointer
        SKPNZ
        INCF OffsetH , 1

        GOTO SoundLoop


;NoUp                                ;Uit het voorbeeld van piclist (niet getest)
;        MOVLW  Low(d'1792')            ;Hiermee zou je moeten kunnen bepalen of je
;        XORWF  OffsetL,W            ;door het tabel heen ben als je niet al je geheugen gebruikt 
;        SKPNZ
;            GOTO SoundLoop
;        MOVLW High(d'1792')
;        XORWF OffsetH,W
;        SKPNZ
;            GOTO SoundLoop
;        GOTO Start


Table   MOVLW HIGH (TStart)                
        ADDWF OffsetH,W
        MOVWF PCLATH
        MOVLW LOW (TStart)
        ADDWF OffsetL,W
        SKPNC
        INCF PCLATH,F
         MOVWF PCL     

; Hieronder staat het door BTc gegenereerde tabel


;=====================================================
; AUTO CREATED FILE made by Windows BTc Sound Encoder 
; v1.1     Copyright 2002 - Roman Black
; 
; Hippyware.  
; www.RomanBlack.com 
;=====================================================
;
; File Details:
; Size 15360 bits     (1920 bytes)
; Sound encoded at 7812 bits/sec 
; using BTc32 1.5bit Algorithm to be decoded on
; the following circuit:
; 
; 
;             R  = 18324 ohms  
;             each 2R = 36648 ohms  
; 
; 
; Digital ----------2R-----,     
;                          |     
; Digital ----------2R-----*----- Analogue    
;                          |      out        
;                          |     
;                          |     
;                          C = 0.22 uF    
;                          |     
;                          |     
;                          |     
;                         Gnd     
; 
; 
;=====================================================
; Bitstream data is in PIC .asm table format,
; in blocks of 256 bytes.
; 
; Bits are played from left to right, from ms_bit to
; ls_bit.
;=====================================================


;---------------------------------------------------
     org 0x0100         ; block = 1  
;---------------------------------------------------


     ;-------------------------  0
TStart     retlw b'00000000'   ; aa 
     retlw b'00000000'   ; aa 
     retlw b'00000000'   ; aa 
     retlw b'00000000'   ; aa 
     retlw b'00000000'   ; aa 
     retlw b'00000000'   ; aa 
     retlw b'00000000'   ; aa 
     retlw b'00000000'   ; aa 
     ;-------------------------  8
     retlw b'00000000'   ; aa 
     retlw b'00000000'   ; aa 
     retlw b'00000000'   ; aa 
     retlw b'00000000'   ; aa 

;   KNIP Hier staat het enorme tabel

     retlw b'01010101'   ; 55 
     retlw b'01010101'   ; 55 
     retlw b'01010101'   ; 55 
     ;-------------------------  1784
     retlw b'01010101'   ; 55 
     retlw b'01010101'   ; 55 
     retlw b'01010101'   ; 55 
     retlw b'01010101'   ; 55 
     retlw b'01010101'   ; 55 
     retlw b'01010101'   ; 55 
     retlw b'01010101'   ; 55 
     retlw b'01010101'   ; 55 




;---------------------------------------------------
; 
; End of file.
; 
;---------------------------------------------------

end
Pagina: 1