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

Asembler 8051: Programowanie timerów do migania diody i buzera co sekundę

ciomateusz 11 Kwi 2007 19:59 5412 8
REKLAMA
  • #1 3777819
    ciomateusz
    Poziom 14  
    Posty: 144
    Ocena: 7
    Koledzy mam potrzebuje program opuznienia czasowego na timerach. dioda ma 5x mrugnąc co sekunde potem buzer co sekunde tez 4x a potem 3x dioda co sekunde.
    Prosze o pomoc bo nie wiem o co w tych timerach chodzi
    dzięki wielkie z góry
    
    	ljmp start
    	org 0bh
    	ljmp intt0
    	org 100h
    start:
    	mov r0,#7fh
    zeruj:
    	mov @r0,#0
    	djnz r0,zeruj
    
    	clr p1.7
    	mov r4,#5
    	mov tmod,#1
    	mov tl0,#00h
    	mov th0,#4ch
    	mov r3,#20
    	setb ea
    	setb et0
    	setb tr0
    	sjmp $
    
    intt0:
    	orl tl0,#00h
    	mov th0,#4ch
    	djnz r3,exit
    	mov r3,#20
    	jb 5,bzz
    	jb 4,dioda
    	jb 3,buzzer
    	cpl p1.7
    	djnz r4,exit
    	mov r4,#6
    	setb3
    	sjmp exit
    buzzer:
    	cpl p1.5
    	djnz r4,exit
    	mov r4,#4
    	clr 3
    	setb 4
    	sjmp exit
    dioda:
    	clr p1.7
    	djnz r4,exit
    	mov r4,#4
    	setb p1.7
    	clr 4	
    	setb 5
    bzz:
    	clr p1.5
    	djnz r4,exit
    	mov r4,#5
    	setb p1.5
    	clr p1.7
    	clr 5
    	
    exit:
    	reti
    end
    
    mam takie coś (3x dioda i 3x buzer) prubuje to przerobić ale nie mam pojęcia jak 
    Jak by ktoś wiedzial to napiszcie chociaz jakies wskazówki bo tak jak pisalem ze nic z timerów nie lapie (nie ma to jak DElAY_100MS :))
  • REKLAMA
  • Pomocny post
    #2 3779868
    tprzemko
    Poziom 22  
    Posty: 413
    Pomógł: 54
    Ocena: 21
    Witam
    Proponuję zrobić to troszkę inaczej. Przerwanie zaprogramuj tak aby ustawiało jakiś bit co jedną sekundę. Program główny ma mieć taką konstrukcje.
    
    czy sekunda:
     jeżeli tak to mrugnąć 5x diodą wyzerować czy sekunda
     jeżeli nie skok na czy sekunda
    
    czy sekunda 2:
     jeżeli tak to buzer 4x wyzerować czy sekunda
     jeżeli nie to skok do czy sekunda 2
    
    czy sekunda 3:
     jeżeli tak to mrugnąć 3x diodą wyzerować czy sekunda
     jeżeli nie to skok na czy sekunda 3
    
    

    Jeżeli ma mrugać co sekundę to musisz sobie porobić pętle.
    
     mov licznik,#5
    czy sekunda:
     jeżeli tak to mrugnij led zeruj czy sekunda
     jeżeli nie to skok na czy sekunda
    djnz licznik,czy sekunda
    i tak dalej
    

    Jeżeli coś zagmatwałem :D to sorki
    Pozdrawiam
  • #3 3781241
    ciomateusz
    Poziom 14  
    Posty: 144
    Ocena: 7
    dzięki kolego (wiem o co ci chodzilo w tym tlumaczeniu) lecz niestety nie wiem jak to ubrać w programie ( na pracowni nie bylo nic o timerach a nawet jak by bylo to przy naszym nauczycielu nic bym nie wiedzial więcej) jak bys mugl to napisz jak zrobić tą 1sekunde na timerze bo nie mam zielonego pojęcia.
    jeszcze raz wielkie dzięki i pozdroo!!
  • REKLAMA
  • Pomocny post
    #4 3782898
    tprzemko
    Poziom 22  
    Posty: 413
    Pomógł: 54
    Ocena: 21
    Witam
    Powstawiaj odpowiednie instrukcje tam gdzie napisałem zapal, zgaś itp. Powinien program zadziałać nie daję gwarancji że się nie machnołem. Niemniej idea chyba będzie widoczna i powinieneś w razie czego uruchomić ten program.
    Pozdrawiam

    
    led	equ	p1.7
    buzer	equ	p1.5
    
    licznik	equ	21h		; licznik przerwań
    czas_led	22h
    czas_buz	23h
    
    czy_s	equ	1		; czy sekunda
    
    
    	org	0000h
    		
    	ljmp	start
    
    	org	000bh		; przerwanie od t0
    
    	ljmp	intt0
    
    	org	100h
    start:
    	mov	r0,#7fh
    zeruj:
    	mov	@r0,#0
    	djnz	r0,zeruj
    
    	mov	sp,#24H		;ustawienie stosu
     
     	mov	tmod,#1
    	mov	tl0,#00h
    	mov	th0,#4ch
    	mov	licznik,#20	; 20*50ms=1s
    	setb	ea
    	setb	et0
    	setb	tr0		; Ustawienia poczatkowe
    	
    ;program główny
    ******Tutaj wyłącz leda i buzer******
    pocz:
    	clr	czy_s
    	mov	r0,#5		; licznik 
    loop00:	jnb	czy_s,loop00	; czekamy na 1s
    	clr	czy_s
    	mov	czas_led,#10	; czas mrugania 10*50ms
    ********ZAPAL LEDA*************
    	djnz	r0,loop00	; liczba cykli
    	
    	clr	czy_s
    	mov	r0,#4
    loop01:	jnb	czy_s,loop01
    	clr	czy_s
    	mov	czas_buz,#10
    *******WLACZ BUZER*************
    	djnz	r0,loop01
    	
    	clr	czy_s
    	mov	r0,#5		; licznik 
    loop02:	jnb	czy_s,loop00	; czekamy na 1s
    	clr	czy_s
    	mov	czas_led,#10	; czas mrugania 10*50ms
    ********ZAPAL LEDA*************
    	djnz	r0,loop02	; liczba cykli
    
    loop03:	ljmp	loop03		; nieskończona petla
    
    
    intt0:	push	psw
    	push	acc
    	mov	th0,#4ch	; ustawienie timera
    	djnz	licznik,exit	; czekaj na 0
    	setb	czy_s		; ustawia bit że sekunda
    	mov	licznik,#20	; ponowne załadowanie licznika
    
    exit:	mov	a,czas_led
    	jz	nie_l		; skok jeśli nie odmierzamy leda
    	dec	czas_led
    	dec	a
    	jnz	nie_l		; skok dalej
    
    ********ZGAS LEDA********	; TUTAJ WPISZ CO POWINNO BYC	
    
    nie_l:	mov	a,czas_buz
    	jz	koniec		; skok jeśli nie odmierzamy buzera
    	dec	czas_buz
    	dec	a
    	jnz	koniec
    	
    ********WYLACZ BUZER*****	;
    
    koniec:	pop	acc
    	pop	psw
    	reti			;wyjście z przerwania
    
  • REKLAMA
  • #5 3787264
    ciomateusz
    Poziom 14  
    Posty: 144
    Ocena: 7
    wielkie dzieki jesdnak jest dzieś błąd na samym początku
    
    
    led   equ   p1.7
    buzer   equ   p1.5
    
    licznik   equ   21h      ; licznik przerwań
    czas_led   22h
    czas_buz  23h
    
    

    coś z etykietom czas_led i czas_buzer nie wiem czy te wartośći nie są zle czasami albo czegoś brakuje (tak jak muwilem jestem w tym zielony)
    z gory dzięki za podpowiedzi. Nigdzie tej etykiety nie ma może to dla tego jest bląd?
  • Pomocny post
    #6 3787885
    tprzemko
    Poziom 22  
    Posty: 413
    Pomógł: 54
    Ocena: 21
    Witam
    Brakuje dyrektyw "equ" :D .
    Pozdrawiam
  • #7 3790220
    ciomateusz
    Poziom 14  
    Posty: 144
    Ocena: 7
    Wielkie dzięki kolego sam bym se nie poradzil. Mogl bys mi jeszcze powiedziec jak zatrzymac ten program zeby w kolko nie chodzil (chodzimi tylko o wskazania konca) zebym se wstawil odpowiedni rozkaz. jeszcze raz dzieki pozdro!!
  • REKLAMA
  • Pomocny post
    #8 3791114
    tprzemko
    Poziom 22  
    Posty: 413
    Pomógł: 54
    Ocena: 21
    Witam
    
    loop03:   ljmp   loop03      ; nieskończona petla 
    

    W tej linii jest koniec programu. Procesor nic nie robi. Działa chociaż zgodnie z założeniami ten program :?:.
    Pozdrawiam
  • #9 3793402
    ciomateusz
    Poziom 14  
    Posty: 144
    Ocena: 7
    działa elegancko dzięki jeszcze raz i pozdro

Podsumowanie tematu

✨ Dyskusja dotyczy programowania timerów mikrokontrolera 8051 w asemblerze w celu realizacji opóźnień czasowych i sekwencji migania diody LED oraz sygnałów buzera co sekundę. Autor potrzebuje programu, który umożliwi pięciokrotne miganie diody co sekundę, następnie czterokrotne sygnały buzera co sekundę, a na końcu trzykrotne miganie diody. Wskazano, że przerwanie timera powinno ustawiać flagę co sekundę, a program główny powinien sterować sekwencją za pomocą pętli i liczników. Zaproponowano strukturę programu z wykorzystaniem rejestrów i zmiennych do liczenia impulsów i czasu trwania sygnałów. Podano przykładowy kod asemblera z definicjami portów (P1.7 dla LED, P1.5 dla buzera), konfiguracją timerów (TMOD, TH0, TL0) oraz obsługą przerwania timer0. Omówiono także sposób zatrzymania programu po wykonaniu sekwencji poprzez nieskończoną pętlę skoku. Wskazano na konieczność użycia dyrektyw "equ" do definiowania etykiet i adresów zmiennych. Całość ma na celu ułatwienie zrozumienia działania timerów i implementacji opóźnień w asemblerze dla mikrokontrolera 8051.
Wygenerowane przez model językowy.
REKLAMA