| Author |
Message
|
clipie Poziom 14

Joined: 15 Jul 2004 Posts: 189 Location: Gdańsk
|
#1
15 Nov 2009 20:03 AT90pwm3B pierwsze kroki.. |
|
|
|
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:
| Code: |
.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 |
|
|
| Back to top |
|
 |
Google

|
#
15 Nov 2009 20:03 |
|
|
|
|
|
| Back to top |
|
 |
528649 Guest
|
#2
15 Nov 2009 20:29 Re: AT90pwm3B pierwsze kroki.. |
|
|
|
Z tego co piszesz (nie analizowałem kodu) wygląda na to że jest OK. A z czym ten AT90PWM3B ma się komunikować? PC, drugi procesor?
Dodano po 7 [minuty]:
EUSART nie działa i nie ma wpływu na nic dopóki nie ustawisz EUSART w rejestrze EUCSRB.
|
|
| Back to top |
|
 |
clipie Poziom 14

Joined: 15 Jul 2004 Posts: 189 Location: Gdańsk
|
#3
15 Nov 2009 20:29 Re: AT90pwm3B pierwsze kroki.. |
|
|
|
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.
|
|
| Back to top |
|
 |
Google

|
#
15 Nov 2009 20:29 |
|
|
|
|
|
| Back to top |
|
 |
528649 Guest
|
#4
15 Nov 2009 20:37 Re: AT90pwm3B pierwsze kroki.. |
|
|
|
A spróbuj wybadać co się dzieje na procku (nie w symulatorze) z flagami błędów (Frame Error itd.).
|
|
| Back to top |
|
 |
clipie Poziom 14

Joined: 15 Jul 2004 Posts: 189 Location: Gdańsk
|
#5
15 Nov 2009 20:47 Re: AT90pwm3B pierwsze kroki.. |
|
|
|
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ć.
|
|
| Back to top |
|
 |
528649 Guest
|
#6
15 Nov 2009 20:52 Re: AT90pwm3B pierwsze kroki.. |
|
|
|
Wydaje mi się, że żeby to zadziałało musi coś być w UDR.
Flaga RxC jest na pewno do odczytu i zapisu.
|
|
| Back to top |
|
 |
dftb47 Poziom 2

Joined: 01 Aug 2009 Posts: 3
|
#7
12 Dec 2010 13:47 Re: AT90pwm3B pierwsze kroki.. |
|
|
|
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.
|
|
| Back to top |
|
 |
Google

|
#
12 Dec 2010 13:47 |
|
|
|
|
|
| Back to top |
|
 |
LordBlick Poziom 23

Joined: 31 Aug 2004 Posts: 3685 Location: Słupsk
|
#8
12 Dec 2010 14:21 Re: AT90pwm3B pierwsze kroki.. |
|
|
|
| dftb47 wrote: |
| 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.
|
|
| Back to top |
|
 |