AVR och DS1302, tappar en bit?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
PaNiC
Inlägg: 2565
Blev medlem: 15 augusti 2003, 22:16:15
Ort: Skånelandet

AVR och DS1302, tappar en bit?

Inlägg av PaNiC »

Programmering har aldrig varit min starka sida, så jag är helt euforisk över att jag överhuvudtaget lyckas kommunicera med RTCn. Även med färdig kod för just det. Koden är snodd från boken Programming and customizing the AVR microcontroller av Dhananjay V. Gadre. En synnerligen bra bok för övrigt som alla AVR-medpysslare borde ha.

Problemet yttrar sig som så att jag bara får udda siffror i minuter och sekunder. Tiosekunder går bra. Tiominuter går inte så bra. Timmar hag jag inte kollat än (vafan, det tar ju en timme! :P). I mina öron låter det som att en bit på ett eller annat vis faller bort.

Här är hela koden till min Nixie-klocka. Har inga direkta förbehållningar men om nu använder den eller delar av den vill jag gärna veta det. Om inte annat så för skojs skull :).

Kod: Markera allt

.include "8515def.inc"

.org $0000
	rjmp reset
.org ovf0ADDR
	rjmp sweep

.def temp=r16
.def rtcdat=r17
.def cnt=r18
.def tim1=r19
.def tim2=r20

;initiera stackpekaren
	ldi temp, HIGH(RAMEND)
	out SPH, temp
	ldi temp, LOW(RAMEND)
	out SPL, temp


reset:
;initiera stackpekaren
	ldi temp, HIGH(RAMEND)
	out SPH, temp
	ldi temp, LOW(RAMEND)
	out SPL, temp


;Sätt upp portar
	ser temp
	out ddra, temp
	out ddrb, temp
	out ddrc, temp
	ldi temp, 0b11111000
	out ddrd, temp
	
;initiera interrupts
	ldi temp, 0b00000010
	out timsk, temp
;	sei

;initiera timer0
	ldi temp, 0b00000010
	out tccr0, temp
	
;Sätt igång RTC
	;ldi rtcdat, 0b10000000
	;sbi PORTD, PIND7
	;rcall txrtc
	;ldi rtcdat, 0b00000000
	;rcall txrtc
	;cbi PORTD, PIND7

	;sei
	
	
main:
	
	;sbis PIND, 0
	;rjmp settime
	rcall sweep
	rjmp main


Sweep:
	clr tim1
	clr tim2
	sbi ddrd, 6
	ldi rtcdat, 0b10000001
	sbi PORTD, PIND7
	rcall txrtc
	cbi ddrd, 6
	;rcall delay
	clr rtcdat
	rcall rxrtc
	cbi PORTD, PIND7
	out porta, rtcdat
	sbi PORTD, PIND7
	sbi ddrd, 6
	ldi rtcdat, 0b10000011
	;rcall delay
	rcall txrtc
	cbi ddrd, 6
	;rcall delay
	clr rtcdat
	rcall rxrtc
	cbi PORTD, PIND7
	out portb, rtcdat
	sbi PORTD, PIND7
	sbi ddrd, 6
	ldi rtcdat, 0b10000101
	;rcall delay
	rcall txrtc
	cbi ddrd, 6
	;rcall delay
	clr rtcdat
	rcall rxrtc
	;rcall delay
	cbi PORTD, PIND7
	out portc, rtcdat
	

	ret
	


inccnt:
	push temp
	in temp, sreg
	push temp
	inc tim1
	cpi tim1, 90
	brne return
	clr tim1
	inc tim2
	cpi tim2, 10
	brne return
	rcall sweep
	rjmp return



return:
	pop temp
	out sreg, temp
	pop temp
	reti

settime:

	rjmp settime

Delay:
	dec temp
	brne delay
	ret



;****************************************************************************
;'txrtc'
;Aim
;       Function to write a byte to rtc. Value to be written is passed from 
;       calling function in register rtcdat.    
;Registers used
;       cnt     to store no of bits
;       rtcdat  to store the data 
;Functions called
;       none       
;*****************************************************************************

txrtc:  ldi cnt, $08       ; load counter 
txbck:  ror rtcdat         ; rotate data right through carry
        cbi PORTD,PIND5    ; clear SCLK
        brcc txnxt         ; if carry set
        sbi PORTD,PIND6    ;    set I/O
        rjmp txnxt1        ; else
txnxt:  cbi PORTD,PIND6    ;    clear I/O
txnxt1: sbi PORTD,PIND5    ; set SCLK
        dec cnt            ; decrement counter
        brne txbck         ; if counter not zero, go back
        nop
        cbi PORTD,PIND5    ; clear SCLK
        ret



;******************************************************************************
;'rxrtc'
;Aim
;       Function to read a byte from rtc. Value read is returned in register 
;       rtcdat      
;Registers used
;       cnt     to store no of bits
;       rtcdat  to store the data read
;Functions called
;       none
;*****************************************************************************

rxrtc:  ldi cnt,$08             ; load counter
        ldi rtcdat,0
rxbck:  sbi PORTD,PIND5         ; set SCLK
        sbic PIND,PIND6         ; if I/O set then
        sec                     ;        set carry
        sbis PIND,PINB6         ; else 
        clc                     ;       clear carry
        ror rtcdat
        cbi PORTD,PIND5         ; clear SCLK
        dec cnt                 ; decrement counter
        brne rxbck              ; if counter equals zero, goto calling function
        ret                     ;    else jump back

Edit: Nej jag använder inte interrupts just nu. Skulle se hur det fungerar att fråga RTCn hela tiden om uppdateringar.
Användarvisningsbild
PaNiC
Inlägg: 2565
Blev medlem: 15 augusti 2003, 22:16:15
Ort: Skånelandet

Inlägg av PaNiC »

Och nu har jag löst det i ett tillfälle av tillfällig snilledom (säger man så?).

En bit föll visst bort. Detta löstes genom att köra "clc" innan varje läsning.

Ja ni kan få titta på koden ändå. Och tråden kanske gör någon nytta i framtiden.
Användarvisningsbild
EagleSpirit
Inlägg: 1288
Blev medlem: 27 maj 2003, 23:15:48
Ort: Västerås
Kontakt:

Inlägg av EagleSpirit »

men tiden går helt rätt som den ska? jag har inte orkat kolla så mycket på min klocka men den går ju fortfarande fel genom att öka var 10:e sekund

är det någon bra backupfunktion på den där kretsen? har du testat den?
Användarvisningsbild
PaNiC
Inlägg: 2565
Blev medlem: 15 augusti 2003, 22:16:15
Ort: Skånelandet

Inlägg av PaNiC »

Jag har inte gjort någon längre mätning. Men den går ungefär rätt. Eventuellt lite fort. Har ju läst om DS1302s kräsenhet med kristaller.

Backupfunktion? Batteribackup menar du? Ja den är klockren (:roll:). Finns inbyggd batteriladdare också. Testar just nu batteribackupen lite längre. Gjorde ett kortare test (någon minut) för ett tag sedan och det klarar den.

En annan kul detalj är att där är 31 byte minne som man kan använda som man vill i RTCn.
Användarvisningsbild
EagleSpirit
Inlägg: 1288
Blev medlem: 27 maj 2003, 23:15:48
Ort: Västerås
Kontakt:

Inlägg av EagleSpirit »

ok, då verkar ju skillnaden mellan 1302 och 1305 vara minimal, kanske minnesstorleken eller nåt.. jag tror 1305 har 96 byte nämligen...

så fort jag får tag på flussmedel ska jag testa mina grejjer igen
Användarvisningsbild
ante
Inlägg: 107
Blev medlem: 21 juni 2003, 17:48:56

Inlägg av ante »

Användarvisningsbild
$tiff
Inlägg: 4941
Blev medlem: 31 maj 2003, 19:47:52
Ort: Göteborg
Kontakt:

Inlägg av $tiff »

en nackdel med självkompenserande oscillatorkretsar är ju att de slukar massor av ström jämfört med en RTC, om man tänkt köra batteridrift under längre tid.
Skriv svar