Noggranna sekunder i stället för RTC...

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Harald
Inlägg: 42
Blev medlem: 7 november 2003, 15:50:50
Ort: Östersund

Noggranna sekunder i stället för RTC...

Inlägg av Harald »

Man kan ju använda en RTC för att få sekunder, minuter etc. Tyvärr får ju en sådan klocka ganska dålig noggrannhet jämfört med t ex en kristallstyrd analog klocka för 39 spänn på Clas. Dessutom blir ju koden omfattande och vill man göra något annat så får det knappt plats.

Kollade spänningen över stegreläet som hackar fram sekundvisaren på ett analogt kristallstyrt urverk. Det är spikar på ca 0.9 V som kanske är lite knepiga att styra en AVR-krets med. Tänkte göra så att jag helt enkelt räknar sekunder och kollar om något ska utföras. Man har ju en sekund på sig så det är ju gott om tid.

Hur fångar man upp spänningspulsen från stegreläets spole? Kanske kan man styra en fälteffekttransistor och fixa en nolla på ett stift på AVR-kretsen? Man har ju lyft upp den till ”1” med ett motstånd på 1K.

Är det någon som redan labbat fram något läckert?

Harald
matseng
Inlägg: 2360
Blev medlem: 16 september 2003, 17:18:13
Ort: Dubai, United Arab Emirates
Kontakt:

Inlägg av matseng »

Ähum?

Nu förstår jag inte riktigt problemet här. Visst kanske det kan vara kul att använda ett vanlig armbandsur som en 1pps referens men det går faktiskt inte åt mer än en handfull rader kod för att implementera en timme-minut-sekund-klocka som är uppdateras från en av dom interna timerserna i en AVR. Väljer men sedan kristallfrekvensen till tillexempel 4.096 Mhz så blir det jätteenkelt.

Hur som helst så måste du iallafall ha med timme-minut-sekund-rutinerna i din armbandsursvariant eftersom du bara får sekund-pulser därifrån.


Onoggranheten blir inte sämre med att använda AVR'ens kristall än den kristall som sitter i en 39 kronors armbandsklocka. Dom bruker inte vara allt för väljusterade i den prisklassen. Du kan justera AVR-kristallen med en trimkonding eller via mjukvara och få minst lika hög eller högre precision med en AVR-only-lösning.

Men om du absolut vill köra med ett armbandsur - har du mätt spänningen på pulsen med spolen inkopplad eller urkopplad?
Harald
Inlägg: 42
Blev medlem: 7 november 2003, 15:50:50
Ort: Östersund

Inlägg av Harald »

Noggrannheten på ett Clasverk för 39:- är ca +/- 1 sek /månad. Att justera in en sådan noggrannhet med en trimkonding på en AVR-krets tar väl en del tid förmodar jag.

Jag har inte använt timme-minut-sekund-rutinerna i AVR-kretsen. Hur ser koden ut för att köra den? I Gadres bok finns endast metoden med extern krets DS1302 behandlad och det är nog några hundra kodrader.

Jag vill göra en timer som gör saker t ex var 3600:e sekund. I och för sig skulle jag kunna mata in värden för sekund-minut-timme-dygn men det är svårt att få plats med allt det indatat eller finns det kluriga lösningar på det också.

Spänningen mätte jag med oscilloskop direkt över den inkopplade spolen.

Ditt svar säger mej att jag kanske ändå ska välja att använda AVR-kretsens interna tidsfunktioner.

Finns det någon bra litteratur med programexempel. Har en AVR 500 och boken av Gadre med byggexempel för AVR-kretsar. I den boken kör man t ex med logisk etta = ej anslutet stift och logisk nolla = anslutet till minus. Normalt brukar ju logisk etta vara + via 1K. Gäller inte det för AVR-kretsar? När jag testade att köra med ”1” = ingenting blev det ju direkt störningar som kretsen uppfattade som att nolla inkommit.

Hälsningar
Harald
matseng
Inlägg: 2360
Blev medlem: 16 september 2003, 17:18:13
Ort: Dubai, United Arab Emirates
Kontakt:

Inlägg av matseng »

Jag tror inte att du kommer upp till något ens i närheten av 1 sekund per månad med en 39 kronors klocka. Jag har en 17000 kronors Omega Constellation och den är specad till typ 30 sekunder om månaden. ;-)


Men åter till programmeringen. Kod i assembler, C eller Basic?
henkebenke
Inlägg: 515
Blev medlem: 31 maj 2003, 10:42:37
Ort: Helsingborg

Inlägg av henkebenke »

Det lär ju garanterat sitta en 32 kHz kristall i Clas-klockan. Tar du och köper dig en lika dan på elfa så lär du få exakt samma nogrannhet. Har du sedan en AVR med stöd för RTC, så kan du ladda ner en appnote med kod för att få en realtidsklocka.
Harald
Inlägg: 42
Blev medlem: 7 november 2003, 15:50:50
Ort: Östersund

Inlägg av Harald »

17000:-? Jag satte i ett batteri, ställde klockan och såg att den saktade sig ca 1 sek/mån... Clas kanske kan konkurera med sina 39:- !

Åter till kodningen. Jag hade tänkt använda AVR-krets ATMEGA16-16PI och koda i assembler.

/Harald
danei
EF Sponsor
Inlägg: 27416
Blev medlem: 2 juni 2003, 14:21:34
Ort: Östergötland
Kontakt:

Inlägg av danei »

Närmare bestämt 32,7680 kHz Det är bara att dividera med 2^15 få får man 1Hz
Art# 74-530-04 hos ELFA
henkebenke
Inlägg: 515
Blev medlem: 31 maj 2003, 10:42:37
Ort: Helsingborg

Inlägg av henkebenke »

Ja, kilo betyder i detta fall 1024. Tack för förtydligandet.
danei
EF Sponsor
Inlägg: 27416
Blev medlem: 2 juni 2003, 14:21:34
Ort: Östergötland
Kontakt:

Inlägg av danei »

Aha det var så du menade :)
Harald
Inlägg: 42
Blev medlem: 7 november 2003, 15:50:50
Ort: Östersund

Inlägg av Harald »

Henkebenke,

Stöder ATMEGA16-16PI RTC och var kan jag ladda ner en appnote med kod för detta?

/Harald
Användarvisningsbild
erixon
Inlägg: 380
Blev medlem: 27 augusti 2003, 10:21:58

Inlägg av erixon »

RTC med AVR...
http://www.atmel.com/dyn/resources/prod ... OC1259.PDF

om du vill använda "hackar fram sekundvisaren" kan du alltigt använda comparatorn som finns inbyggd i AVR:en :)
Harald
Inlägg: 42
Blev medlem: 7 november 2003, 15:50:50
Ort: Östersund

Inlägg av Harald »

Tack erixon! Den metoden är mycket enklare än den med extern RTC-krets. Skulle dock gärna också se matsengs lösning med kristallfrekvens 4096 MHz och en handfull rader assemblerkod.

Tycker ändå att jag saknar någon vettig dokumentation. Var står t ex att stackpekare ska initieras med low(RAMEND) och high(RAMEND) och skickas ut t ex med out SPL,r16. Jag har tydligen missat viktigt något på vägen...

Harald
danei
EF Sponsor
Inlägg: 27416
Blev medlem: 2 juni 2003, 14:21:34
Ort: Östergötland
Kontakt:

Inlägg av danei »

Inte dåligt med en microkontroller på 4GHz :)
Användarvisningsbild
erixon
Inlägg: 380
Blev medlem: 27 augusti 2003, 10:21:58

Inlägg av erixon »

Kod: Markera allt

.include "m16def.inc"

.def	temp	= r16

.org	0x0000
rjmp	rest
.org	0x000C
rjmp	timer1_m	

rest:
  ;sätter upp stack pekaren
  ldi	temp,	low(RAMEND)
  out	SPL,	temp
  ldi	temp,	high(RAMEND)
  out	SPH,	temp
  
  ;nolla
  ldi	temp,	0x00
  out	TCCR1A,	temp

  ;klockan för timmer = cpu klockan / 256 samt enabler nollning av timmer på "compar match"
  ldi	temp,	0x0C
  out	TCCR1B,	temp

  ;enabler interupt på "compar match"
  ldi	temp,	0x10
  out	TIMSK,	temp

  ;sätter jämför registret 4e6/256 = 15625
  ldi	temp,	0x3D
  out	OCR1AH,	temp
  ldi	temp,	0x08 (edit och inte 0x09 efter som man räknar nollan)
  out	OCR1AL,	temp

  ;Enablar interupt
  sei

main:
  ;gör något
  nop
  rjmp main


timer1_m:
	;Interupt 1 gånger i sekunden
	;gör något
	nop
	;hoppar till baka
	reti
Exemplet är gjort för 4Mhz klocka....

Tror du att jag kan få ett exemplar av 4096Mhz AVR :D
Senast redigerad av erixon 28 november 2003, 15:39:37, redigerad totalt 1 gång.
matseng
Inlägg: 2360
Blev medlem: 16 september 2003, 17:18:13
Ort: Dubai, United Arab Emirates
Kontakt:

Inlägg av matseng »

Jo, och interruptrutinen kan man göra typ såhär för att uppdatera sekunder, minuer och timmar:

Kod: Markera allt

timer1_m: 
  ;Interupt 1 gånger i sekunden 
  ; R18 = Seconds
  ; R19 = Minutes
  ; R20 = Hours

  ; Save SREG and R16
  push R16
  in   R16,SREG 
  push R16

  ; Increment second and check if less than 60
  inc  R18
  cpi  R18,60
  brlo RtcDone
  ldi  R18,0

  ; Increment minute and check if less than 60
  inc  R19
  cpi  R19,60 
  brlo RtcDone
  ldi  R19,0

  ; Increment hour and check if less than 24
  inc  R20
  cpi  R20,24
  brlo RtcDone
  ldi  R20,0    [EDIT: Fixade felskrivning på denna rad]

RtcDone:
  ; Restore SREG and R16
  pop  R16
  out  SREG,R16
  pop  R16
  reti
Senast redigerad av matseng 25 november 2003, 21:56:59, redigerad totalt 1 gång.
Skriv svar