Återigen behöver jag hjälp med att felsöka kod

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

Återigen behöver jag hjälp med att felsöka kod

Inlägg av PaNiC »

Min nixie-klocka är som bekant ur funktion. Jag tror inte att det beror på ett hårdvarufel.

Då jag inte är särdeles bra på att programmera behöver jag hjälp med att felsöka denna kod:

Alla operationer med temp2 är bara för att se om koden där körs överhuvudtaget.
RTCn är en DS1302.

Kod: Markera allt

.include "8515def.inc"

.org $0000
	rjmp reset


.def temp=r16
.def rtcdat=r17
.def cnt=r18
.def temp2=r19


.equ rtc = portd
.equ btn = portd
.equ select = 0
.equ plus1 = 1
.equ ok = 2
.equ rst = 7
.equ io = 6
.equ clk = 5
.equ iopin = pind6

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

	rjmp main
	
;initiera interrupts
;	ldi temp, 0b00000010
;	out timsk, temp
;	sei

;initiera timer0
;	ldi temp, 0b00000010
;	out tccr0, temp
	
;Sätt1
	;ldi rtcdat, 0b10000000
	;sbi PORTD, PIND7
	;rcall txrtc
	;ldi rtcdat, 0x00
	;rcall txrtc
	;cbi PORTD, PIND7

;Sätt2
	;sbi PORTD, PIND7
	;ldi rtcdat, 0b10001000
	;rcall txrtc
	;ldi rtcdat, 0x10
	;rcall txrtc
	;cbi PORTD, PIND7

	;sei
	

main:
	;ldi temp2, 0x33
	;out portb, temp2
	;ldi temp, 0x86
	;out porta, temp
	;out portb, temp
	;out portc, temp
	;sbis PIND, 0
	;rjmp sethr
	rcall sweep
	ldi temp2, 0x99
	out portb, temp2
	rcall main


Sweep:

	ldi rtcdat, 0b10000001
	rcall txrtc
	nop
	nop
	rcall rxrtc
	out porta, rtcdat
	

	
	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 
		sbi ddrd, 6
		sbi rtc, rst	   ; set RST
txbck:  ror rtcdat         ; rotate data right through carry
        cbi rtc, clk	   ; clear SCLK
        brcc txnxt         ; if carry set
		ldi temp2, 0x44
		out portc, temp2
        sbi rtc, io		   ;    set I/O
        rjmp txnxt1        ; else
txnxt:  cbi rtc, io        ;    clear I/O
txnxt1: sbi rtc, io		   ; set SCLK
        dec cnt            ; decrement counter
        brne txbck         ; if counter not zero, go back
        nop
        cbi rtc, io		   ; clear SCLK
		;cbi rtc, rst	   ; clr rst
        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
		cbi ddrd, 6
        clr rtcdat
rxbck:  sbi rtc, clk 	        ; set SCLK
        sbic rtc, pind6 	        ; if I/O set then
        sec                     ;        set carry
        sbis rtc, pind6	        ; else 
		clc                     ;       clear carry
        ror rtcdat
        cbi rtc, clk	        ; clear SCLK
        dec cnt                 ; decrement counter
        brne rxbck              ; if counter equals zero, goto calling function
		cbi rtc, rst
        ret                     ;    else jump back
Användarvisningsbild
PaNiC
Inlägg: 2610
Blev medlem: 15 augusti 2003, 22:16:15
Ort: Skånelandet

Inlägg av PaNiC »

Har pillat runt med allt möjligt nu men får det inte att fungera. Oavsett vad så får uCn 255 tillbaka från RTCn.

Detta förbryllar mig:
Bild
Det ska föreställa IO-pinnen på RTCn.
Varför har vågorna blivit så böjda? De hinner dessutom inte upp till 5V innan de ska ner igen.
Användarvisningsbild
Icecap
Inlägg: 26647
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Kanske det fattas en pull-up?

Signalen verkar ha svårt att dra + så jag hade testat med en pull-up om ca: 2K2-4K7 och sen kollat noga med oscillo:n.

Du kanske ska göra en liten delay mellan kommandon och svaren så det blir enklare att se signalen.
Användarvisningsbild
PaNiC
Inlägg: 2610
Blev medlem: 15 augusti 2003, 22:16:15
Ort: Skånelandet

Inlägg av PaNiC »

Missade att berätta att vågformerna blev missbildade nu under tiden jag har suttit och pillat med den. Jag har inte ändrat något i hårdvaran. Skulle vara om något har spontandött. Men jag kan inte förstå vad isf.

Edit: Nu blev det tvärt om:
Bild
Användarvisningsbild
Icecap
Inlägg: 26647
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Du verkar ha 2 portpinnar som båda står som output och kämpar mot varandra, alternativt har 2 input utan pull up/down där den ena porten blir output lite då och då.
Användarvisningsbild
$tiff
Inlägg: 4941
Blev medlem: 31 maj 2003, 19:47:52
Ort: Göteborg
Kontakt:

Inlägg av $tiff »

Är det inte mycket bättre att jobba med AVRens portar som open collector-pinnar i ett bussystem? Utför I/O-operationerna på ddrd-registret istället för portd-registret, så kan du omöjligt få en kollission som du verkar fått här. Detta gäller bara datapinnen, klockan har ju alltid mastern makten över.

Liknande projekt
Användarvisningsbild
PaNiC
Inlägg: 2610
Blev medlem: 15 augusti 2003, 22:16:15
Ort: Skånelandet

Inlägg av PaNiC »

Icecap: Måste jag inte ha kortslutning någonstans för att de ska kunna stå och kämpa mot varandra?
Noterade en annan konstig sak när jag mätte för säkerhets skull. Mellan Pin5 och 8 på RTCn är det en resistans som pendlar mellan 2 och 200 Ohm. Pin 5 är /RST och pin 8 är för batteribackup. Vet inte om det ska vara så kanske med tanke på batteriladdningsfunktionen. Resistansen både sjunker och ökar sakta.

$tiff: Det förstår jag inte. DDRD är väl bara för att sätta om porten ska vara in eller ut?
Hur skulle jag skriva koden då?
Användarvisningsbild
$tiff
Inlägg: 4941
Blev medlem: 31 maj 2003, 19:47:52
Ort: Göteborg
Kontakt:

Inlägg av $tiff »

Jag menade att eftersom du har pullup på datasignalen behöver du bara dra datalinjen låg när du ska signalera en nolla, annars låter du I/O på µC vara input, vilket resulterar i en hög signal. Så här undviker du att två chip försöker lägga olika signaler på bussen samtidigt.
Märkligt nog är det inte så folk gör i de exempel jag läst hittill.s :humm:

Det ser ut som att din RTC försöker lägga data på bussen samtidigt som µC försöker hålla den i ett annat läge. Kortslutning skulle man väl kunna kalla det. Har det varit så länge så kan någon av dem tagit skada.
Vilket förlopp är det du spelat in? Är det när µC skickar data eller när RTC ska svara?
Användarvisningsbild
PaNiC
Inlägg: 2610
Blev medlem: 15 augusti 2003, 22:16:15
Ort: Skånelandet

Inlägg av PaNiC »

Jaha då förstår jag.
Men jag förstår inte varför RTCn skulle lägga data när uC signalerar.

Har testat lite andra saker nu. Kommenterar jag bort "rcall txrtc" i sweep-funktionen så händer ingenting på IO-pinnen. Kommenterar jag bort rxrtc så får jag rätt form på kurvorna, men fel data.

Har ändrat lite i koden.

Kod: Markera allt

.include "8515def.inc"

.org $0000
	rjmp reset


.def temp=r16
.def rtcdat=r17
.def cnt=r18
.def temp2=r19


.equ rtc = portd
.equ btn = portd
.equ select = 0
.equ plus1 = 1
.equ ok = 2
.equ rst = 7
.equ io = 6
.equ clk = 5
.equ iopin = pind6

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

	rjmp main
	

;Sätt1
	;ldi rtcdat, 0b10000000
	;sbi PORTD, PIND7
	;rcall txrtc
	;ldi rtcdat, 0b00000000
	;rcall txrtc
	;cbi PORTD, PIND7

;Sätt2
	;sbi PORTD, PIND7
	;ldi rtcdat, 0b10001000
	;rcall txrtc
	;ldi rtcdat, 0x10
	;rcall txrtc
	;cbi PORTD, PIND7

	;sei
	

main:

	rcall sweep
	ldi temp2, 0x99
	out portb, temp2
	rjmp main


sweep:

	ldi rtcdat, 0b10000001
	
	sbi rtc, rst
	rcall txrtc
	nop
	nop
	rcall rxrtc
	cbi rtc, rst
	nop
	
	out portc, rtcdat
	out porta, rtcdat
	

	
	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 
		sbi ddrd, 6
txbck:  ror rtcdat         ; rotate data right through carry
        cbi rtc, clk	   ; clear SCLK
        brcc txnxt         ; if carry set
        sbi rtc, io		   ;    set I/O
        rjmp txnxt1        ; else
txnxt:  cbi rtc, io		   ;    clear I/O
txnxt1: sbi rtc, clk	   ; set SCLK
        dec cnt            ; decrement counter
        brne txbck         ; if counter not zero, go back
        nop
        cbi rtc, clk	   ; clear SCLK
		clc
        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
		cbi ddrd, 6
        ldi rtcdat,0
rxbck:  clc	
		sbi rtc, clk	        ; set SCLK
		sbic PIND,io    	    ; if I/O set then
        sec                     ;        set carry
        sbis PIND,io	        ; else 
        clc                     ;       clear carry
        ror rtcdat
        cbi rtc, clk            ; clear SCLK
        dec cnt                 ; decrement counter
        brne rxbck              ; if counter equals zero, goto calling function
        clc
		cbi rtc, rst
		ret                     ;    else jump back
Vet faktiskt inte vilket förlopp det är på bilderna. Det borde vara båda. Men allt är så konstigt och rörigt nu så jag begriper inte ett skvatt.
Användarvisningsbild
Hedis
Inlägg: 2493
Blev medlem: 8 december 2003, 15:10:44
Ort: Vänersborg
Kontakt:

Inlägg av Hedis »

Du har knyckt rutinerna för att prata med RTC´n va?
Det är inte så tyket så dom använder ngt register/port som du har som ngt annat?
Så dom liksom kolliderar med varandra. Vet att jag fick ett sådant oförklarligt fenomen när jag snodde en subrutin utan att
kolla ordentligt då den helt plötsligt använda r16 för att spara data, r16 specade jag som temp. :) Det var inte mycket som stämde då....

Har inte kollat så noga på koden, men ser att du sätter båda dom här till portd.

Kod: Markera allt

 .equ rtc = portd
.equ btn = portd 
Användarvisningsbild
PaNiC
Inlägg: 2610
Blev medlem: 15 augusti 2003, 22:16:15
Ort: Skånelandet

Inlägg av PaNiC »

Ja, jag har knyckt koden från "Programming and customizing the AVR microcontroller" av Dhananjay V. Gadre. Mycket bra bok.
Tyvärr är det inte så enkelt :(.
Bra att du såg det. Btn ska egentligen vara pind.
Användarvisningsbild
PaNiC
Inlägg: 2610
Blev medlem: 15 augusti 2003, 22:16:15
Ort: Skånelandet

Inlägg av PaNiC »

Nu har jag mätt lite grann.
Mellan CLK och + på backupbatteriet finns det något som liknar en kapacitans. Denna laddas upp när spänningen slås på till klockan och laddas ur genom multimetern när jag mäter den. Den fastnar på ca 3v, en nivå som får MCUn att registrera etta. Jag förstår inte var i helvete denna kommer ifrån.. Antagligen sitter det en lödprick mellan två ben eller banor.

Har någon någon annan idé?
Skriv svar