logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[ATmega8][asembler]AVT2857 - przerobienie kodu.

polprzewodnikowy 14 Sty 2010 21:21 3472 11
REKLAMA
  • #1 7536633
    polprzewodnikowy
    Poziom 26  
    Witam, chciałbym zastosować ten miernik ale napotkałem pewne problemy. Otóż chcę przerobić ten kit aby mierzył natężenie do 20A. Z tego co się dowiedziałem należy dodać równolegle jeszcze 2 takie same rezystory. Ale tu już zaczynają się schody, zmieni się rezystancja i trzeba będzie przerabiać program aby właściwie obliczał natężenie. Kod źródłowy znajduje się tu: http://www.edw.com.pl/ftp_05/200803avt2857.zip
    Proszę o to aby przynajmniej podać gdzie znajduje się właściwa linia kodu gdzie odbywa się przeliczenie, resztę postaram się zrobić sam. Z góry dziękuję za odpowiedzi.
  • REKLAMA
  • #2 7536933
    kamyczek
    Poziom 38  
    Program ma komentarze jak poczytasz i pomyślisz to sie czegoś przy okazji nauczysz , nie bądź leniem daj coś z siebie ...
  • REKLAMA
  • #3 7539088
    polprzewodnikowy
    Poziom 26  
    Niestety ale nie potrafię odnaleźć funkcji która za to odpowiada, w dodatku w komentarzach nie ma nic bezpośrednio związanego z obliczaniem natężenia.
  • Pomocny post
    #4 7540398
    ZbeeGin
    Poziom 39  
    Wszystko jest tak zrobione by natężenia nie przeliczać. Zmianę zakresu uzyskałbyś bardzo prosto zmieniając wzmocnienie LM358. Oczywiście odbędzie się to kosztem rozdzielczości.

    A tak przy okazji. W plikach źródłowych jest adres e-mail autora projektu. Użyj go!
  • REKLAMA
  • #5 7608136
    polprzewodnikowy
    Poziom 26  
    Ponawiam prośbę o pomoc w przerobieniu kodu w tym kicie, niestety ale autor programu nie odpisuje na e-malia. Powtarzam że asembler jest dla mnie niezrozumiały.
  • REKLAMA
  • Pomocny post
    #6 7629992
    asembler
    Poziom 32  
    Musisz znalasc fragmen programu w ktorym jest odczytywany prąd i pomnozyc razy 2. Który to kanał mierzy prąd ? Tylko dlaczego 2 takie same rezystory dokładac? wedlug mnie to wystarczy dołozyc jeden taki sam rezystor napiecie odkladane spadnie o połowe a jak podniesiesz prąd o połowe to napiecie dojdzie do swojej nominalnej wartosci i nie przekroczy zakresu przetwornika AC.
  • #8 7630197
    asembler
    Poziom 32  
    Nie analizowalem schematu elektrycznego jak juz zrobisz z tymi opornikami to w/g mnie wystarczy wymazac dwie linie z programu z opisem dzielenie przez 2 ze wzgledu na wzmacniacz i powinni dzialac. Oczywiscie musisz sprawdzic w ukladzie.
  • #9 7630203
    polprzewodnikowy
    Poziom 26  
    A więc w tym fragmencie kodu usuwam 2 linie odpowiedzialne za dzielenie przez 2, ale czy to nie zmieni innych wyników? W kodzie zaznaczyłem które linie chcę usunąć.

    adc_conversion:
    		
    		rcall channel_0	;włšcz kanał 0
    		clr zh
    		ldi zl,adr0
    	channel_set:
    		clr licz
    		clr bin_bl
    		clr bin_bh
    	adc_loop:
    		push licz
    		push bin_bl
    		push bin_bh
    		clr licz
    		clr bin_bl
    		clr bin_bh
    		clr bin_al
    		clr bin_ah
    	adc_sum_loop:
    		clr temp
    		out adch,temp
    		out adcl,temp
    		sbi adcsr,adsc
    	adc_pending:
    		sbic adcsr,adsc	;czekaj na zakończenie przetwarzania
    		rjmp adc_pending
    		in bin_al,adcl		;zachowaj odczytanš wartoœć
    		in bin_ah,adch
    
    		
    		add bin_bl,bin_al
    		adc bin_bh,bin_ah
    		inc licz
    		cpi licz,4		;sumuj 4 kolejne próbki z adc
    		brne adc_sum_loop
    		lsr bin_bh		;podziel sumę przez 2  ---- TO TRZEBA USUNĄĆ?
    		ror bin_bl          ;                  ---- TO TEŻ?
    		mov bin_al,bin_bl
    		mov bin_ah,bin_bh
    	adc_end:
    		pop bin_bh		 
    		pop bin_bl
    		pop licz
    		add bin_bl,bin_al	;sumuj 32 odczyty 
    		adc bin_bh,bin_ah
    		inc licz
    		cpi licz,32
    		brne adc_loop
    		lsr bin_bh		;podziel sumę przez 32 (uœrednianie)
    		ror bin_bl
    		lsr bin_bh
    		ror bin_bl
    		lsr bin_bh
    		ror bin_bl
    		lsr bin_bh
    		ror bin_bl
    		lsr bin_bh
    		ror bin_bl
    		mov bin_al,bin_bl
    		mov bin_ah,bin_bh
    		
    	
    		lds bin_bl,offset_l	;załaduj wartoœć błędu offsetu
    		lds bin_bh,offset_h
    
    		cpi bin_bh,$ff		;jeżeli offset_h = $ff to znaczy że
    		brne no_offset_check	;trwa kalibracja
    		ret
    
    	no_offset_check:
    		cp bin_al,bin_bl
    		cpc bin_ah,bin_bh
    		brlo offset_higher_result	;nie pozwól na "przekręcenie" wyniku
    
    		sub bin_al,bin_bl	;odejmij błšd offsetu od wyniku
    		sbc bin_ah,bin_bh
    	offset_higher_result:
    		mov bin_bl,bin_al
    		mov bin_bh,bin_ah
    
    	no_offset_error:
    		in temp,admux
    		andi temp,$0f
    		cpi temp,0
    		brne check_chan_1
    		st z+,bin_ah
    		st z+,bin_al
    		rcall channel_1
    		rjmp channel_set
    	check_chan_1:			;odczyty dla kanałów nr. 0,1
    		cpi temp,1
    		brne check_chan_2
    		st z+,bin_ah
    		st z+,bin_al
    		rcall channel_2
    		rjmp channel_set
    	check_chan_2:
    		cpi temp,2
    		brne check_chan_3
    		lsr bin_ah		;dzielenie przez 2 (ze względu
    		ror bin_al		;na przedwzmacniacz LM358)
    		st z+,bin_ah
    		st z+,bin_al
    		rcall channel_3
    		rjmp channel_set
    	check_chan_3:
    		cpi temp,3
    		brne check_chan_4
    		st z+,bin_ah
    		st z+,bin_al
    		rcall channel_4
    		rjmp channel_set
    	check_chan_4:
    		cpi temp,4
    		brne check_chan_end
    		st z+,bin_ah
    		st z,bin_al
    	check_chan_end:
    		rcall difvol_set
    		ret
  • Pomocny post
    #10 7630211
    asembler
    Poziom 32  
    No niestety nie te linie . te zmienia wszsytkie wyniki
    Szukaj symbolul LMxxx

    Dodano po 8 [minuty]:

    polprzewodnikowy napisał:

    adc_conversion:
    		
    		rcall channel_0	;włšcz kanał 0
    		clr zh
    		ldi zl,adr0
    	channel_set:
    		clr licz
    		clr bin_bl
    		clr bin_bh
    	adc_loop:
    		push licz
    		push bin_bl
    		push bin_bh
    		clr licz
    		clr bin_bl
    		clr bin_bh
    		clr bin_al
    		clr bin_ah
    	adc_sum_loop:
    		clr temp
    		out adch,temp
    		out adcl,temp
    		sbi adcsr,adsc
    	adc_pending:
    		sbic adcsr,adsc	;czekaj na zakończenie przetwarzania
    		rjmp adc_pending
    		in bin_al,adcl		;zachowaj odczytanš wartoœć
    		in bin_ah,adch
    
    		
    		add bin_bl,bin_al
    		adc bin_bh,bin_ah
    		inc licz
    		cpi licz,4		;sumuj 4 kolejne próbki z adc
    		brne adc_sum_loop
    		lsr bin_bh		;podziel sumę przez 2  
    		ror bin_bl          ;                  ?
    		mov bin_al,bin_bl
    		mov bin_ah,bin_bh
    	adc_end:
    		pop bin_bh		 
    		pop bin_bl
    		pop licz
    		add bin_bl,bin_al	;sumuj 32 odczyty 
    		adc bin_bh,bin_ah
    		inc licz
    		cpi licz,32
    		brne adc_loop
    		lsr bin_bh		;podziel sumę przez 32 (uœrednianie)
    		ror bin_bl
    		lsr bin_bh
    		ror bin_bl
    		lsr bin_bh
    		ror bin_bl
    		lsr bin_bh
    		ror bin_bl
    		lsr bin_bh
    		ror bin_bl
    		mov bin_al,bin_bl
    		mov bin_ah,bin_bh
    		
    	
    		lds bin_bl,offset_l	;załaduj wartoœć błędu offsetu
    		lds bin_bh,offset_h
    
    		cpi bin_bh,$ff		;jeżeli offset_h = $ff to znaczy że
    		brne no_offset_check	;trwa kalibracja
    		ret
    
    	no_offset_check:
    		cp bin_al,bin_bl
    		cpc bin_ah,bin_bh
    		brlo offset_higher_result	;nie pozwól na "przekręcenie" wyniku
    
    		sub bin_al,bin_bl	;odejmij błšd offsetu od wyniku
    		sbc bin_ah,bin_bh
    	offset_higher_result:
    		mov bin_bl,bin_al
    		mov bin_bh,bin_ah
    
    	no_offset_error:
    		in temp,admux
    		andi temp,$0f
    		cpi temp,0
    		brne check_chan_1
    		st z+,bin_ah
    		st z+,bin_al
    		rcall channel_1
    		rjmp channel_set
    	check_chan_1:			;odczyty dla kanałów nr. 0,1
    		cpi temp,1
    		brne check_chan_2
    		st z+,bin_ah
    		st z+,bin_al
    		rcall channel_2
    		rjmp channel_set
    	check_chan_2:
    		cpi temp,2
    		brne check_chan_3
    		lsr bin_ah		;dzielenie przez 2 (ze względu       TUTAJ
    		ror bin_al		;na przedwzmacniacz LM358)        TUTAJ
    		st z+,bin_ah
    		st z+,bin_al
    		rcall channel_3
    		rjmp channel_set
    	check_chan_3:
    		cpi temp,3
    		brne check_chan_4
    		st z+,bin_ah
    		st z+,bin_al
    		rcall channel_4
    		rjmp channel_set
    	check_chan_4:
    		cpi temp,4
    		brne check_chan_end
    		st z+,bin_ah
    		st z,bin_al
    	check_chan_end:
    		rcall difvol_set
    		ret
  • #11 7630223
    polprzewodnikowy
    Poziom 26  
    No właśnie przeoczyłem te LM358, w niedługim czasie sprawdzę te rozwiązanie.
  • #12 7630241
    asembler
    Poziom 32  
    polprzewodnikowy napisał:

    adc_conversion:
    		
    		rcall channel_0	;włšcz kanał 0
    		clr zh
    		ldi zl,adr0
    	channel_set:
    		clr licz
    		clr bin_bl
    		clr bin_bh
    	adc_loop:
    		push licz
    		push bin_bl
    		push bin_bh
    		clr licz
    		clr bin_bl
    		clr bin_bh
    		clr bin_al
    		clr bin_ah
    	adc_sum_loop:
    		clr temp
    		out adch,temp
    		out adcl,temp
    		sbi adcsr,adsc
    	adc_pending:
    		sbic adcsr,adsc	;czekaj na zakończenie przetwarzania
    		rjmp adc_pending
    		in bin_al,adcl		;zachowaj odczytanš wartoœć
    		in bin_ah,adch
    
    		
    		add bin_bl,bin_al
    		adc bin_bh,bin_ah
    		inc licz
    		cpi licz,4		;sumuj 4 kolejne próbki z adc
    		brne adc_sum_loop
    		lsr bin_bh		;podziel sumę przez 2  
    		ror bin_bl          ;                  ?
    		mov bin_al,bin_bl
    		mov bin_ah,bin_bh
    	adc_end:
    		pop bin_bh		 
    		pop bin_bl
    		pop licz
    		add bin_bl,bin_al	;sumuj 32 odczyty 
    		adc bin_bh,bin_ah
    		inc licz
    		cpi licz,32
    		brne adc_loop
    		lsr bin_bh		;podziel sumę przez 32 (uœrednianie)
    		ror bin_bl
    		lsr bin_bh
    		ror bin_bl
    		lsr bin_bh
    		ror bin_bl
    		lsr bin_bh
    		ror bin_bl
    		lsr bin_bh
    		ror bin_bl
    		mov bin_al,bin_bl
    		mov bin_ah,bin_bh
    		
    	
    		lds bin_bl,offset_l	;załaduj wartoœć błędu offsetu
    		lds bin_bh,offset_h
    
    		cpi bin_bh,$ff		;jeżeli offset_h = $ff to znaczy że
    		brne no_offset_check	;trwa kalibracja
    		ret
    
    	no_offset_check:
    		cp bin_al,bin_bl
    		cpc bin_ah,bin_bh
    		brlo offset_higher_result	;nie pozwól na "przekręcenie" wyniku
    
    		sub bin_al,bin_bl	;odejmij błšd offsetu od wyniku
    		sbc bin_ah,bin_bh
    	offset_higher_result:
    		mov bin_bl,bin_al
    		mov bin_bh,bin_ah
    
    	no_offset_error:
    		in temp,admux
    		andi temp,$0f
    		cpi temp,0
    		brne check_chan_1
    		st z+,bin_ah
    		st z+,bin_al
    		rcall channel_1
    		rjmp channel_set
    	check_chan_1:			;odczyty dla kanałów nr. 0,1
    		cpi temp,1
    		brne check_chan_2
    		st z+,bin_ah
    		st z+,bin_al
    		rcall channel_2
    		rjmp channel_set
    	check_chan_2:
    		cpi temp,2
    		brne check_chan_3
    		lsr bin_ah		;dzielenie przez 2 (ze względu       TUTAJ
    		ror bin_al		;na przedwzmacniacz LM358)        TUTAJ
    		st z+,bin_ah
    		st z+,bin_al
    		rcall channel_3
    		rjmp channel_set
    	check_chan_3:
    		cpi temp,3
    		brne check_chan_4
    		st z+,bin_ah
    		st z+,bin_al
    		rcall channel_4
    		rjmp channel_set
    	check_chan_4:
    		cpi temp,4
    		brne check_chan_end
    		st z+,bin_ah
    		st z,bin_al
    	check_chan_end:
    		rcall difvol_set
    		ret
REKLAMA