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

AT90pwm3B pierwsze kroki..

clipie 15 Lis 2009 19:03 2581 7
REKLAMA
  • #1 7265113
    clipie
    Poziom 16  
    Witam.

    Mam do oprogramowania AT90PWM3B.
    Chce wysłać/odebrać (cokolwiek) przez USART.
    Problem jest taki że w AVRstudio, podczas debugowania wszytko jest ok, tak jak chcę, ale po zaprogramowaniu procesora - nie chce dzialać.

    Sądze ze wlaga RxC nie generuje przerwania - ale dlaczego to nie wiem (I; RxCIE; RxEN = 1)
    - procedura obslugi przerwania RxC wywolana jako podprgram (poprzez rcall) dziala prawidlowo, ponad to procedura tak wywolana nie gasi RxC (dwie linijki do gaszenia RxC w programie)

    moje pytanie:
    #1 Co jest nie tak? :)
    #2 Czy na pewno mozna ustwic flage RxC programowo?
    #3 to raczej swiezy porcesor, czy mozliwe ze biblioteki do uC j/w nie bedą mialy za duzo z nim w spolnego? - uwzgledniając datasheeta wszytko powinno byc w porzadku, UCSRA,B i C a takze bity. Podkreslam ze AVRstudio mówi ze wszytko dziala Ok - ale ok niestety nie jest.

    ..procesorek ten, ma tez rozszerzenie USART: EUSART - o ktorym to malo wiem, wiec nie wiem ta w jakim stopniu przeszkadza ono standardowemu USARTowi. Podkreslam że AVRstudio mowi ze wsztko jest ok - podczas gdy ok nie jest.


    Kod ASM:
    
    		.include "pwm3Bdef.inc"
    
    .cseg
    ;=============================================================================
    ;						Wektory przerwań
    ;-----------------------------------------------------------------------------
    
    		.set	ResetPoint = INT_VECTORS_SIZE
    
     		.org	0x0000		       rjmp     ResetProcessor		// RESET			
    		.org   	URXCaddr           rjmp     UsartRxComplete		; USART, Rx Complete
    		.org   	UTXCaddr           rjmp     UsartTxComplete		; USART, Tx Complete
    
    ;-----------------------------------------------------------------------------
    
    
    ;=============================================================================
    	.org ResetPoint
    ResetProcessor:
    
    		cli
    		ldi r16, Low(RAMEND) 				; ustaw wskaznik stosu 
    		out SPL, r16
    		ldi r16, High(RAMEND) 				
    		out SPH, r16
    
    		rjmp Main
    ;=============================================================================
    ;                       		Main Code
    ;-----------------------------------------------------------------------------
    Main:
    		rcall USART_Init
    		sei
    
    Loop0:	
    		lds r16,UCSRA
    		sbr r16,(1<<RXC)
    		sts UCSRA,r16		
    				;	rcall UsartRxComplete  ; wywolanie procedury przerwania za pomocą call
    		rcall opoz	
    
    		rjmp Loop0
    
    
    	;--------------
    		opoz:
    			ldi r16,40		;x 20000 clk_cycle  //for 8mhz: x 25ms
    				ldi XH,high(49999)
    				ldi	XL,	low(49999)
    				sbiw XL,1
    				brne PC-1
    			dec r16
    			brne PC-5
    			ret
    	;--------------
    
    ;=============================================================================
    ;=============================================================================
    ;=============================================================================
    	#define FOSC 8000000	// Clock Speed
    	#define BAUD 2400;			600;			900;			1200;			9600;																
    	#define MYUBRR FOSC/16/BAUD-1
    
    	USART_Init:
    			;*** Set baud rate
    				ldi r17, high(MYUBRR)
    				ldi r16,  low(MYUBRR)			
    				sts UBRRH, r17
    				sts UBRRL, r16
    			;*** Set frame format: 8data, no parity & 2 stop bits
    				ldi r16, (0<<UMSEL0)|(0<<UPM0)|(1<<USBS)|(3<<UCSZ0)
    				sts UCSRC,r16
    			;*** Enable receiver and transmitter
    				ldi r16, (1<<RXCIE)|(0<<TXCIE)|(1<<RXEN)|(1<<TXEN)
    				sts UCSRB,r16		/**/
    				ret
    
    
    
    
    	UsartRxComplete:	
    			;*** Get status and 9th bit, then data from buffer
    				lds r18, UCSRA
    				lds r17, UCSRB
    				lds r16, UDR0
    
    			;*** zgas przerwanie
    				cbr r20,(1<<RXC)
    				sts UCSRA, r20
    
    			;	lsr r17
    			;	andi r17, 0x01
    
    			;*** wl/wyl diode na PB3
    				in r16,PortB
    				ldi r17,(1<<PB3)
    				eor r16,r17
    				out PortB,r16
    			
    				reti
    
    
    
    
    	UsartTxComplete:
    
    				reti
  • REKLAMA
  • #2 7265223
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • #3 7265267
    clipie
    Poziom 16  
    Ma sie komunikowac z cywilną atmegą Po RS485 i jeszcze jednym uC.

    Wazne jest to ze program nie wchodzi do przerwania przez ustawienie flagi.

    PS: W programie usuniecie srednika w Main ( ; rcall UsartRxComplete ;...) powoduje to ze program robi to co ma robic w tym przypadku, czyli co sekunde ustawiac/gasic PB3.
  • REKLAMA
  • #4 7265313
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • #5 7265372
    clipie
    Poziom 16  
    Ale co mialoby sie dziąć? - ja w tym programie niczego nie odbieram (też fizycznie), chcę tylko sie upewnic ze program wejdzie w realizacje przerwania po wystawieniu flagi. - uwazam ze to najnizszy poziom zlozonosci zadań (jesli jest nizszy to mi powiedzcie :) ) jaki jest mozliwy gdy rozpatrujemy dzialanie bloku nadajnika/odbiornika USART.

    Napisalem ten powyzszy program po tym jak gotowa porcedura komunikacji jak i jej uproszczenia nie chciały ruszyć.
  • #6 7265401
    Konto nie istnieje
    Konto nie istnieje  
  • #7 8858228
    dftb47
    Poziom 2  
    Do zapisu rejestru I/O służy rozkaz OUT, a nie STS. Tak samo IN , a nie LDS.
    Flaga RXC jest tylko do odczytu. Wyzeruje się sama jak w RX FIFO nie będzie nieodczytanych danych.
  • #8 8858385
    LordBlick
    VIP Zasłużony dla elektroda
    dftb47 napisał:
    Do zapisu rejestru I/O służy rozkaz OUT, a nie STS. Tak samo IN , a nie LDS.
    Nie zgodzę się z tymi "nie" ;). Zarówno STS, jak i LDS mogą służyć do operacji na I/O, tylko do adresu należy dodać 0x20. Ponadto IN/OUT nie funkcjonują w rozszerzonym I/O od 0x40, czyli pozostaje tylko LDS/STS od 0x60. Odsyłam przedmówcę do not katalogowych.
REKLAMA