Noggranna sekunder i stället för RTC...
Noggranna sekunder i stället för RTC...
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
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
-
- Inlägg: 2360
- Blev medlem: 16 september 2003, 17:18:13
- Ort: Dubai, United Arab Emirates
- Kontakt:
Ä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?
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?
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
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
-
- Inlägg: 515
- Blev medlem: 31 maj 2003, 10:42:37
- Ort: Helsingborg
-
- Inlägg: 515
- Blev medlem: 31 maj 2003, 10:42:37
- Ort: Helsingborg
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
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

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
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
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
Tror du att jag kan få ett exemplar av 4096Mhz AVR

Senast redigerad av erixon 28 november 2003, 15:39:37, redigerad totalt 1 gång.
-
- Inlägg: 2360
- Blev medlem: 16 september 2003, 17:18:13
- Ort: Dubai, United Arab Emirates
- Kontakt:
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.