Home › FORUM › Stel je eigen schakeling voor › CharlyKlok

FORUM

Log in om antwoord te posten of de notificatie-service te gebruiken.

Onderwerp: CharlyKlok

Author Post

Anneo

1350 berichten

Expert¹
Expert¹

Read post 21-01-2010 15:42

Sinds Isixia over die ijspegels begon is er heel wat doorgeboomd.
Martijn kwam met een goed idee en Ben maakte een knipperlichtjes-klok.Toen dacht ik,waarom geen klok met cijfers?
Op een beter ogenblik,wat internet betreft,MPLAB binnengehaald, na ruim een uur met vrezen en beven(blijft ie hangen of niet)toch gelukt.
Na het nodige denken,puzzelen,programmeren, de simulator erop los gelaten.Enige missers eruit (geen wonder met zo'n rare instrukties,is wel even wennen na AVR)loopt het zo te zien zoals bedoeld:een 24uren klok,4 zeven segment cijfers,2 knoppen om gelijk te zetten,2 leds voor tussen uren en min. die 1x per sec pinken,en een aansluiting voor een sec.tik.
Er is nog heel veel plaats(en tijd) over om nog andere dingen te doen.Alleen naar het volgende uur,vooral van 23:59 naar 00:00 =ruim 3ms,gaan kost tijd.
Er zijn twee dezelfde bestanden .txt voor notepad en .asm voor mplab, want ze gaan elk anders om met de tabulatie, dat geeft een rommelig kolommenwerk.(.txt voor wie geen mplab heeft)
Zoals ik al eens eerder heb gezegd,in de praktijk brengen gaat hier (voorlopig?)niet.Wie weet heeft iemand er zin in.
Anne

AttachmentCharlyKlok.asm

AttachmentCharlyKlok.txt

Anneo

1350 berichten

Expert¹
Expert¹

Read post 21-01-2010 15:48

'tJa dan horen er nog een paar printjes bij.Voor de controller eenzijdig en zonder draadbruggen.
Voor de uitlezing is dat niet gelukt, 6 draadbruggen.
De nummers bij de leds zijn in volgorde van aansturen, komen dan ook in het progr.terug.
Anne

Schueler

1425 berichten

Expert¹
Expert¹

Read post 21-01-2010 16:18

Dat heb je leuk gedaan...

Zover ben ik nog niet dat ik het mooi op een printje heb zitten.

Binnenkort me eens even kwaad maken met Eagle om daar eens een mooi printje uit te persen. Lijkt me leuk om dat ook eens te doen. ( in privé sfeer bedoel ik dan , via mijn vorige werkgever gebruikte ik Mentor Graphics en werd de print bestuckt en al afgeleverd... )


Ben

Schueler

1425 berichten

Expert¹
Expert¹

Read post 21-01-2010 19:29

Anne,
Ik heb je code eens doorgenomen en het valt me op dat je alles doet in de interrupt routine. Dit heb je in het algemeen liever niet omdat je hierdoor andere processen eventueel onnodig stop zet en dat je eventueel ook interrupts kunt gaan missen.
Voor de bijhouden van de klok zou je dat eventueel ook in je hoofd lus kunnen doen.
Door in de interrupt routine een flag te zetten op een variabele wat in het hoofd proces gechecked word.
Als deze dan 1 is geworden ga je de seconden verhogen en indien nodig de rest. Dit geldt dan ook voor de zoemer. Deze kan op die manier ook kenbaar gemaakt worden in je interrupt routine.

Dit lost je probleem op bij de overgangen.

Voorbeeld uit mijn programma:

CODE verwijder en in tekstbestand toevoegd in verband met onjuiste weergave door forum...


Wat hier gebeurt is dat ik twee timers gebruik, ik heb er genoeg dus waarom dan ook niet gebruiken toch?
Om de timer zo accuraat mogelijk te houden reset ik de timer vlag zo snel mogelijk en reload alleen de hi-byte van de timer. Deze heeft een reload warde van 0xE0 en de low-byte moet vanaf 0 beginnen. Als ik de Low-byte wel zou resetten zou dit een error betekenen omdat de timer door telt nadat er een interrupt is ontstaan en dan zou ik dus de timer een paar tikken terug zetten.
Daarna zet ik een vlag dat aangeeft dat er een interrupt is geweest. In het hoofd programma ga ik hiermee verder aan de slag en laat ik de timer lekker hun gang gaan...
De andere timer wordt gebuikt voor de weergave op de leds die op deze manier een lagere prioriteit krijgen.


Ben

Attachmentinterrupt_handler.c


Bericht bewerkt door Schueler op 21-01-2010 23:47

Anneo

1350 berichten

Expert¹
Expert¹

Read post 21-01-2010 23:06

Het probleem is dat ik ,om de lijst met leds kort te houden,alleen het verschil met de vorige stand opgeef.Als de klok 2x verspringt en het display maar 1x wordt bijgesteld dan loopt de boel in het honderd.Dus VOOR een nieuwe interrupt MOET het display bijgewerkt zijn.De interruptroutine duurt maar een keer per min.langer dan alleen de leds(ong.75µs) vertonen.Bij de wisseling om middernacht is dat het langst,ruim 3ms van de ong.4 die er beschikbaar zijn.Alles bijeen,de interrupt neemt niet meer tijd dan met de klok erbuiten,en het is zeker dat er geen aanpassing wordt gemist.
Anne

Anneo

1350 berichten

Expert¹
Expert¹

Read post 21-01-2010 23:38

Ondertussen je voorstel in C nog verder bekeken,je weet daar ben ik niet zo in thuis,maar zo te zien zet je met LED_Select=Time .Fading de hele tijd opnieuw in de leds.Als je dat zo nu en dan mis loopt is er niets aan de hand.
Eerst had ik ook de display-routine buiten de interr.gezet.Als de secondenteller (telt achteruit) op nul kwam zette ik er 59+128 in en in de hoofdlus reset bit 7 zodat je wist dat de taak erop zat.De moeilijkheid is dan dat andere taken veiligheidshalve niet langer dan 1ms bezig mogen zijn voordat die bit 7 getest wordt anders gaat het om middernacht mis.Zo als het nu is gaan ze in de hoofdlus hun gang, zolang de interr.maar aan staat.Wel zo rustig.
Anne

Schueler

1425 berichten

Expert¹
Expert¹

Read post 22-01-2010 00:07

?!?

Ik zie nu pas dat mijn code niet juist wordt weergegeven in het forum. De helft is weggevallen... :-s

Daarom maar even als tekstbestand toegevoegd zodat mensen het wel kunnen lezen...

De opmerking van je betreft LED_Select=Time.Fading begreep ik even niet wat je op doelde maar na het terug kiken van mijn post werd het me dus duidelijk.

Hier moet dus iets meer bij staan.

Met LED_Select kijk ik welke ik wil aansturen, de huidige of de volgende ( ik kijk vooruit in mijn code ). Dit wordt gedaan omdat ik voor de minuten maar 12 led heb. Door deze te faden in 5 stappen kan ik op die manier toch 60 variantie weergeven.
Ik had het ook niet kunnen doen ( versie 1.0 van mijn code ) en dat scheelt dan vel code in de routine...
Alhoewel, ik bereken de status en de led array buiten de interrupt routine zodat deze zo min mogelijk wordt belast.

Hierbij meteen dan maar mijn bron code...
Ik wilde eigenlijk eerst het klokje netjes opgebouwd hebben....

Ik gebruik 3 schakelaars waarvan er eentje voor menu keuze gebruikt wordt en twee oor voor of achteruit. Door de toets langer ingedrukt te houden gaat het in auto increment mode.
Verder zit er een zoemertje bij ( piezo buzzer met diode ) die zich als led voordoet in de code
Eén keer op menu kun je de uren verzetten, nog één keer dan kun je de minuten verzetten en nog een keer ben je terug in operating mode. Als je de knoppen voor 4 seconden niet indrukt gaat het automatisch terug in operating mode.

e PIC draait op de interne klok van 8MHz en zo ook de timer_0 die de LEDs aanstuurt. De timer die de tijdpulsen geeft draait op timer_1.

Timer_1 blijft doortellen ook als er en interrupt is geweest zodat er geen timer tikken verloren gaan.

Deze versie is redelijk uitgebreid maar nog niet volledig voorzien van goede commentaar. ( in het Engels hè Thijs )


Ben

AttachmentClock_Charlieplexing_v1.1.zip

Anneo

1350 berichten

Expert¹
Expert¹

Read post 23-01-2010 13:42

Hallo Ben,je program eens flink bestudeerd.Valt niet mee,je weet C en ik boe,en dan nog met sub's in een ander bestand,da's om het moeilijk te maken zeker? Maar ter zake.Die lange lijst met voornamelijk nullen moet toch korter kunnen,alleen de byte op plaats uur/2 of min/10 bevat geen nul.
Bij Set Timer0 zet je OPTION als 001 wat volgens komentaar 1/4 moet geven,maar dat is OPTION 010.
Bij het ophogen van de tijd doe je >=12 , =12 volstaat toch of is't voor de veiligheid?
In Main heb je dan if usecond.tick>=1 , moet dat niet 3 zijn?
Hoe die fader ineen steekt zie ik nog niet , C niet allen boe maar ook bah, rare formuleringen.
Je merkt het wel,ik blijf bij machinetaal zweren,maar ja begonnen einde '70er jaren met een 2MHz Z80 en 1kB (8 chip's van 1kb)en een 2708 (=1k EPROM),programmeren met schakelaars....
hogere progammeertalen ? elke byte is kostbaar!
Anne

Schueler

1425 berichten

Expert¹
Expert¹

Read post 23-01-2010 14:15

AnneoHallo Ben,je program eens flink bestudeerd.Valt niet mee,je weet C en ik boe,en dan nog met sub's in een ander bestand,da's om het moeilijk te maken zeker?

Voor de een moeilijk, voor de ander een verademing.
Maar ik doe dit ook bij assambly, alleen heet het daar .inc

AnneoMaar ter zake.Die lange lijst met voornamelijk nullen moet toch korter kunnen,alleen de byte op plaats uur/2 of min/10 bevat geen nul.

Klopt.
Dit stamt uit het ijspegel project. Het zou misschien verder geoptimaliseerd kunnen maar ik is meer uniform. Betreft geheugen, dat heb ik in overvloed in mijn PIC16F688

AnneoBij Set Timer0 zet je OPTION als 001 wat volgens komentaar 1/4 moet geven,maar dat is OPTION 010.

Hé, dat had ik het commentaar moeten aanpassen. Bedankt voor de opmerking.

AnneoBij het ophogen van de tijd doe je >=12 , =12 volstaat toch of is't voor de veiligheid?

Dat volstaat inderdaad maar zoals je al zelf opmerkt, het is om de rest af te vangen. Weet jij wat er in het geheugen staat als het op spanning komt? Bij Philips Semiconductors heb ik verschillende aan geheugens gedaan en mijn conclusie was dat dat perfecte random generators waren.

AnneoIn Main heb je dan if usecond.tick>=1 , moet dat niet 3 zijn?

Het antwoord is nee.
Elke 1/4senconde kijk ik naar de status van de toetsen en de rest. In de Menu_handler kijk ik of "Time.Second_tick >= 4" geldt.

AnneoHoe die fader ineen steekt zie ik nog niet , C niet allen boe maar ook bah, rare formuleringen.

Ja, die is gemeen hè!
voorbeeld:
A = b > c ? D : E;
Er wordt hier iets aan variabele A toegekend wat afhangt van de uitkomst van "b > c".
Dus, eerstb wordt de vergelijking "b > c" opgelost en aan de hand daarvan wordt A de waarden D dan wel E toegekend.
Als b groter is dan c krijgt A de waarde D, anders E.


AnneoJe merkt het wel,ik blijf bij machinetaal zweren,maar ja begonnen einde '70er jaren met een 2MHz Z80 en 1kB (8 chip's van 1kb)en een 2708 (=1k EPROM),programmeren met schakelaars....
hogere programmeertalen ? elke byte is kostbaar!

Helemaal mee eens!
Ik ben dan niet zo oud (34) maar toch, ben al vanaf mijn 8e zeer actief in elektronica.
Van mij mogen opleidingen hier zwaarder aan tillen. Als ik kijk wat studenten afleveren om soms rare constructies maken krijg ik de rillingen. Als ik hen dan vraag waarom ze het op die manier opgelost hebben krijg ik vaak de opmerking dat het ook zo op internet stond. Bij de vraag of ze de processor eens bekeken hebben, van de binnenkant bedoel ik dan kijken ze me raar aan. De compiler lost toch alles op. ( IIIIIIIIIIIIIIIIEK!!! )
Nee, het is wel en must dat je weet op wat voor soort architectuur je programmeert om goede code te kunnen schrijven. Ik denk dat ik wel mag zeggen dat Intel en Microsoft een flinke steen hebben bijgedragen aan het roekeloos programmeren...

Dus, verplicht een tekstverwerker programmeren op een 68000 met een 2x40 LCD zou een leuke uitdaging zijn voor de opleidingen toch? Worden ze in ieder geval een stuk bewuster .


Ben

Anneo

1350 berichten

Expert¹
Expert¹

Read post 23-01-2010 22:38

Ja ja dat in Menu heb ik gemist, dus een tweetrapsteller.uSecTik doet 1-0-1-0....en TimeSec telt mee en door tot 4.
Ik zou dat waarschijnlijk anders hebben gedaan.een teller 1-2-3-4-1-2...en in main if var >< teller var=teller,doe iets.
Wat zuinig met geheugen omgaan betreft,ken je deze gouwe ouwe?Zet 0x00 tot 0x0F om in ASCII 0...9-A...F (pross. moet wel de Decimal Adjust Accumulator instruktie kennen)
Dus A bevat HEX:
ADD 0x90
DAA
ADC 0x40
DAA...........da's alles A bevat ASCI-code!
Reken maar na.
Anne

Log in om antwoord te posten of de notificatie-service te gebruiken.

Payoff

Gratis Elektor@POST

Elektor wekelijks lezen:

Met Elektor@POST steeds het laatste nieuws uit de elektronicawereld.

Direct aanmelden >>>

Volg ons ook op:

      

Elektor Events

Speciale producten

Direct doen

Nu in prijs verlaagd

Elektor OSPV1

Tijdelijk € 210,- korting!

Dit zelfbalancerende indoor voertuig is ideaal voor bijvoorbeeld fabriekshal, magazijn of school.