Nixie-klocka
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
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
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
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
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:
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--
}
}
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
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
ä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?)
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?
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
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?
-
- Inlägg: 95
- Blev medlem: 7 maj 2005, 22:16:53
- Kontakt:
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".
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".
-
- Inlägg: 95
- Blev medlem: 7 maj 2005, 22:16:53
- Kontakt:
karlstedt: Allt är relativt. Särskilt tid. Men det blir betydligt mer exakt än det som tidigare föreslagits som varit i stil med
eftersom man med den koden blundar för den tid som spenderas när processorn kör annan kod än den i delay-loopen.
Tanken med en klockkristall är att den med en kristalls (doh) nogrannhet räknar upp en (16-bitars) räknare, och triggar timerinterruptet vid varje overflow. Det blir iaf bra mycket noggrannare - vem tycker egentligen att en klocka som saktar sig 5 minuter i veckan är en klocka av värde?
/K
Kod: Markera allt
while(true) {
<massa kod>
delay_ms(500);
}
Tanken med en klockkristall är att den med en kristalls (doh) nogrannhet räknar upp en (16-bitars) räknare, och triggar timerinterruptet vid varje overflow. Det blir iaf bra mycket noggrannare - vem tycker egentligen att en klocka som saktar sig 5 minuter i veckan är en klocka av värde?
/K
jo, jag är precis med på ditt resonemang om C-kodens svagheter... och svagheterna i tänket om att göra klockan på detta viset. Men man lär av misstagen 
Jag ville egentligen bara veta vad du hade för verklighetsuppfattning om vad "EXAKT" var
sorry, onödigt inlägg av mig.
själv skulle jag, som du säger, aldrig göra en klocka utan interrupt.. speciellt inte i C.

Jag ville egentligen bara veta vad du hade för verklighetsuppfattning om vad "EXAKT" var

sorry, onödigt inlägg av mig.
själv skulle jag, som du säger, aldrig göra en klocka utan interrupt.. speciellt inte i C.
okej 
interuppt alltså...
vilken timer ska man använda? det finns två i atmegan, timer/counter 1/2 båda delar samma prescaler...
man kan väl köra interupptet internt? för jag behöver inte ha den som utgång väl? utan det räcker med att den räknar åt mig?
och ska man använda prescaler? isåfall hur mycket ska signalen "delas ner"
klockan tror jag att jag "styr själv" alltså, inte med interuppt, utan genom att sätta porten hög och låg...
tänkte beställa komponenterna på måndag eller nått... då kan man börja experimentera lite mera...
börjat skissa på ett schema nu med
ska bli spännande å se hur de går med detta 

interuppt alltså...
vilken timer ska man använda? det finns två i atmegan, timer/counter 1/2 båda delar samma prescaler...
man kan väl köra interupptet internt? för jag behöver inte ha den som utgång väl? utan det räcker med att den räknar åt mig?
och ska man använda prescaler? isåfall hur mycket ska signalen "delas ner"
klockan tror jag att jag "styr själv" alltså, inte med interuppt, utan genom att sätta porten hög och låg...
tänkte beställa komponenterna på måndag eller nått... då kan man börja experimentera lite mera...
börjat skissa på ett schema nu med


-
- Inlägg: 95
- Blev medlem: 7 maj 2005, 22:16:53
- Kontakt:
ATmega16/ATmega32 har två pinnar särskilt avsedda för klockkristaller. Dessa är PC6 och PC7, som också går under namnet TOSC1 och TOSC2. Häng en klockkristall, t.ex 74-530-04 från Elfa däremellan. Det står i manualen sedan hur du aktiverar oscillatorn, och en prescaler på 128 ger 1Hz i interruptfrekvens. Om det är vad du vill ha får du avgöra själv.
/Kristoffer
/Kristoffer