PIC16F1936 - příklad UART komunikace - hotový program v ASM

ahoj lidi snažím se naprogramovat příjem dat přes uart na pic16f1936 a vubec se mi to nedaří.mohl by mi někdo napsat nastavení uart pro tento procesor v asm.předem díky

:arrow_right: administrator: přejmenováno z "uart"

Nejsem si jisty zda to nekdo udela za tebe … myslim ,ze je tu spousta lidi co by ti moc rada pomohla ale urcite se asi nikomu nebude chtit delat neco za tebe. Stejne budes muset premyslet. :laughing:

P.S: zkus treba C… tohle si myslim, ze je jeden z PICu co by C snesl (a ted jsem si znepratelil honzu a ostatni “asm” mágy) C proto, ze je tam vetsi mnozstvi bank (i kdyz jsou temer shodne).

nectel jsem nikoho urazit :smiley:

já už na tom přemýšlím dlouho a i hledám na netu ale pořád se mi nedaří a C neumím

Tohle byl můj nejoblíbenější pic, před přechodem na řadu 18F

;------------------------------------------------------------------------------
;	zapnutí UARTU
;
;	RYCHLOST 10417 Baud

UART_ON	BANKA3
	MOVLW	.29		;29 - 10417
	MOVWF	SPBRGL
	CLRF	SPBRGH
	MOVLW	B'01000000'	;B'01000000' - 10417
	MOVWF	BAUDCON
	MOVLW	B'00000010'	;B'00100010' - transmitt disabled
	MOVWF	TXSTA
	MOVLW	B'10010000'	;B'10010000' - 10417
	MOVWF	RCSTA
	BANKA0
	RETURN

;-----------------------------------------------------------------------------
UART_TX	BANKA3
	MOVWF	TXREG
	BANKA0
	RETURN

;-----------------------------------------------------------------------------
UART_RX	BANKA3
	MOVF	RCREG,W
	BANKA0
	RETURN

Lada: zavoláš UART_ON a zapneš uart, rychlost 10417 baud, asynchronní přenos jen 8b.
Odesílaný znak nahoddíš do W a zavoláš UART-TX
Příjmutí znaku, UART_RX a ve W máš znak.
PIC provozuju na 20MHz, takže si budeš muset rychlost nastavit podle svých hodin.

Pechyx: Co si Cčkem pomůže když tuhle triviální věc neudělá ani v assembleru? Nepojede mu to úplně stejně.

" zkus treba C… tohle si myslim, ze je jeden z…" -> ZKUS = vyzkouset

myslim, ze by to bylo prehlednejsi a pro nej pochopitelnejsi. Otazka byla “zacatecnicka” ,proto si myslim, ze “Lada” neni clovek, ktery se pohybuje okolo programovani kazdy den. Proto me napadlo C, coz je pro cloveka pochopitelnejsi a prehlednejsi… Programovani MCU je takova kapitola sama pro sebe a je tam spousta HW vazeb… Sam jsem zacinal na PIC a ASM pote jsem plynule :astonished: presel na C, ARM a nyni ARM+linux -> C,C++,Java. Ale opravdu zridka potkam ASM a kdyz ano da to spoustu praci porozumet. Nechci byt nejak hruby a nikoho urazit ale podle mne patri ASM jen do navadecich systemu, bezpecnostnich systemu, systemu zalohy “first data” - UPS systemy nebo jinych SLS (short latenci systems).

Nevim kdo to opravdu je zda ma asm jako povinny jazyk nebo je to 50 muz co se vraci do mladi z Comodora :astonished: . Ale jen jsem myslel, ze by tohle prehlednejsi:. i pro “laika” :

[code]
unsigned char TXdata(unsigned char data);
unsigned char RXdata();
unsigned char PICinit();

unsigned int main ()
{
PICinit();

while(1)
{
   TXdata('A');
}

return(0);

}

unsigned char PICinit()
{
/*
.
.
.
*/
SPBRGH = 29;
TXSTAbits.TXEN = 1;
RCSTA = 0x90;
BAUDCONbits.RCIDL = 1;

return(0);

}

unsigned char RXdata()
{
return (RCREG);
}

unsigned char TXdata(unsigned char data)
{
TXREG = data;
while(!TXSTAbits.TRMT)
continue;
return(/treba/ 1);
}[/code]

tak nevím kde mám chybu snažím se poslat z jedné pic do druhé nějaká data a když v mplab simuluju vysílač tak ten jde ale přímač s tou 16f1936 mi nejde ani v simulátoru ani v reálu.dám sem testovací kod
testuart36.asm (1.54 KB)

asm není muj povinný jazyk ale už v něm nějakou dobu dělám ale zatím nikdy ne komunikaci.zvládám toho už docela dost ale tady jsem se pěkně zasekl a nevím co s tím.jo a na commodore 64 jsem programy dělal a dokonce v turbopascalu.

Mě se nikdy nepovedlo v MPLABU nasimulovat příjem přes UART.

Tady máš moje nastavení UART, PIC na 64Mhz, rychlost 57600. Snad to pomuže. Je to pro 18F46K22,ale REGy jsou stejný,až na PORTy (aspoň doufám :open_mouth: ).

[code]

;portc
clrf LATC
clrf PORTC
movlw b’11011000’ ;0-OUT,1-IN
movwf TRISC

INIT_UART
; make sure pins are setup before calling this routine
; TRISC:6 and TRISC:7 must be set ( as for output, but operates as input/output )
; furthermore its advised that interrupts are disabled during this routine

; setup baudrate
lfsr	0,SPBRG				; setup fsr
MOVLW	0x15
MOVWF	INDF0	; and store it
lfsr	0,SPBRGH				; setup fsr
MOVLW	0x01
MOVWF	INDF0	; and store it
; enable transmitter
lfsr	0,TXSTA				; setup fsr
MOVLW	(1<<TXEN) |(1<<BRGH); preset enable transmitter and low speed mode
MOVWF	INDF0				; and set it

; enable recevier
MOVLW	(1<<SPEN)|(1<<CREN)|(0<<SYNC) ; preset serial port enable and continous recevie
MOVWF	RCSTA	; set it

; enable reciever interrupt
lfsr	0,PIE1				; setup fsr
BsF		INDF0,RCIE ; enable reciever irq

bsf		BAUDCON,BRG16
bcf		BAUDCON,0		;auto off
RETURN[/code]

tak už mi ta komunikace běží.pomohly mi ty vaše příklady tak vám všem moc díky