OctoClock
OctoClock
Jag tänkte att jag skulle ta mig an ett halvlitet projekt för att öva lite på att löda ytmonterade kretsar. Och vad kan vara bättre än att bygga en klocka? Att bygga en förbättrad klocka såklart =)
Min OctoClock ska räkna dygnet i 24 timmar precis som en vanlig klocka. Men på varje timme ska det gå 64 "octo"minuter, och på varje minut 64 "octo"sekunder. Dvs sekundvisaren, liksom minutvisaren räknar från 0o00 till 0o77, och timvisaren räknar från 0o00 till 0o27. En uppenbar (men ändå liten) förbättring jämfört med vanlig tidräkning. Dessutom mycket enklare att implementera...
Jag har tänkt använda en 32768Hz oscillator eller någon hemsnickrad krets med en kristall. Istället för att som vanligt dela frekvensen med 2^15, behöver jag då dela med 15^2*2^7 eller 11'1000'0100'0000 binärt, för att få mina "octo"sekunder. Detta ryms såklart i en vanlig 14-bitsräknare.
Jag har redan ritat en hel del av kopplingsschemat men behöver lite experthjälp med ett par saker.
Fråga ett: Enligt databladet bör räknarna få en klockpuls som varar i minst 100ns. Och resetpulsen ska helst vara över 300ns lång. Jag tycker att det verkar fungera ok när jag bara kopplar direkt från grinden som schemat är ritat nu. Men jag vill minnas att jag mätte upp pulserna till långt kortare än de helst borde vara. Hur förlänger jag pulserna på smidigast sätt? Någon sorts monostabil vippa byggd av ett par inverterande grindar, eller ska jag ge mig på någon sorts timerkrets? Eller finns det något enklare sätt?
Fråga två: Klockan är tänkt att ha ett tvåknapparsinterface. En knapp som ändrar intensiteten på displayen medelst PWM. Och en knapp som räknar fram timräknaren ett steg i taget, och samtidigt nollställer alla räknare av lägre ordning. På så sätt har man en chans varje timme att ställa in tiden. Knapparna måste såklart kontaktavstudsas. Vad är bästa sättet här? Monostabil vippa med inverterare? Timerkrets?
Fråga tre: Resetsignalen till frekvensdelaren får ju inte tillåtas att ta sig in bakvägen på klocksignalen till sekundräknaren. Hur löser jag det? Räcker det att sätta in en diod någonstans, eller kanske en OR-grind på frekvensdelarens ingång? (Resetknapp intryckt OR frekvensdelning uppnådd = nollställning)
Fråga fyra: Avstörningskondensatorer (på varje IC?). hur stora bör de vara?
Min OctoClock ska räkna dygnet i 24 timmar precis som en vanlig klocka. Men på varje timme ska det gå 64 "octo"minuter, och på varje minut 64 "octo"sekunder. Dvs sekundvisaren, liksom minutvisaren räknar från 0o00 till 0o77, och timvisaren räknar från 0o00 till 0o27. En uppenbar (men ändå liten) förbättring jämfört med vanlig tidräkning. Dessutom mycket enklare att implementera...
Jag har tänkt använda en 32768Hz oscillator eller någon hemsnickrad krets med en kristall. Istället för att som vanligt dela frekvensen med 2^15, behöver jag då dela med 15^2*2^7 eller 11'1000'0100'0000 binärt, för att få mina "octo"sekunder. Detta ryms såklart i en vanlig 14-bitsräknare.
Jag har redan ritat en hel del av kopplingsschemat men behöver lite experthjälp med ett par saker.
Fråga ett: Enligt databladet bör räknarna få en klockpuls som varar i minst 100ns. Och resetpulsen ska helst vara över 300ns lång. Jag tycker att det verkar fungera ok när jag bara kopplar direkt från grinden som schemat är ritat nu. Men jag vill minnas att jag mätte upp pulserna till långt kortare än de helst borde vara. Hur förlänger jag pulserna på smidigast sätt? Någon sorts monostabil vippa byggd av ett par inverterande grindar, eller ska jag ge mig på någon sorts timerkrets? Eller finns det något enklare sätt?
Fråga två: Klockan är tänkt att ha ett tvåknapparsinterface. En knapp som ändrar intensiteten på displayen medelst PWM. Och en knapp som räknar fram timräknaren ett steg i taget, och samtidigt nollställer alla räknare av lägre ordning. På så sätt har man en chans varje timme att ställa in tiden. Knapparna måste såklart kontaktavstudsas. Vad är bästa sättet här? Monostabil vippa med inverterare? Timerkrets?
Fråga tre: Resetsignalen till frekvensdelaren får ju inte tillåtas att ta sig in bakvägen på klocksignalen till sekundräknaren. Hur löser jag det? Räcker det att sätta in en diod någonstans, eller kanske en OR-grind på frekvensdelarens ingång? (Resetknapp intryckt OR frekvensdelning uppnådd = nollställning)
Fråga fyra: Avstörningskondensatorer (på varje IC?). hur stora bör de vara?
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Re: OctoClock
Att det är en lödövning får mig att tycka att det är OK men jag tycker att du har gjort det lite halvdant faktisk. Mer om det längre ner.
1: Klocka-pulserna är ju långa som en skoldag enl. elektroniken och resetpulsen är så lång så att den resetter alldeles OK. Har den behov av en reaktionstid för att utföra sitt jobb stannar utgångarna kvar i läget så pass länga ändå då det är en självreglerande mekanism och du har gjort rätt.
2: Det beror på faktisk! Ska du ha brytare med växlande funktion är det i särklass bästa sättet att sätta NO till VDD, NC till GND och COMM via ett litet motstånd (~100 ohm) till en kondensator på 10nF (andra sidan till GND). Signalen på den sida av kondingen som motståndet sitter till är kristallklar och fin.
Annars kan ett RC-led med en schmitt-trigger efter vara grejen.
3: En gate placerat lämpligt ställe!
4: 100nF keramisk kondensator är bra till avkoppling, 10nF duger bra också, det viktigaste är nämligen att det är korta och raka ledare som gäller!
Och vad var det halvdana då? Jo, att du räknar oktalt på "minuter" och "sekunder" är helt OK men varför till 23 på timmarna? Varför inte ett "binärt" värde där också? Känns lite sådär...
Och att föreslå en mikroprocessor är ju knappast grejen, det blir inte så mycket lödövning men det kunde bli desto mer testande av olika räknevärden. Jag hade nog tagit samma LED-drivers och kopplat dom till en mikroprocessor, lagt alla BL ihop och styrt med en PWM-utgång (ljusstyrka) och sedan adresserat varje display driver med var sin LT/Strobe. På det vis ville alla styr-, räkna- och intensitetsproblem vara enkelt avklarat, det ville bli en del att löda ändå och olika räknevärden kan enkelt testas.
1: Klocka-pulserna är ju långa som en skoldag enl. elektroniken och resetpulsen är så lång så att den resetter alldeles OK. Har den behov av en reaktionstid för att utföra sitt jobb stannar utgångarna kvar i läget så pass länga ändå då det är en självreglerande mekanism och du har gjort rätt.
2: Det beror på faktisk! Ska du ha brytare med växlande funktion är det i särklass bästa sättet att sätta NO till VDD, NC till GND och COMM via ett litet motstånd (~100 ohm) till en kondensator på 10nF (andra sidan till GND). Signalen på den sida av kondingen som motståndet sitter till är kristallklar och fin.
Annars kan ett RC-led med en schmitt-trigger efter vara grejen.
3: En gate placerat lämpligt ställe!
4: 100nF keramisk kondensator är bra till avkoppling, 10nF duger bra också, det viktigaste är nämligen att det är korta och raka ledare som gäller!
Och vad var det halvdana då? Jo, att du räknar oktalt på "minuter" och "sekunder" är helt OK men varför till 23 på timmarna? Varför inte ett "binärt" värde där också? Känns lite sådär...
Och att föreslå en mikroprocessor är ju knappast grejen, det blir inte så mycket lödövning men det kunde bli desto mer testande av olika räknevärden. Jag hade nog tagit samma LED-drivers och kopplat dom till en mikroprocessor, lagt alla BL ihop och styrt med en PWM-utgång (ljusstyrka) och sedan adresserat varje display driver med var sin LT/Strobe. På det vis ville alla styr-, räkna- och intensitetsproblem vara enkelt avklarat, det ville bli en del att löda ändå och olika räknevärden kan enkelt testas.
- Illuwatar
- Inlägg: 2256
- Blev medlem: 10 november 2003, 14:44:27
- Skype: illuwatar70
- Ort: Haninge
- Kontakt:
Re: OctoClock
Ser ingen MCU i designen, så det lär inte finnas någon mjukvara heller. Då får man använda RC-filter istället för avstudsning.
Re: OctoClock
Tack, det var ett långt och genomarbetat svar. Jag tyckte ju att det var ganska snyggt att det fungerar "i princip" som en vanlig klocka. Det skulle vara enkelt att få en intuitiv känsla för hur mycket klockan är i vanlig bas 60 om antalet timmar är samma under dygnet. 0o300000 "sekunder" på ett dygn är väl ändå ett ganska välformat tal? =| (Tänk så bra världen vore om vi ändå skapats med fingrar och tår i tvåpotenser...)Icecap skrev:Att det är en lödövning får mig att tycka att det är OK men jag tycker att du har gjort det lite halvdant faktisk. Mer om det längre ner.
1: Klocka-pulserna är ju långa som en skoldag enl. elektroniken och resetpulsen är så lång så att den resetter alldeles OK. Har den behov av en reaktionstid för att utföra sitt jobb stannar utgångarna kvar i läget så pass länga ändå då det är en självreglerande mekanism och du har gjort rätt.
2: Det beror på faktisk! Ska du ha brytare med växlande funktion är det i särklass bästa sättet att sätta NO till VDD, NC till GND och COMM via ett litet motstånd (~100 ohm) till en kondensator på 10nF (andra sidan till GND). Signalen på den sida av kondingen som motståndet sitter till är kristallklar och fin.
Annars kan ett RC-led med en schmitt-trigger efter vara grejen.
3: En gate placerat lämpligt ställe!
4: 100nF keramisk kondensator är bra till avkoppling, 10nF duger bra också, det viktigaste är nämligen att det är korta och raka ledare som gäller!
Och vad var det halvdana då? Jo, att du räknar oktalt på "minuter" och "sekunder" är helt OK men varför till 23 på timmarna? Varför inte ett "binärt" värde där också? Känns lite sådär...
Och att föreslå en mikroprocessor är ju knappast grejen, det blir inte så mycket lödövning men det kunde bli desto mer testande av olika räknevärden. Jag hade nog tagit samma LED-drivers och kopplat dom till en mikroprocessor, lagt alla BL ihop och styrt med en PWM-utgång (ljusstyrka) och sedan adresserat varje display driver med var sin LT/Strobe. På det vis ville alla styr-, räkna- och intensitetsproblem vara enkelt avklarat, det ville bli en del att löda ändå och olika räknevärden kan enkelt testas.
1. Ja, pulserna från frekvensdelarna är så gott som oändligt långa mätt i ns.. Men klockpulserna jag skickar vidare till timräknaren blir väldigt korta. Jag ska ta en bild på hur det verkligen ser ut när jag hälsar på mitt oscilloskop nästa gång.
2. Jag hade ju tänkt använda en enkelt "momentant på"-knapp. Men för att reda ut hur man går till väga i båda fallen skulle det alltså se ut såhär? Jag plankade lite härifrån. 4. Ok, 10nF-100nF, lägger på minnet.
Programmering har jag lite bättre koll på än elektronik. (Inte just på så låg nivå dock. Tex har jag aldrig använt mig av interrupts.) Så jag tänkte att det skulle vara intressant att lösa problemet på hårdvarunivå, lite som övning. Men du har nog, kanske helt omedvetet, en poäng ändå. Jag har planer på ett större projekt där jag kommer att använda en AVR-processor. Hittills har jag bara använt sådana via Teensy-utvecklingskorten, och då är ju programmeringen av chipet väldigt enkel när man bara för över binärfilen via USB. Men till det projektet kommer jag att vilja sätta AVRen direkt på "moderkortet" och då vore det bra om jag övade mig lite i att programmera processorn "på riktigt" först. Lödning blir det ju gott om ändå.
Jag tror jag inser hur man multiplexar displayerna i alla fall. Alla displaydrivare kopplas till samma fyra outputpinnar på kontrollern, och sedan väljer man vilken display som ska uppdateras med hjälp av varsin ytterligare kontrollerpinne? (Eventuellt multiplexar man valet av displaydrivare externt om man har många).
Om jag använder en mikrokontroller skulle det ju vara snyggare om jag gjorde det möjligt att även visa hexadecimala tal på displayerna. Jag tror jag läste i en annan tråd här att det var rätt ont om drivare som kodar av "BCH" -> 7segment dock. Nu när jag skriver det här så inser jag att det här problemet borde gå att lösa med ett shiftregister, eller hur? Jag använder ett shiftregistret som drivare till varje display. Men hur mycket ström klarar en sån där av att leverera? ~25mA per diod i displayen behövs ju i alla fall ungefär. Jag hittar inte riktigt i databladet.
Men om jag ändå går in på spåret med mikrokontroller så kanske jag lika gärna skulle använda något sånt här, och köra på 16-segmentsdisplayer istället. Då kan jag leka fritt som jag vill sedan =) Även om det känns lite som jag efter det har byggt något som redan borde finnas färdigt...
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Re: OctoClock
Den överväldigande majoriteten av mikrokontrollerapplikationer skulle jag nog säga är till stor del interruptstyrda, så det är nog ingen dålig sak att öva på det heller.Programmering har jag lite bättre koll på än elektronik. (Inte just på så låg nivå dock. Tex har jag aldrig använt mig av interrupts.)
Re: OctoClock
1: OK, jag fattar. Koppla ett RC-led mellan gatens utgång och reset-ingången, då får du en fördröjning som ger en fin & bra puls.
2: Bingo! Give that man a cigar!
4: Jag använder konsekvent 100nF keramiska ytmonterade kondensatorer. Men en artikel i "Elektronik i Norden" visade att det egentligen kvittade, det viktiga var korta och raka ledningar.
Med 20mA segment i dina display är det faktisk bara varje siffra som ska buffras, segmenten kan drivas direkt av en mikroprocessor! Detta betyder att du kan göra klockan med en mikroprocessor, 8 st motstånd till segmenterna och 1 transistor per siffra. Lägg till en kristall som CPU-klocka och du har det hela klart! Knappar debouncer du i mjukvaran varför det behövs ett motstånd för varje knapp.
Vill du ha lite mer tryck i intensiteten bör du lägga till en drivtransistor + basmotstånd för segmenterna, alltså 7 st (8 med DP). Orsaken är ju att om du har 6 siffror kommer de var isär att lysa 1/6 del av tiden vilket, vid 20mA ström, motsvarar 3,3mA. Pga. ögats tröghet ser det ut som ~6mA dock men det kan vara lite ändå. Lösningen är att helt enkelt ge dom 3gg högre ström (kolla databladet om det går), då ser det likadan ut för ögat. Det är ögats tröghet att det räcker med 3gg mer ström, matematisk skulle man ge dom 6gg mer.
Med en mikroprocessor kan du välja vilket mönster du vill visa, du styr helt enkelt varje segment från processorn. Jag har gjort sånt och det är bara att göra en tabell över tecknen och slå upp i den.
Och det är inte lågt nivå med interrupt, det är lågt nivå utan interrupt! Till detta kommer en timerinterrupt att vara det abs. viktigaste då det är vad som ska styra multiplexningen och tidräkningen.
2: Bingo! Give that man a cigar!
4: Jag använder konsekvent 100nF keramiska ytmonterade kondensatorer. Men en artikel i "Elektronik i Norden" visade att det egentligen kvittade, det viktiga var korta och raka ledningar.
Med 20mA segment i dina display är det faktisk bara varje siffra som ska buffras, segmenten kan drivas direkt av en mikroprocessor! Detta betyder att du kan göra klockan med en mikroprocessor, 8 st motstånd till segmenterna och 1 transistor per siffra. Lägg till en kristall som CPU-klocka och du har det hela klart! Knappar debouncer du i mjukvaran varför det behövs ett motstånd för varje knapp.
Vill du ha lite mer tryck i intensiteten bör du lägga till en drivtransistor + basmotstånd för segmenterna, alltså 7 st (8 med DP). Orsaken är ju att om du har 6 siffror kommer de var isär att lysa 1/6 del av tiden vilket, vid 20mA ström, motsvarar 3,3mA. Pga. ögats tröghet ser det ut som ~6mA dock men det kan vara lite ändå. Lösningen är att helt enkelt ge dom 3gg högre ström (kolla databladet om det går), då ser det likadan ut för ögat. Det är ögats tröghet att det räcker med 3gg mer ström, matematisk skulle man ge dom 6gg mer.
Med en mikroprocessor kan du välja vilket mönster du vill visa, du styr helt enkelt varje segment från processorn. Jag har gjort sånt och det är bara att göra en tabell över tecknen och slå upp i den.
Och det är inte lågt nivå med interrupt, det är lågt nivå utan interrupt! Till detta kommer en timerinterrupt att vara det abs. viktigaste då det är vad som ska styra multiplexningen och tidräkningen.
Re: OctoClock
Jag har inte riktigt haft den tid jag velat till det här men snart hoppas jag att det blir bättre. Jag tror i alla fall att jag förstod i stort sett allt du skrev den här gången =) Då skulle kopplingen se ut såhär ungefär, plus lite fler komponenter såklart? Finns det någon skillnad i funktion rent praktiskt på gemensam anod eller gemensam katod på displayerna? Om jag ändå styr strömmen till dom via transistorer så är det ju fritt fram att välja vilket som.
Använder man samma programmerare för alla sorters AVR? Atmega, ATtiny osv? Finns det någon bra nybörjarguide till AVR någonstans? Köper man programmerare eller bygger man den själv?
Här är en bild på pulsen ut från en AND-grind. Den var mycket längre än vad jag hade fått för mig. Den uppställningen är visserligen med 40110-räknare.

Reset and Clock Pulse by Fredrik Atmer, on Flickr
Intressant det där med hur ögat uppfattar intensiteten. Jag läste i något datablad att man kunde köra displayen på 1/10 duty cycle med 140mA-pulser istället för 25mA kontinuerligt. Tänkte att då borde det ju inte bli full styrka, men det är alltså mycket möjligt att det uppfattas så ändå. Jag ser redan nu framför mig hur min kod kommer att hänga sig under tiden en display är tänd i 140mA och snabbt och effektivt bränna sönder den =P Hur man får till olika tecken på displayerna är tillräckligt högnivå för att jag ska klara det tror jag nog. Jag funderar på att koppla ihop åtta, eller kanske tio, 16-segmentsdisplayer och bygga in dem i locket på en extern 5.25"-plats i datorn. Då kan jag ta ström direkt från USB och även styra vad som visas på displayen. Fast då får jag nog läsa på lite om kommunikation över USB först... Enkelt att programmera om chipet borde det i alla fall vara.Använder man samma programmerare för alla sorters AVR? Atmega, ATtiny osv? Finns det någon bra nybörjarguide till AVR någonstans? Köper man programmerare eller bygger man den själv?
Här är en bild på pulsen ut från en AND-grind. Den var mycket längre än vad jag hade fått för mig. Den uppställningen är visserligen med 40110-räknare.

Reset and Clock Pulse by Fredrik Atmer, on Flickr
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Re: OctoClock
Skillnaden mellan gemensam anod och katod är i praktiken noll. Det har mest betydelse om man använder en viss drivkrets.
Ögat har en tröghet som gör att om du t.ex. ser en blixt blir du bländat ett tag - fastän den är mycket kort. Samma sak med blinkande LED, ljuset "hänger kvar" lite varför ögat helt enkelt luras.
Alla LED jag har sett datablad på (och det är ganska många) har en parameter för maximal ström samt en parameter för maximal tid den ström får flöda. Det finns även en maximal effekt och alla dessa får man räkna igenom för att vara säker.
Se till att alla siffror är uppdaterat med en minste frekvens på 70Hz, gärna 100Hz om det går utan besvär. Ett enkelt sätt är att reservera en byte per siffra och ha en timer-interrupt i lämplig hastighet. Den ISR ser till att släcka alla data, räkna upp scanning-räknaren, ta nästa data, kasta ut dom och sedan slå på sifferväljaren. På det vis får du en liten dödtid mellan gamla siffran och nya, det ger minskat eller eliminerat "ghost"-effekt (eftersläp).
Skrivning av tecken att visa på diaplayen består då bara av att fylla i rätt mönster i rätt position, sedan tar interrupten (ISR'n) hand om resten.
Ögat har en tröghet som gör att om du t.ex. ser en blixt blir du bländat ett tag - fastän den är mycket kort. Samma sak med blinkande LED, ljuset "hänger kvar" lite varför ögat helt enkelt luras.
Alla LED jag har sett datablad på (och det är ganska många) har en parameter för maximal ström samt en parameter för maximal tid den ström får flöda. Det finns även en maximal effekt och alla dessa får man räkna igenom för att vara säker.
Se till att alla siffror är uppdaterat med en minste frekvens på 70Hz, gärna 100Hz om det går utan besvär. Ett enkelt sätt är att reservera en byte per siffra och ha en timer-interrupt i lämplig hastighet. Den ISR ser till att släcka alla data, räkna upp scanning-räknaren, ta nästa data, kasta ut dom och sedan slå på sifferväljaren. På det vis får du en liten dödtid mellan gamla siffran och nya, det ger minskat eller eliminerat "ghost"-effekt (eftersläp).
Skrivning av tecken att visa på diaplayen består då bara av att fylla i rätt mönster i rätt position, sedan tar interrupten (ISR'n) hand om resten.
Re: OctoClock
Jag kommer nog att använda såna här displayer tror jag. Med tio stycken och 1/10 duty cycle, blir det ju hur bra som helst =) 0.1ms pulse width borde de klara i 140mA.
Hur räknar jag ut effektutvecklingen? Är spänningsfallet alltid ~<3.5V över LEDarna oberoende av strömstyrkan? 3.5V × 140mA × 1/10 ~= 50mW ? Om jag lyckas komma upp i 1000Hz dvs... Jag tycker det låter som en ganska låg siffra ändå när det står siffror som 150mW 60mW i databladet.
Edit: Äsch, läste lite fel ~60mW stod det något om.
Och förresten så läste jag igenom den där artikeln on debouncing lite bättre. Den är riktigt bra och dessutom är han ganska rolig =)
Hur räknar jag ut effektutvecklingen? Är spänningsfallet alltid ~<3.5V över LEDarna oberoende av strömstyrkan? 3.5V × 140mA × 1/10 ~= 50mW ? Om jag lyckas komma upp i 1000Hz dvs... Jag tycker det låter som en ganska låg siffra ändå när det står siffror som 150mW 60mW i databladet.
Edit: Äsch, läste lite fel ~60mW stod det något om.
Och förresten så läste jag igenom den där artikeln on debouncing lite bättre. Den är riktigt bra och dessutom är han ganska rolig =)
The SR latch is a rather funky beast, as confusing to non-EEs as recursion is to, well, just about everyone.
We optocoupled all cabling simply to keep the smoke inside the ICs, where it belongs.