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

[Atmega128] 7seg+opoznienia

arikadiusz 21 Lip 2009 07:24 957 0
REKLAMA
  • #1 6803872
    arikadiusz
    Poziom 12  
    Witam, mam taki problem:
    
    ;Licznik binarny z wyświetleniem wartości na wyświetlaczu
    ;7-segmentowym LED TDSY3150 (użycie pojedynczej cyfry)
    .include "m128def.inc"
    
    .EQU	SYS_FREQ	= 4		; częstotliwość pracy w MHz
    .ORG	0							; wektor zerowania
    	jmp	Reset						; skok do procedury inicjalizującej
    
    Reset:								; podprogram inicjalizujący
    	ldi	R17, high(RAMEND)
    	ldi	R16, low(RAMEND)
    	out	SPH, R17
    	out	SPL, R16					; inicjalizacja wskaźnika stosu
    
    	ldi	R16, 0xFF
    	sts	DDRF, R16					; port F w trybie wyjściowym - do 7seg
    
    	sei								; odblokowanie przerwań
    	clr R16
    
    Petla:								;pętla główna programu
    	clr R0 							;zerowanie R0-posłuży do dodania ew.przeniesienia								
    	ldi ZL,low(wzorce<<1) 			;adres w ROM może być 2-bajtowy,należy uwzględnić
    	ldi ZH,high(wzorce<<1) 			;młodszy i starszy bajt adresu
    	add ZL,R16 						;do indeksu dodajemy wartość temp-to będzie
    	adc ZH,R0 						;wartość przesunięcia w tablicy
    	lpm 							;załadowanie do R0 bajtu (wzorca cyfry) z ROM
    	sts PORTF,R0 					;wyprowadzenie wzoraca przez port A
    	inc R16							;zwieksz R16
    	cpi R16, 10						;porownaj R16 z liczba 10, jesli rowne
    	breq RESET						;skocz do RESET
    	
    	ldi R22, 250
    	ldi R17, 2
    	call Czekaj_ms
    	
    	rjmp	Petla					;zapętl program
    wzorce: .db 2,10,20,30,40,50,60,70,80,90	
    
    ;##################OCZEKIWANIE MILISEKUNDOWE###################;
    ; Parametry:
    ;	R22 - wartość opóźnienia w ms (dla zera - 256 ms)
    ;	R17 - mnożnik opóźnienia (dla zera - 256x)
    ;
    ; Wymagane stałe:
    ;	SYS_FREQ - częstotliwość pracy w MHz
    ;#############################################################;
    Czekaj_ms:
    	push	R18
    	push	R19
    	push	R20
    	push	R21
    
    	mov	R20, R22
    	mov	R21, R17
    	ldi	R18, SYS_FREQ
    
    Czekaj_ms_0:
    	mov	R17, R21					;______________
    									;              \
    Czekaj_ms_1:						;               |
    	mov	R22, R20					;__________     |
    									;          \    |
    Czekaj_ms_2:						;           |   |
    	ldi	R19, 249					;______     |   |
    									;      \    |   |
    	nop								;       |   |   |
    Czekaj_ms_3:						;__     |   |   |
    	nop								;  \    p   p   p
    	dec	R19							;  p3   2   1   0
    	brne	Czekaj_ms_3				;__/    |   |   |
    									;       |   |   |
    	dec	R22							;       |   |   |
    	brne	Czekaj_ms_2				;______/    |   |
    									;           |   |
    	dec	R17							;           |   |
    	brne	Czekaj_ms_1				;__________/    |
    									;               |
    	dec	R18							;               |
    	brne	Czekaj_ms_0				;______________/
    
    	pop	R21
    	pop	R20
    	pop	R19
    	pop	R18
    	ret
    

    Bez tego opoznienia Czekaj_ms dane z tabeli sa ladnie wypisywane na wyswietlacz 7 seg (w emulacji), jak dodalem opoznienie i wrzucilem na procka to co prawda odczytuje z tabeli, ale... do 5 pozycji wlacznie (dochodzi do 5 i zaczyna od zera). Nie mam pojecia o co to chodzi, moze mi ktos pomoc?
  • REKLAMA
REKLAMA