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

Jak zaprojektować nadajnik Morse'a w asemblerze dla mikrokontrolera ST7?

26 Kwi 2009 22:50 2258 3
REKLAMA
  • #1 6460668
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • #2 6475748
    amikos
    Poziom 12  
    Posty: 33
    Pomógł: 1
    Dość lakonicznie opisałeś projekt.
    Może warto, przynajmniej jako koncepcja, zajrzeć do Elektroniki Praktycznej. Był taki projekt, niestety na AVR i w Bascomie (Basic).
    http://ep.com.pl/?sect=czytelnia&pg=czytelnia&sygn=ep200608_103
    I darmowo kod w Bascomie:
    http://www.ep.com.pl/?sect=main&pg=download&sk=Morse
    Zobacz też tu:
    http://easy-soft.net.pl/modules.php?name=Topics
    Na temat asemblera ST7.
  • REKLAMA
  • #3 6476416
    Konto nie istnieje
    Konto nie istnieje  
  • Pomocny post
    #4 6477936
    outsider9999
    Poziom 10  
    Posty: 8
    Pomógł: 1
    Witam;)
    Jeśli chodzi o nadawanie kodu cyfr klawiaturki zestawu to pisałem jakiś czas temu taki program w ramach zaliczenia tegoż przedmiotu. Podejrzewam jednak, że chodzi o wykorzystanie np. HyperTerminal'a i podawanie znaku z klawiatury komputera.
    Oto program który wówczas napisałem:
    
    st7/
    	TITLE	"starter.asm"
    	MOTOROLA
    	
    	#INCLUDE "st72334.inc"		
    	#INCLUDE "LCD.inc"
    	#INCLUDE "I2C.inc"
    	#INCLUDE "KEYS.inc"    
    	#INCLUDE "TIME.inc"
    
    ;***************************************************************************
    ;	Początek programu
    ;***************************************************************************
    	WORDS
    	segment 'rom'	; program
    
    .main			; poczatek programu po resecie      
      	rim		; odblokowanie przerwań, rozkaz wymagany 
    ; przy stosowaniu debugera InDart
                     
                     
    ;=======Inicjacja: konfiguracja ukladów peryferyjnych, ukladow zewnetrznych i przerwan======;
    
    	call	KEYS_INIT 	                         
    	                                 
    ;============Tutaj rozpoczyna sie program glowny============;                
    
    .read                   			;petla do odczytu klawiszy klawiatury przez porównanie
    				;wcisnietego klawisza z jego kodem ASCII i skok warunkowy     
    				;do procedury wykonujacej funkcje prezentacji konkretnego 						;znaku w kodzie Morse'a
    	ld	A, #$00			
    	ld	PDDR, A                 		;wygaszenie diod (port PD)
    	
    	call	KEYS_READ               		;inicjacja odczytu znaków z klawiatury
                    
    	cp	Y,#$30                  		;testowanie nacisniecia klawisza 0 
    	jreq	zero_local 
    	cp	Y,#$31                 		;testowanie nacisniecia klawisza 1
    	jreq	jeden_local
    	cp	Y,#$32	                		;testowanie nacisniecia klawisza 2
    	jreq	dwa_local  
    	cp	Y,#$33              			;testowanie nacisniecia klawisza 3
    	jreq	trzy_local
    	cp	Y,#$34                  		;testowanie nacisniecia klawisza 4
    	jreq	cztery_local
    	cp	Y,#$35                  		;testowanie nacisniecia klawisza 5
    	jreq	piec_local
    	cp	Y,#$36                  		;testowanie nacisniecia klawisza 6
    	jreq	szesc_local
    	cp	Y,#$37                  		;testowanie nacisniecia klawisza 7
    	jreq	siedem_local
    	cp	Y,#$38                  		;testowanie nacisniecia klawisza 8
    	jreq	osiem_local
    	cp	Y,#$39                  		;testowanie nacisniecia klawisza 9
    	jreq	dziewiec_local
    			
    	cp	Y,#$2A                  		;testowanie nacisniecia klawisza *
    	jreq	gw_local
    	cp	Y,#$23                  		;testowanie nacisniecia klawisza #
    	jreq	hasz_local
    
    	jp	read                    			;skok do poczatku procedury read  
    	                                                                               
    	                                                                               
    ;========Miejsce skoków warunkowych wykonanych w procedurze 'read'========;
    .zero_local
    	jp	zero
    .jeden_local	
    	jp	jeden   
    .dwa_local	
    	jp	dwa   
    .trzy_local	
    	jp	trzy  
    .cztery_local	
    	jp	cztery
    .piec_local	
    	jp	piec   
    .szesc_local	
    	jp	szesc  
    .siedem_local	
    	jp	siedem
    .osiem_local	
    	jp	osiem   
    .dziewiec_local	
    	jp	dziewiec  
    .gw_local	
    	jp	gw   
    .hasz_local	
    	jp	hasz  
    
    
    ;==========Procedura realizujaca sygnalizacje wcisniecia klawisza '0'==========;  	
                            
    .zero   
    	call	LCD_INIT               		;inicjacja wyswietlacza LCD
    	ld	X, #$30                		;wpisanie do rejestru X, kodu ASCII klawisza '0'
    	call	LCD_WRITE			;wyswietlenie '0' na LCD  
    	call	diody_init              		;konfiguracja portów
           	call	pauz1                   		;pauza przed rozpoczeciem nadawania kodu Morse'a
    
     ;------------------- 
            	call	kres                    			;;
    	call	pauz                      		  ;
    	call	kres                       		    ;
    	call	pauz                       		     ;
    	call	kres                        		       ;kod Morse'a danej cyfry
    	call	pauz                       		     ; 
    	call	kres                      		    ;
    	call	pauz                     		  ;
    	call	kres                   			;;    
    ;-------------------
    	jp	read                   			;powrót do procedury 'read'
    	
    
    
    
    ;==========Procedura realizujaca sygnalizacje wcisniecia klawisza '1'==========;  	
    .jeden
    	call	LCD_INIT	  
    	ld	X, #$31   
    	call	LCD_WRITE
    	call	diody_init 
            	call	pauz1   
            
    	call	krop
    	call	pauz
    	call	kres 
    	call	pauz
    	call	kres 
    	call	pauz
    	call	kres 
    	call	pauz
    	call	kres 
    	
    	jp	read  
    	
    
    ;==========Procedura realizujaca sygnalizacje wcisniecia klawisza '2'==========;  
    .dwa    
    	call	LCD_INIT  
    	ld	X, #$32   
    	call	LCD_WRITE
    	call	diody_init 
            	call	pauz1  
            
    	call	krop
    	call	pauz
    	call	krop 
    	call	pauz
    	call	kres  
    	call	pauz
    	call	kres
    	call	pauz
    	call	kres 
    	
    	jp	read 
    	
    ;==========Procedura realizujaca sygnalizacje wcisniecia klawisza '3'==========;  
    .trzy    
    	call	LCD_INIT  
    	ld	X, #$33   
    	call	LCD_WRITE
    	call	diody_init   
            	call	pauz1   
            
    	call	krop
    	call	pauz
    	call	krop 
    	call	pauz
    	call	krop  
    	call	pauz
    	call	kres 
    	call	pauz
    	call	kres 
    	
    	jp	read 
    ;==========Procedura realizujaca sygnalizacje wcisniecia klawisza '4'==========;  
    .cztery    
    	call	LCD_INIT  
    	ld	X, #$34   
    	call	LCD_WRITE
    	call	diody_init  
           	call	pauz1   
            
    	call	krop
    	call	pauz
    	call	krop 
    	call	pauz
    	call	krop  
    	call	pauz
    	call	krop 
    	call	pauz
    	call	kres  
    	 
    	jp	read      
    	
    ;==========Procedura realizujaca sygnalizacje wcisniecia klawisza '5'==========;  
    .piec    
    	call	LCD_INIT  
    	ld	X, #$35   
    	call	LCD_WRITE
    	call	diody_init 
            	call	pauz1     
            
    	call	krop
    	call	pauz
    	call	krop 
    	call	pauz
    	call	krop  
    	call	pauz
    	call	krop 
    	call	pauz
    	call	krop   
    	
    	jp	read     
    	
    ;==========Procedura realizujaca sygnalizacje wcisniecia klawisza '6'==========;  
    .szesc    
    	call	LCD_INIT  
    	ld	X, #$36   
    	call	LCD_WRITE
    	call	diody_init  
            	call	pauz1 
            
    	call	kres
    	call	pauz
    	call	krop 
    	call	pauz
    	call	krop  
    	call	pauz
    	call	krop 
    	call	pauz
    	call	krop  
    	
    	jp	read     
    	
    ;==========Procedura realizujaca sygnalizacje wcisniecia klawisza '7'==========;  
    .siedem    
    	call	LCD_INIT  
    	ld	X, #$37   
    	call	LCD_WRITE
    	call	diody_init  
            	call	pauz1   
            
    	call	kres
    	call	pauz
    	call	kres 
    	call	pauz
    	call	krop  
    	call	pauz
    	call	krop 
    	call	pauz
    	call	krop 
    	   
    	jp	read       
    	
    ;==========Procedura realizujaca sygnalizacje wcisniecia klawisza '8'==========;  
    .osiem    
    	call	LCD_INIT  
    	ld	X, #$38   
    	call	LCD_WRITE
    	call	diody_init  
            call	pauz1   
            
    	call	kres
    	call	pauz
    	call	kres 
    	call	pauz
    	call	kres  
    	call	pauz
    	call	krop 
    	call	pauz
    	call	krop
    	 
    	jp	read     
    	
    ;==========Procedura realizujaca sygnalizacje wcisniecia klawisza '9'==========;  
    .dziewiec    
    	call	LCD_INIT  
    	ld	X, #$39   
    	call	LCD_WRITE
    	call	diody_init 
            	call	pauz1   
            
    	call	kres
    	call	pauz
    	call	kres 
    	call	pauz
    	call	kres  
    	call	pauz
    	call	kres 
    	call	pauz
    	call	krop 
    	  
    	jp	read   
    	
    ;==========Procedura realizujaca sygnalizacje wcisniecia klawisza '*'==========;          
    .gw    
    	call	LCD_INIT 
    	ld	X, #$2A   
    	call	LCD_WRITE  
    	call	diody_init   
            	call	pauz1
     	jp	read  
    	
    ;==========Procedura realizujaca sygnalizacje wcisniecia klawisza '#'==========;  
    .hasz    
    	call	LCD_INIT 
    	ld	X, #$23   
    	call	LCD_WRITE  
    	call	diody_init   
            	call	pauz1
     	jp	read
    
    ;==============Procedura realizujaca sygnalizacje kropki===============; 
    .krop	
    	ld	A, #$01                 		;aktywacja diody 
    	ld	PDDR, A                 		;na porcie PD
    
    	ld	A, #$02                 		;aktywacja buzzera
    	ld	PFDR, A                 		;na porcie PF
    ;-----------------------
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    ;-----------------------	
    	ld	A, #$00                 		;deaktywacja buzzera
    	ld	PFDR, A                 		;na porcie PF
            	ret  
            
    
    ;==============Procedura realizujaca sygnalizacje kreski===============; 
    .kres    
    	ld	A, #$01                 		;aktywacja diody 
    	ld	PDDR, A                 		;na porcie PD
    
    	ld	A, #$02                 		;aktywacja buzzera
    	ld	PFDR, A                 		;na porcie PF
    ;-----------------------
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS 
    ;-----------------------	  
    	ld	A, #$00                 		;deaktywacja buzzera
    	ld	PFDR, A                 		;na porcie PF
    	ret      
    	
    ;==============Procedura realizujaca przerwe miedzy znakami===============; 
    .pauz
    	ld	A, #$00                 		;deaktywacja diody 
    	ld	PDDR, A                 		;na porcie PD
    
    	ld	A, #$00                 		;deaktywacja buzzera
    	ld	PFDR, A                 		;na porcie PF
    ;-----------------------
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    	call	TIME_5MS
    ;-----------------------	
    	ret                 
    	
    
    ;=========Procedura realizujaca pauze przed rozpoczeciem sygnalizacji ==========; 
    .pauz1
    	ld	A, #$00
    	ld	PDDR,A
    	call	TIME_500MS       
    	
    
    
    
    
    
    ;==============Konfiguracja portów===============; 
    .diody_init               
    	ld	A, #$02
    	ld	PFDDR, A
    	ld	PFOR, A
    	
           	ld 	A, #$01
    	ld	PDDDR, A
    	ld	PDOR, A
    	
    	ld	A, #$80
    	ld	PCDDR, A
    	ld	PCOR, A
    	ld	PCDR, A        
           	ret
                       
    	; dobry zwyczaj nakazuje umieszczanie po petli glownej - nieskonczonej petli
    
    	jp	*	; * ozn. "skok do samego siebie" = aktualnego licznika rozkazów
    
    
    ;***************************************************************************
    int_catch	iret			; "pusty" podprogram obsługi przerwania
    
    
    	segment 'vectit'		; tablica wektorów przerwań
    
    	DC.W	int_catch		; FFE0-FFE1h location
    	DC.W	int_catch		; FFE2-FFE3h location
    	DC.W	int_catch		; FFE4-FFE5h location
    	DC.W	int_catch		; FFE6-FFE7h location
    	DC.W	int_catch		; FFE8-FFE9h location
    	DC.W	int_catch		; FFEA-FFEBh location
    	DC.W	int_catch		; FFEC-FFEDh location
    	DC.W	int_catch		; FFEE-FFEFh location
    	DC.W	int_catch		; FFF0-FFF1h location
    	DC.W	int_catch		; FFF2-FFF3h location
    	DC.W	int_catch		; FFF4-FFF5h location
    	DC.W	int_catch		; FFF6-FFF7h location
    	DC.W	int_catch		; FFF8-FFF9h location
    	DC.W	int_catch		; FFFA-FFFBh location
    	DC.W	int_catch		; FFFC-FFFDh location
    	DC.W	main			; FFFE-FFFFh location = poczatek programu
    
    	END
    
REKLAMA