Kontorsklocka

Användarvisningsbild
Icecap
Inlägg: 26148
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Kontorsklocka

Inlägg av Icecap »

Jag har en del projekt där jag använder 1-Wire som temperatursensor. Och fler blir det.

Men det gör ont i min svarta själ att sitta med en 50MHz 32-bit µC med visslor och pukor - och vänta på att 1-Wire rutinen ska prata klart med alla delay o skit.

Så jag går en lite annan väg: interrupt!

Har räknat en del och har insett att interrupt inte är hela vägen att gå, det är rent praktisk inte möjligt att göra korta nog pulser om allt ska vara uteslutande interruptstyrd - så jag har interrupt för varje bit som sändas eller tas emot.

Det fina med 1-Wire är att man rent faktisk kan tillåta sig att vänta 1 timme mellan avläsningen/skrivningen av varje bit (om man vill) varför jag kan sätta en timer till att ge interrupt med lämplig hastighet. Så har jag ett projekt med begränsat hastighet kan jag köra med en låg hastighet på interrupten och sannolikt "hänga på" en interrupt som ändå ska köra.

Själva läsningen/skrivningen sker med for(;;)-delay medan omvandlingstid och reset är sekvenser i interrupten. Detta betyder att jag inte kan ha parasitmatade enheter inkopplade, reset-pulsen är för lång i många situationer.

Jag har trimmat timingen nu så jag enkelt kan läsa en sensor men jag ska expandera detta till att kunde hitta fler sensorer med sökrutinen och läsa dessa och placera resultatet i separata variabler. Men det får bli i morgon.

Mitt mål är att skapa ett "generellt" 1-Wire lib där timingen kan definieras externt och därmed kan användas till PIC, Renesas eller annan µC, man får såklart trimma delay-värden för varje projekt men resten ska vara identisk.

För tillfället kör interrupten med 1500 bit/sekund men det går ju att köra upp till 8260 bit/sek. Tror dock att jag sänker hastigheten till kanske 300 i morgon.

Jag har en del funderingar på exakt hur jag ska lösa det hela men ska jag köra med "Find First", "Find Next", konvertering och avläsning av specifika serienummer blir det ju en del att hålla reda på.

Just nu fungerar det på min kontorsklocka - men bara med en enda sensor men nu, då jag har all timing klar, är det ju bara att köra vidare.

Min tanke är att den normala avläsning ska ske så att det skickas en "Skit i ROM" + "Starta omvandlingen" till alla, sedan väntas det i lämplig tid och sedan avläsas varje enhet som finns i en lista (som sparar i EEPROM) och värdet sparas i egen variabel.

Omräkningen sker korrekt för DS1820, DS1822, DS18S20 & DS18B20 och värden räknas i 1/10°C. Då mitt display bara har 32 punkter i X är utskriften kontrollerat så att om det blir för brett klippas decimalen bort automatisk. Detta kommer bara att ha betydelse om det blir mycket kallt, från och med -20,0°C.

Men i morgon skal jeg trimma in det sista så att jag kan uppgradera min gamla klocka och använda mönsterkortet i den. Då ska jag även expandera EEPROM'en på det kretskort till 256kB, jag använder EEPROM dels till att spara inställningar (position, färger och annat) och även till statistik, i detta fall temperatur var 5'de minut.

Sedan ska jag även fixa det fel på mönsterkortet som finns: Tx och RX till radion är kastat om. Det är enkelt att fixa, lite pilligt bara. Då kommer jag att ha 433MHz kommunikation med kortet/klockan + 2 st RS232 + 1 st RS485. Jag har dock ingen aning om vad jag ska med allt det - men jag har det!

För enkelhetens skull vill jag använda den USB-anslutna 433MHz radio jag har liggande till ett annat system för att tömma statistik och ställa tiden korrekt när det behövs. Enkelheten består i att jag inte behöver koppla ledning mellan COMx och klockan.

Jag kan redan nu ställa färger & positioner med kommandon via ett terminalprogram.
"Set Position Date xx" ställer understa Y-position på datum-texten till XX.
"Set Colour Date Y" sätter färgen som det skrivs med (RGB, 7 färger + svart).