Błąd w programie ciekawego układu


Mam ciekawy układ woltomierza amperomierza 50V/5A, ale ma jeden feler - poprawnie mierzy do połowy zakresu, a później głupieje. Autor programu nie chce już nim się zajmować - tzn. poprawiać program /twierdzi że problem jest w programie/ ale udostępnił mi kod źródłowy. Tutaj drugi feler - nie znam się na programowaniu.

Teraz prośba-pytanie: czy ktoś zechciał by popatrzeć na program, może znajdzie błąd który powoduje ta anomalię.

Układ jest "zgrabny" o niewielkich wymiarach na Atmega8 i 2 wyświetlaczach LED x 4 cyfry. Oczywiście o ile się uda "naprawić" program udostępnię całą dokumentację.




Portret użytkownika mirley

Re: Program

ZAmieść program i schematy to się na to zerknie.... bez programu nikt nie będzie wstanie go poprawić. Pliki zamieść gdzieś w internecie i podaj linki, tak samo kody źródłowe, chyba że są niewielkie.

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika Mietek

program

Program:

;##### HEADERS #####
.NOLIST
.INCLUDE "m8def.inc"
.LIST
;===================
 
 
;##### CONSTANTS #####
.EQU FREQ = 1	;system frequency [MHz]
 
.EQU D_DISP = DDRB
.EQU DISP = PORTB
.EQU D_SEG = DDRD
.EQU SEG = PORTD
 
.EQU W1A = 0
.EQU W1B = 5
.EQU W1C = 4
.EQU W1D = 3
.EQU W2A = 2
.EQU W2B = 1
.EQU W2C = 6
.EQU W2D = 7
 
.EQU A = 6
.EQU B = 3
.EQU C = 1
.EQU D = 4
.EQU E = 5
.EQU F = 7
.EQU G = 2
.EQU DP = 0
;=====================
 
 
;##### GPWR DEF #####
.DEF AL = R16	;8 general purpose accumulators
.DEF AH = R17
.DEF BL = R18
.DEF BH = R19
.DEF CL = R20
.DEF CH = R21
.DEF DL = R22
.DEF DH = R23
 
.DEF TH = R4	;temporary processed result
.DEF HU = R5	;thousands [TH], hundreds [HU], tens [TE] & ones [ON]
.DEF TE = R6
.DEF ON = R7
;====================
 
 
;##### MACRO DEF #####
.MACRO ldiw		;load immediate word into AH:AL
	ldi AH, high(@0)
	ldi AL, low(@0)
.ENDM
 
.MACRO ldix		;load address into XH:XL
	ldi XH, high(@0)
	ldi XL, low(@0)
.ENDM
 
.MACRO ldiz		;load address into ZH:ZL
	ldi ZH, high(@0)
	ldi ZL, low(@0)
.ENDM
 
.MACRO outw		;store word to the designated I/O space
	out @0, AH
	out @1, AL
.ENDM
 
.MACRO ldsw		;load word from designated SRAM space
	lds AH, @0
	lds AL, @0+1
.ENDM
 
.MACRO stsw		;store word to the designated SRAM space
	sts @0, AH
	sts @0+1, AL
.ENDM
 
.MACRO delay	;loading parameters for delay sub (time[ms], multiplier)
	ldi R16, @0
	ldi R17, @1
	rcall Wait_ms
.ENDM
;=====================
 
 
;##### SRAM DATA SEGMENT #####
.DSEG
.ORG SRAM_START
 
VoltageResult:	.BYTE 4		;results for display
CurrentResult:	.BYTE 4
 
Samples:		.BYTE 2		;oversampled samples
Result:			.BYTE 3		;averaged oversampled samples
 
SampleCounter:	.BYTE 1		;for counting number of samlples to processing
AvgCounter:		.BYTE 1		;for counting number od processed samples
 
MuxCounter:		.BYTE 1		;mulitplexed display counter
ADCchannel:		.BYTE 1		;number of active ADC channel
;=============================
 
 
;##### EEPROM DATA SEGMENT #####
.ESEG
;===============================
 
;//-> code segment start <-//
.CSEG
 
;##### INTERRUPT VECTORS #####
.ORG 0			rjmp Boot
.ORG INT0addr	reti
.ORG INT1addr	reti
.ORG OC2addr	reti
.ORG OVF2addr	reti
.ORG ICP1addr	reti
.ORG OC1Aaddr	reti
.ORG OC1Baddr	reti
.ORG OVF1addr	reti
.ORG OVF0addr	rjmp Display_mux
.ORG SPIaddr	reti
.ORG URXCaddr	reti
.ORG UDREaddr	reti
.ORG UTXCaddr	reti
.ORG ADCCaddr	rjmp Conversion_complete
.ORG ERDYaddr	reti
.ORG ACIaddr	reti
.ORG TWIaddr	reti
.ORG SPMRaddr	reti
;=============================
 
 
;##### BOOTSECTOR #####
Boot:
	cli		;disable all interrupts
 
	ldiw RAMEND		;load stack pointer
	outw SPH, SPL
 
	ldix SRAM_START		;RAM clearing procedure
	ldiw RAMEND+1
	clr BL		;initial value for each RAM cell
RAM_clear:
	st X+, BL
	cp AL, XL
	cpc AH, XH
	brne RAM_clear
 
	ser AL		;I/O ports direction and state
	out D_DISP, AL
	out D_SEG, AL
	out DISP, AL
	out SEG, AL
	clr AL
	out DDRC, AL
	ldi AL, 0x3C
	out PORTC, AL
 
	sbi ACSR, ACD	;switch off Analog Comparator (4 save more power)
 
	ldi AL, (1<<CS01)|(1<<CS00)		;Timer/Counter0 configuration
	out TCCR0, AL					;Timer, prescaler=64
	ldi AL, 231
	out TCNT0, AL
 
	ldi AL, (1<<TOIE0)	;enable Timers interrupts
	out TIMSK, AL
 
	clr AL			;Vref=AREF, ADLAR=0, initial input=ADC0
	out ADMUX, AL
	ldi AL, (1<<ADEN)|(1<<ADFR)|(1<<ADIE)|(1<<ADPS2)
	out ADCSRA, AL	;ADC=on, free running mode, int.enable, fadc=f/16
	sbi ADCSRA, ADSC	;start conversion
 
	sei		;enable all interrupts
;======================
 
 
;##### MAIN LOOP #####
Main_0:
 
	rjmp Main_0
;=====================
 
 
;##### INTERRUPTS #####
;multiplexet for LED display, refresh freq ~ 80Hz
Display_mux:
	push AL		;push needed registers on stack
	in AL, SREG
	push AL
	push AH
	push BL
	push BH
	push CL
	push CH
	push YL
	push YH
	push ZL
	push ZH
 
		ldi AL, 231		;cut the Timer counting cycle
		out TCNT0, AL	;255-231=24, 24*64*(1/FREQ)=~651Hz (8*~81Hz)
 
		ldi ZH, high(Display<<1)
		ldi ZL, low(Display<<1)
		lds AL, MuxCounter
		clr CH
		add ZL, AL
		adc ZH, CH
		lpm AH, Z 
 
			ldi ZH, high(Digits<<1)
			ldi ZL, low(Digits<<1)
 
			cpi AL, 4
			brsh VoltageDisp
				ldi YH, high(VoltageResult)
				ldi YL, low(VoltageResult)
		VoltageDisp:
 
			cpi AL, 4
			brlo CurrentDisp
				ldi YH, high(CurrentResult)
				ldi YL, low(CurrentResult)
				sbiw YH:YL, 4
		CurrentDisp:
 
				add YL, AL
				adc YH, CH
				ld BL, Y
				add ZL, BL
				adc ZH, CH
				lpm BL, Z
 
			out DISP, AH
			out SEG, BL
 
		inc AL
		cpi AL, 8
		brlo SkipMuxClearing
		clr AL
	SkipMuxClearing:
		sts MuxCounter, AL
 
	pop ZH
	pop ZL
	pop YH
	pop YL
	pop CH
	pop CL
	pop BH
	pop BL
	pop AH		;pop used registers from stack
	pop AL
	out SREG, AL
	pop AL
	reti
 
;end of ADC conversion, result is ready to processing
Conversion_complete:
push R0
push R1
push AL
in AL, SREG
push AL
push AH
push BL
push BH
push CL
push CH
push DL
push DH
 
		;gathering samples
		in BL, ADCL		;read measurement value
		in BH, ADCH
		ldsw Samples	;read previous result of adding samples
		add AL, BL
		adc AH, BH
		stsw Samples	;store added result
		lds CL, SampleCounter
		inc CL
		cpi CL, 64
		brsh Next_process_1
		sts SampleCounter, CL
		rjmp End_of_processing
	Next_process_1:
		clr CL
		sts SampleCounter, CL
		sts (Samples+0), CL
		sts (Samples+1), CL
 
		;sample division by 8 (2^3)
		lsr AH
		ror AL
		lsr AH
		ror AL
		lsr AH
		ror AL
 
			;averaging oversampled samples
			clr CH
			lds CL, (Result+0)
			lds BH, (Result+1)
			lds BL, (Result+2)
			add BL, AL
			adc BH, AH
			adc CL, CH
			sts (Result+0), CL
			sts (Result+1), BH
			sts (Result+2), BL
			lds DL, AvgCounter
			inc DL
			cpi DL, 64
			brsh Next_process_2
			sts AvgCounter, DL
			rjmp End_of_processing
		Next_process_2:
			clr DL
			sts AvgCounter, DL
 
			;sum division by 64 - average value as result
			lsr CL
			ror BH
			ror BL
			lsr CL
			ror BH
			ror BL
			lsr CL
			ror BH
			ror BL
			lsr CL
			ror BH
			ror BL
			lsr CL
			ror BH
			ror BL
			lsr CL
			ror BH
			ror BL
 
				;fractional multiplication by 0.625 (10/16)
				movw DH:DL, BH:BL
				ldi CH, high(q15(0.625))
				ldi CL, low(q15(0.625))
				rcall fmuls16x16_32
				sts (Result+1), BH
				sts (Result+2), BL
 
				rcall BinToDec
 
				clr AL
				sts (Result+0), AL
				sts (Result+1), AL
				sts (Result+2), AL
 
				;ADC channel change and storing result to SRAM
				lds AL, ADCchannel
				cpi AL, 0
				breq ADC_ch0
				cpi AL, 1
				breq ADC_ch1
				rjmp End_of_processing
 
					ADC_ch0:
						sts (VoltageResult+0), R4	;store v result to SRAM
						sts (VoltageResult+1), R5
						sts (VoltageResult+2), R6
						sts (VoltageResult+3), R7
 
						sbi ADMUX, MUX0		;change ADC channel to ADC1
						sbi ADCSRA, ADIF	;clear interrupt flag
						ldi AL, 1		;change number of active channel
						sts ADCchannel, AL
 
						rjmp End_of_processing
 
					ADC_ch1:
						sts (CurrentResult+0), R4	;store v result to SRAM
						sts (CurrentResult+1), R5
						sts (CurrentResult+2), R6
						sts (CurrentResult+3), R7
 
						cbi ADMUX, MUX0		;change ADC channel to ADC1
						sbi ADCSRA, ADIF	;clear interrupt flag
						ldi AL, 0		;change number of active channel
						sts ADCchannel, AL
 
	End_of_processing:
pop DH
pop DL
pop CH
pop CL
pop BH
pop BL
pop AH
pop AL
out SREG, AL
pop AL
pop R1
pop R0
	reti
;======================
 
 
;##### SUBROUTINES #####
;binary to decimal value conversion
BinToDec:
		lds AH, (Result+1)		;load into AH:AL processed result
		lds AL, (Result+2)		
 
		;[THOUSAND]
		clr CL		;clear counter
		ldi BH, high(1000)
		ldi BL, low(1000)
	Thousand:		
		inc CL		;increment thousand counter
		sub AL, BL		;subtract thousand until below zero
		sbc AH, BH
		brge Thousand
		dec CL		;decrement extra incremented thousand
		add AL, BL	;add the extra subtracted thousand
		adc AH, BH
		mov TH, CL	;store number of thousands in TH
 
		;[HUNDRED]
		clr CL		;clear counter
		mov BH, CL
		ldi BL, 100
	Hundred:		
		inc CL		;increment hundreds counter
		sub AL, BL		;subtract hundred until below zero
		sbc AH, BH
		brge Hundred
		dec CL		;decrement extra incremented hundreds
		add AL, BL	;add the extra subtracted hundreds
		adc AH, BH
		mov HU, CL	;store number of hundreds in HU
 
		;[TEN]
		clr CL		;clear counter
		;ldi BL, 10
	Ten:		
		inc CL		;increment tens counter	
		subi AL, 10	;subtract ten until below zero
		brge Ten
		dec CL		;decrement extra incremented tens
		subi AL, -10	;add the extra subtracted tens
		mov TE, CL	;store number of tens in TE
 
		;[ONE]
		clr CL		;clear counter
	One:		
		inc CL		;increment ones counter	
		subi AL, 1	;subtract one until below zero
		brge One
		dec CL		;decrement extra incremented ones
		mov ON, CL	;store number of ones in ON
 
	ret
 
fmuls16x16_32:
	clr	r2
	fmuls	r23, r21		; ( (signed)ah * (signed)bh ) << 1
	movw	r19:r18, r1:r0
	fmul	r22, r20		; ( al * bl ) << 1
	adc	r18, r2
	movw	r17:r16, r1:r0
	fmulsu	r23, r20		; ( (signed)ah * bl ) << 1
	sbc	r19, r2
	add	r17, r0
	adc	r18, r1
	adc	r19, r2
	fmulsu	r21, r22		; ( (signed)bh * al ) << 1
	sbc	r19, r2
	add	r17, r0
	adc	r18, r1
	adc	r19, r2
	ret
;=======================
 
 
;##### DATA TABLES #####
Digits:
.DB 0x05, 0xF5, 0x83, 0xA1, 0x71, 0x29, 0x09, 0xB5, 0x01, 0x21
 
Display:
.DB 0xFE, 0xDF, 0xEF, 0xF7, 0xFB, 0xFD, 0xBF, 0x7F
;=======================

Portret użytkownika mirley

Re; Program

Program w asemblerze.... hm:) no to będzie problem

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.