Nixie-klocka

Elektronikrelaterade (på komponentnivå) frågor och funderingar.
B1n4ry
EF Sponsor
Inlägg: 1327
Blev medlem: 30 november 2005, 20:02:50
Ort: Borås
Kontakt:

Inlägg av B1n4ry »

Om du kör med en processor som själv skall hålla reda på tiden så kommer den ju att behöva vara igång alltid. En nixieklocka kanske man vill stänga av ibland för att spara på rören och då måste man ju ställa klockan varje gång när man säter på den igen. Man kan ju iofs bara stänga av drivningen till rören kanske men vid minsta strömavbrott så är det dax att ställa klockan igen.

I mina nixie- (och andra) klockor så kör jag med en liten RTC (RealTimeClock) krets som är väldigt strömsnål och dessutom enkel att kommunicera med (I2C). PCF8583 heter den jag kör med men det finns liknande kretsar även med Dallas entråds-buss.

På min elektroniksida finns schema och PIC-kod...

//B1n4ry
Virr3
Inlägg: 840
Blev medlem: 25 juli 2004, 23:05:59
Ort: Göteborg

Inlägg av Virr3 »

Har läst lite om både latchar och BCD...

Om BCD betyder Binary Coded Decimal så tror jag att jag fattar det...

dock latchen har jag lite svårt för att fatta hur den ska kopplas... vad jag fattat är det bara ett minne eller? och hur man sen ska få ihop de hela har jag inte kommit underfund med riktigt än, men om någon skulle vilja förklara lite om hur latchen ska kopplas så kanske det kan gå vägen...

B1n4ry >> Väldigt(!) fina klockor måste jag säja...

jag vet inte om jag varken hinner eller orkar sätta mig in i i2c protokollet...
men om det är som du säjer, lätt så kanske man skulle ta å göra de med...

men först å främst ska jag försöka göra grunden till klockan :)

tack för koden å allt:) men jag skriver programmn i c och fattar inget av asm ;)
måste bara fråga, vad betalade du för rören? och köpte du dom på den på samma ställe som du länkat till i rörnamnet?
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg av speakman »

Tänkte bara tillägga att Illuwatar verkar ha gjort på exakt det sätt jag menade, men kanske förklarade det lite bättre. :)

Mvh
speakman
Användarvisningsbild
BER
Inlägg: 399
Blev medlem: 9 mars 2005, 00:02:10
Ort: Östergötland

Inlägg av BER »

Förstår inte riktigt hur du menar med arrayen... skulle du kunna förklara lite mer om det?
Som du sa, så blir det många if eller case satser för att avkoda alla siffror. Idén är då att lägga upp listor(arrayer) för att göra detta på ett snabbt och enkelt sätt. Om lägsta sekund siffran är 0 så hämtas värdet på första raden i listan för den siffran och läggs ut på porten direkt. Om lägsta siffran är 1 så hämtas värdet på andra raden o.s.v.

Det blir lite krångligare om man behöver flera portar för att styra en siffra men det går också, ett sätt är att dubblera listorna.

Från exemplet jag gav tidigare, där antas portb vara MCU:ns port register till andra porten. Siffran man vill styra använder på denna port de fyra lägre bitarna.

Kod: Markera allt

portb = ( portb & 0b11110000 ) | ( timmar1[tim/10] & 0b00001111);
/* Nollställer de fyra lägre bitarna, detta för att sedan kunna sammanfoga nytt och gammalt portdata*/
( portb & 0b11110000 )

/* Hämtar data från tabellen. tim/10 gör så att endast den höga siffran indexseras */
timmar1[tim/10]

/* För säkerts skull så maskas de höga bitarna bort i från listan. De höga bitarna kan till exempel användas för att styra en annan port om de passar in.*/
( timmar1[tim/10] & 0b00001111 )

/* Slutligen så sammanfogas data som fanns innan på de höga bitarna med det nya datat på de låga bitarna och skrivs till portregistret. */
portb = ( portb & 0b11110000 ) | ( timmar1[tim/10] & 0b00001111)


Tror jag var lite snabb att ge goda råd : )

Mitt kod förslag passar sig bättre då man har någon form av led matris. Om jag har förstått det hela rätt så spänningssätt endast en slinga i taget i varje rör för att visa en siffra. För att styra detta skulle jag använda 6st 74HC245 (45 slingor om jag har räknat rätt).
Användarvisningsbild
Illuwatar
Inlägg: 2256
Blev medlem: 10 november 2003, 14:44:27
Skype: illuwatar70
Ort: Haninge
Kontakt:

Inlägg av Illuwatar »

Lite mer detaljer på mitt bygge - jag använder tre 4028'or där två agerar avkodare BCD-till-binär. Den tredje används som väljare och styr vilka register (74HC237) som skall laddas. Med andra ord, avkodarna sitter före latcharna och styrs direkt av mikrokontrollern. På så sätt behövs inte så många utgångar. Transistorerna är sedan kopplade till utgångarna på 237'orna via motstånd. Rören agerar kollektorlast.

Genom att använda BCD i mjukvaran gör man det enkelt för sig - Dallas-chippet som används för att behålla tiden lämnar nämligen detta ifrån sig...
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg av speakman »

Hm, nu hänger jag inte med. Får det till att gå åt fler pinnar än att sätta latcharna först... Du kan inte lägga upp ett schema? Bara för nyfikenhets skull. :D
Alltid intressant att se andras lösningar.
Det där med en BCD->Bin för varje latch är ju däremot klokt. Eftersom man heller inte sätter flera latchar samtidigt, så spar man ju ännu lite fler pinnar. ;)
Men det andra får jag inte riktigt att gå ihop.

Mvh
speakman
B1n4ry
EF Sponsor
Inlägg: 1327
Blev medlem: 30 november 2005, 20:02:50
Ort: Borås
Kontakt:

Inlägg av B1n4ry »

Alla mina rör har jag köpt på EBay...

För att bygga grunden och tända rätt segment så kan du göra det rätt smart! Kolla på mitt schema för Nixieklocka #2

Några Serial Input, Parallell Output skiftregister som t.ex. 74HC4094 gör ju att annars att du klarar dig med 3 (eller 4) pinnar på processorn. Oavsett hur många rör du skall ha. Skippar man OE vilket går bra så klarar man sig med 3 pinnar!

En SIPO skiftregister har en ingång, en klocka en strobe, en "kaskadutgång" och ett antal utgångar...

När klockpinen blir låg och sedan hög igen (togglar) tas datan på ingången och läggs i minnet för första utgången. Nästa gån klockan "togglar" flyttas alla minnesplatser ett steg och indata läggs på första platsen igen. När man togglat klockan tillräckligt många gånger för att första biten man klockade in skall "ramla ut" på andra sidan så kommer den ut på kaskadutgången och där kan man koppla nästa skiftregister... När sedan alla bitar klockats genom registret så togglar man strobe signalen och vips läggs utdata ut på utgångarna. (Så länge som strobe är låg så sker allt inuti kretsen men inget ändras på utgångarna. Perfekt för att driva en nixieklocka!

Kolla på Schema
och Datablad för 4094

Man kan enkelt göra om BCD siffran till rätt utdata genom att för varje siffra loopa 10 varv och jämföra siffran med loop-räknaren och när det är "rätt" siffra så klockar man ut en etta istället för en nolla.

Ett exempel i nån form av pascalliknande kod...

Htio := 1; (* Timmar Tiotal *)
Hen := 4; (* Timmar Ental *)

for n := 0 to 9 do
begin
if Htio = n then datapin := 1
else
datapin := 0;
clock := 1;
clock := 0;
end;

for n := 0 to 9 do
begin
if Hen = n then datapin := 1
else
datapin := 0;
clock := 1;
clock := 0;
end;

Upprepa sedan detta för minuter och sekunder och efter att alla rören fått sin siffra så gör man strobe-signalen hög en stund och vips visas de nya siffrorna och allt är klart...

strobe := 1;
strobe := 0;


//B1n4ry
Virr3
Inlägg: 840
Blev medlem: 25 juli 2004, 23:05:59
Ort: Göteborg

Inlägg av Virr3 »

Såg supernice ut:)

det är nog ett schema jag tänker köra efter, det såg inte så jätte krångligt ut:)

men du. flimmrar inte rören när du inte har en kondensator parallellt med matningen till dom?

koden fattade jag inte speciellt mycket av:/
B1n4ry
EF Sponsor
Inlägg: 1327
Blev medlem: 30 november 2005, 20:02:50
Ort: Borås
Kontakt:

Inlägg av B1n4ry »

Nej dom flimmrar inte. Det kan kanske tänkas att dom skulle lysa något starkare med en kondensator som glättar inspänningen men det funkar bra som det är nu oxå.

Ta en vanlig 230V glödlampa eller ett lysrör, dom körs ju direkt på växelspänningen och dom flimmrar ju inte heller, iaf inte så ögat uppfattar det... =)

En LED är ju mycket snabbare än en glödlampa eller ett nixierör (som har en viss inbyggd tröghet = saker som blir varma). Dessutom lyser ju LED:en bara vid spänning i ena riktningen och kör man den då på växelspänning så lyser den bara halva tiden och kan då se ut att flimmra.

//B1n4ry
Virr3
Inlägg: 840
Blev medlem: 25 juli 2004, 23:05:59
Ort: Göteborg

Inlägg av Virr3 »

Sant de du säjer b1n4ry...

försökte att göra koden i c++ och det dök upp några frågotecken... har skrivit de jag inte fattat som kommenatarer i koden, förutom de sista du skrev, strobe, som jag inte fattar hur jag ska koda alls :/

såhär tolkade jag den:

Kod: Markera allt

uint8_t Htio=1; //timmar tiotal
uint8_t Hen=1; //timmar ental
uint8_t datapin; //vart kommer den ifrån, vad gör den?
uint8_t	clock; //hur ska jag skapa klockan? interuppts? hur snabb ska den vara?

for(n=0;n>9;n++)
{
	if(Htio==n)
	{
	datapin=1;
	}
	
	else
	{
	datapin=0;
	clock=1;//varför?
	clock=0;//--II--
	}
}
	
for(n=0;n>9;n++)
{

	if(Hen==n)
	{
	datapin=1;
	}

	else
	{
	datapin=0;
	clock=1;//varför?
	clock=0;//--II--
	}
}
B1n4ry
EF Sponsor
Inlägg: 1327
Blev medlem: 30 november 2005, 20:02:50
Ort: Borås
Kontakt:

Inlägg av B1n4ry »

Själva tidräkningen är nästa problem, detta är bara "output" delen som styr nixierören.

datapin, strobe och clock är tre utgångar/pinnar på processorn som kopplas till skiftregistrenas ingångar med samma namn. Kolla i min skiss hur jag gjort, data skall seriekopplas och dom andra parallellkopplas...

Tänk dig sedan 4 nixierör. Det ger totalt 40 olika segment/siffror som skall kunna vara tända eller släkta (10st / rör). Om du gör på "mitt" sätt med seriell in parallell ut skiftregister/"minnen" så behöver du 5 skiftregisterkretsar eftersom dom har 8 utgångar / styck.

Du kopplar då såhär:
Nixierör-1, siffra 9 till utgång 1 på krets 1.
Nixierör-1, siffra 8 till utgång 2 på krets 1.
Nixierör-1, siffra 7 till utgång 3 på krets 1.
...
Nixierör-1, siffra 2 till utgång 8 på krets 1.
Nixierör-1, siffra 1 till utgång 1 på krets 2.
Nixierör-1, siffra 0 till utgång 2 på krets 2.
Nixierör-2, siffra 9 till utgång 3 på krets 2.
och så vidare till
Nixierör-4, siffra 0 till utgång 8 på krets 5.

Alla "segment" sitter ju då i "rad" med första 9:an först och sista 0:an sist.
Du kan då skriva varje segment som av eller på = 0 eller 1.
Sätter du alla i en lång rad så blir 1234 på nixierören:

9876543210 9876543210 9876543210 9876543210 (motsvarande siffra)
0000000010 0000000100 0000001000 0000010000 (tänd=1/släckt=0)

Första 0:an är siffra 9 på första röret (som är släckt)
Första 1:an motsvarar att en 1:a visas på rör 1.
Andra 1:an motsvarar en 2:a på andra röret... o.s.v.

Vad du då mycket riktigt gör i din c-kod är att lägga ut första biten på en utgång på processorn som är kopplad till "data" på skiftregistret och sedan skicka en signal till skiftregistret att läsa in det som finns på dataingången genom att "klocka" med en puls på skiftregistrets klocksignal-ingång. Klocka gör man genom att först göra klockpinnen 1 och sedan 0 igen.
Sedan upprepar du detta 39 ggr till ända tills alla 40 bitarna är utklockade

När sedan alla bitarna är ute så skall du tala om för skiftregistret att läsa "bitsekvensen" ovan i sitt interna minne och skicka den till utgångarna så att nixierören börjar visa rätt siffron. Detta gör man genom att skicka en puls på en ingång i skiftregistret som heter strobe. Alltså först sätter du den pinnen på processorn till 1 och sedan till 0 igen...

Hoppas det klarnar lite nu! =)

Själva klockdelen eller om du vill använda en I2C klocka som jag gjorde kan säkert någon annan förklara. Jag har inte satt mig in i hur det funkar varken i C eller i AVR men det BORDE finnas färdig kod för det tycker man... Det gör väl det i BASIC-STAMP iaf? Eller? Nån som vet?

//B1n4ry
Virr3
Inlägg: 840
Blev medlem: 25 juli 2004, 23:05:59
Ort: Göteborg

Inlägg av Virr3 »

är inte 100 på koden än men mycket har klarnat, ska kolla igenom det lite till när jag kan tänka lite bättre, ikväll eller nått...

har du bara använt i2c till clockan eller använder du det som utsignal till skiftregistret?

För jag har hittat i databladet lite nu...

om någon kunde säja ifall de ä rätt skulle de va fint :)

ifall jag sätter TWEN hög så "enablar" jag twi(som är samma som i2c väl?)

Kod: Markera allt


SCL frequency  =   CPU Clock frequency
                   -------------------
                   16 + 2(TWBR) ⋅ 4 TWPS
TWBR är "TWI Bit Rate Register"
TWPS är "prescaler bits in the TWI Status Register"

Prescalervärdet kan jag välja lite som jag vill eller hur? så om jag sätter den som 4a och sen så står det att bit rate register ska vara större än 10 för att det ska funka utan krångel så då sätter jag den som 11? eller?

skulle de funka att göra så? skulle scl pinen på avren få en fin frekvens ifall jag gjorde på detta sättet? något jag missat?

vad är den ultimata frekvensen för detta ändamålet? det kanske inte är så vikitgt?
Virr3
Inlägg: 840
Blev medlem: 25 juli 2004, 23:05:59
Ort: Göteborg

Inlägg av Virr3 »

ingen som vet?
kristoffer
Inlägg: 95
Blev medlem: 7 maj 2005, 22:16:53
Kontakt:

Inlägg av kristoffer »

Virr3, har du tänkt på att alla maskinkodsinstruktioner som blir av din C-kod mellan delay():en i for-loopen även de tar tid att utföra? Det innebär att din klocka kommer att sakta sig, exakt hur mycket beror på hur duktig din kompilator är på att få koden kompakt (=få maskinkodsinstruktioner).

Jag läste att du hade avfärdat tanken på interrupts - jag tror du får plocka upp den igen. Vissa ATmega-proppar har ingång för en 32,768kHz-klockkristall. Om du kan få den att oscillera och trigga ett timerinterrupt så kan du få timerinterruptet att köra EXAKT 2 gånger i sekunden, t.ex.

Timerinterruptet räknar typiskt upp en sekundräknare, och räknar upp minuten då sekundräknaren nått 60 (och nollställer sekundräknaren i det fallet) och gör samma för timme/minut-fallet. Hur mycket kod detta blir spelar ingen roll, för så länge som interruptkoden har körts klart innan det är dags för nästa interrupt så körs interruptet fortfarande exakt "on time".
Användarvisningsbild
karlstedt
EF Sponsor
Inlägg: 966
Blev medlem: 14 oktober 2003, 16:55:23
Ort: Lund
Kontakt:

Inlägg av karlstedt »

Förklara gärna vad du menar med "EXAKT" för mig... jag är inte så insatt?
Skriv svar