PIC18LF452 USART ett rent elände att få igång - några id

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Illuwatar
Inlägg: 2256
Blev medlem: 10 november 2003, 14:44:27
Skype: illuwatar70
Ort: Haninge
Kontakt:

PIC18LF452 USART ett rent elände att få igång - några id

Inlägg av Illuwatar »

Håller på som mest med att försöka få igång USART-delen i en PIC18LF245. Men det vill sig inte - det kommer bara ut slumpmässigt skräp ur porten.

Info:

* PIC'en körs på 5V
* En MAX232ACPE används (även denna går på 5V)
* Loopback-test ända fram till PIC'en är OK (bygling över RC6/RC/, skicka tecken från terminal, samma tecken tas emot utan fel) - nivåomvandlingen och kablar/PCB är OK. PIC'en raderad under detta test (alla pinnar är ingångar då).
* Programmering sker med Wisp628 + XWisp2
* Testprogrammet skrivet i assembler, miljön är MPLAB IDE v7.62
* Det som kommer ur porten är totalt slumpmässigt - det går inte att se något mönster i galenskapen.
* Har testat både med Hyperterminalen och ett annat terminalprogram - ingen skillnad.
* PC'n ställs på 115200, 8/1/None, ingen handskakning (samma som vid loopback-testet).
* Har fått "blinka-LED" programmet att fungera, så PIC'en kan exekvera kod.

Uppkoppling:

* RC6/TX (pin 44) -> T1IN (pin 11)
* RC7/RX (pin 1) -> R1OUT (pin 12)
* T1OUT (pin 14) -> Pin 3 på DSUB9-Male
* R1IN (pin 13) -> Pin 2 på DSUB9-Male
* PIC'en är i TQFP-44, därav bennumreringen (> 40)

Så nu hoppas jag på lite hjälp från alla PIC-gurus här på forumet. Jag har testat det mesta och nu står jag bara och stampar på samma ställe.

Koden för testprogrammet som skickar ut några textsträngar på serieporten. Det är ursprungligen skapat av samma person som ligger bakom Tiny PIC Bootloader för just teständamål (dock med mycket mer textdata). Endast några smärre ändrignar har gjorts (minskat ner mängden text som skickas, sätter RC6 & RC7).

Kod: Markera allt

;Memory filled with strings; All of them are sent only once to UART.
	LIST      P=18F452
	#include "p18f452.inc"
	RADIX DEC

;		__CONFIG	_CONFIG1H, b'11111010'	;_OSCS_OFF_1H & _HS_OSC_1H
;		__CONFIG	_CONFIG2L, _BOR_ON_2L & _BORV_20_2L & _PWRT_ON_2L
;		__CONFIG	_CONFIG2H, _WDT_OFF_2H & _WDTPS_128_2H
;		__CONFIG	_CONFIG4L, _STVR_ON_4L & _LVP_OFF_4L & _DEBUG_OFF_4L
;		__CONFIG	_CONFIG5L, _CP0_OFF_5L & _CP1_OFF_5L & _CP2_OFF_5L & _CP3_OFF_5L
;		__CONFIG	_CONFIG5H, _CPB_OFF_5H & _CPD_OFF_5H
;		__CONFIG	_CONFIG6L, _WRT0_OFF_6L & _WRT1_OFF_6L & _WRT2_OFF_6L & _WRT3_OFF_6L
;		__CONFIG	_CONFIG6H, _WRTC_OFF_6H & _WRTB_OFF_6H & _WRTD_OFF_6H
;		__CONFIG	_CONFIG7L, _EBTR0_OFF_7L & _EBTR1_OFF_7L & _EBTR2_OFF_7L & _EBTR3_OFF_7L
;		__CONFIG	_CONFIG7H, _EBTRB_OFF_7H

	CONFIG OSC=HS, OSCS=OFF
	CONFIG PWRT=ON, BOR=ON, BORV=25
	CONFIG WDT=OFF, WDTPS=128
	CONFIG STVR=ON, LVP=OFF, DEBUG=OFF
	CONFIG CP0=OFF, CP1=OFF, CP2=OFF, CP3=OFF, CPB=OFF, CPD=OFF
	CONFIG WRT0=OFF, WRT1=OFF, WRT2=OFF, WRT3=OFF, WRTB=OFF, WRTC=OFF, WRTD=OFF
	CONFIG EBTR0=OFF, EBTR1=OFF, EBTR2=OFF, EBTR3=OFF, EBTRB=OFF

		
	CBLOCK 0x20
	cnt1
	cnt2
	cnt3
	ax
	ENDC


	variable	_tab_cnt=0

;******************** MACROS **********************
	
SendLWait macro
	btfss PIR1,TXIF		;empty?
	goto $-2
	movwf TXREG
	endm
	
;************************ START *******************

	ORG       0x0000
	goto init
	nop
	nop
	nop


init      
	bsf		TRISC,RC7
	bcf		TRISC,RC6
	movlw	d'10'		; at 20Mhz with 115200 => 10
	movwf	SPBRG		; at  4Mhz with  19200 => 12
	movlw	b'00100100'	; TXEN+BRGH
	movwf	TXSTA

	movlw	b'10010000'
	movwf	RCSTA

start 
	movlw	UPPER Table1
	movwf	TBLPTRU
	movlw	HIGH Table1
	movwf	TBLPTRH
	movlw	LOW Table1
	movwf	TBLPTRL

	movlw	125
	movwf	cnt2
hop2
	clrf	cnt1
hop1	
	TBLRD*+
	movf	TABLAT,	w
	SendLWait
	
	decfsz	cnt1
	goto	hop1
	decfsz	cnt2
	goto	hop2
	goto $			; freeze
	
Table_size set Table1_end - Table1
	messg #v(Table_size)	

;TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT


	ORG 0x200
Table1
	DB	"1. If You can read this, then the UART is working (at least the code that runs it). 1234567890 ABCDEFGHIJKLMNOPQRSTUVXYZ !&#¤%&/()"
	DB	"2. If You can read this, then the UART is working (at least the code that runs it). 1234567890 ABCDEFGHIJKLMNOPQRSTUVXYZ !&#¤%&/()"
	DB	"3. If You can read this, then the UART is working (at least the code that runs it). 1234567890 ABCDEFGHIJKLMNOPQRSTUVXYZ !&#¤%&/()"
Table1_end
	
    END
Senast redigerad av Illuwatar 11 oktober 2007, 18:33:44, redigerad totalt 1 gång.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Kristall/hastighet på processorn ?
Sen ser jag inte att du sätter EECON1, där finns bl.a
bitar som väljer om läsningen ska ske från Flash eller EEPROM...
dangraf
Inlägg: 530
Blev medlem: 9 juni 2003, 15:30:56
Ort: göteborg

Inlägg av dangraf »

Hallå!
nu är jag inte jätteduktig på assebler till PICen, men jag kan kanske ge lite hjälp till självhjälp.

1. har du testat köra din kod i mplabs simulator så att du sett vad som händer i koden och att rätt värden skrivs till registerna?

2. När jag ska få igång hyperteminalen så brukar jag försöka skicka ett känt tecken. t.ex 'U' vilket är samma som 0x55 (vädligt lätt att debugga med ett skåp) och därefter en liten delay. Jag har märkt att hyperterminalen iband kommer "ur synk" ifall jag inte har den lilla delayen vilket gör att om ett tecken blir fel, så blir resten av alla tecken helt fel.

3. Vilken frekvens kör du din processor på? Det ser ut som att den skall köra på 20Mhz enligt koden.

Lycka till!
// Daniel
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Vid 20 Mhz skulle jag vilja ha en 5 Mhz xtal och OSC_HS_PLL.
Men även 20 Mhz och OSC_HS borde fungera...

Men vid den hastighet som krävs (varför köra i 115 Kbaud ??)
så skulle jag antingen välja en "bättre" xtal som går "jämt upp"
i hastighet för att inte få fel i baudrate generatorn, *eller* välja
en modernare variant av PIC18 med 16-bitars baudrate register,
det ger generellt sätt mindre fel. Jag tror att det finns pin-kompatibla
varienter som har den nya EUSART.
Användarvisningsbild
Illuwatar
Inlägg: 2256
Blev medlem: 10 november 2003, 14:44:27
Skype: illuwatar70
Ort: Haninge
Kontakt:

Inlägg av Illuwatar »

Processorn körs på 20 MHz kristall.

Koden är ett exempel taget, inget jag har skrivit själv. Har bara gjort några smärre ändrignar (fick bland annat ändra __CONFIG till CONFIG för att slippa varningar).

Jag är helt ny på PIC. Normalt är det AVR som gäller (och detta har knappast övertalat mig att byta). Jag vill bara få igång en bootloader för Minimig - det är allt. Eftersom bootloadern strular så tänkte jag se om jag kunde skicka lite text via RS232 som test (utesluta hårdvara/PC).

Blir det mer Minimig efter detta kommer jag byta ut PIC'en till en ATmega modell större...

Edit: Bootloadern körs i 115200, därav test med detta. Dennis (mannen bakom Minimig) har ju lyckats med detta (kör med Tiny PIC Boot), dock i en PIC18LF252 i DIP-utförande. Ytmonterat och fler portar (ben) borde inte göra någon skillnad...
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> fick bland annat ändra __CONFIG till CONFIG för att slippa varningar)

Men det är *bara* varningar, du är inte tvingad.
Dock är det nya formatet mer lättläst, så det är lika bra att byta.

Istället för att klaga över bytet av processor så skulle du kunna kolla upp
dina inställningar av EECON1. Om EEPGD är felsatt så kommer dina
table-reads att läsa från EEPROM, och där kan det finnas vad som helst...

> och detta har knappast övertalat mig att byta

Och exakt hur är AVR annorlunda om man gör fel ?

> Processorn körs på 20 MHz kristall.

OK, vad är det beräknade felet i baudrate ?
Just kombinationen 20 Mhz/115 Kbaud saknas i tabellerna i databladet.
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg av speakman »

Förutsatt att du läst den, så kanske PICs datablad inte är så mycket bättre än AVRs ändå ? :)
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Just i det aktuella fallet, så är PIC databladet lite inkonsekvent.
I kapitlet om läsning/skrivning till Flash och EEPROM, så nämns inte
EECON1 under kapitlet "Läsning från Flash". Däremot 2-3 sidor senare
i kapitlet "Läsning från EEPROM" så nämns det att man måste sätta
biten EEPGD i EECON1 korrekt för att välja mellan Flash och EEPROM.

Det hade kunnat nämnas även i Flash-kapitlet.

Hur som helst, försök med att sätta allt korrekt och försök igen.
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg av speakman »

Gör om, gör rätt. :lol:
Användarvisningsbild
Illuwatar
Inlägg: 2256
Blev medlem: 10 november 2003, 14:44:27
Skype: illuwatar70
Ort: Haninge
Kontakt:

Inlägg av Illuwatar »

Jag räknade på baudraten, och med värdet 10 (decimalt) i SPBRG (High-speed aktivt) så blir baudrate = 113 636, vilket ger 1.36% fel.

Hur EEPGD är satt verkar inte ha någon betydelse - det blir lika skräpigt vilket som.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

OK, 1.3 % ska nornalt vara OK.

> Hur EEPGD är satt verkar inte ha någon betydelse

Och CFGS ? Eller RD ?

Har du alls *läst* kapitel 5 om Flash memory ??
Användarvisningsbild
Illuwatar
Inlägg: 2256
Blev medlem: 10 november 2003, 14:44:27
Skype: illuwatar70
Ort: Haninge
Kontakt:

Inlägg av Illuwatar »

Det hela verkar vara skapligt skumt. Testade att sänka hastigheten till 9600 (SPBREG = 129) och då får jag inte ut någonting alls i terminalen. Däremot börjar det pipa i PC-högtalarna... :?

Jag tog en bit färdig kod, då förutsätter jag att det skall fungera. Jag vill bara få in en bootloader, inte utveckla en egen.

Tiny PIC Bootloader, rekommenderas av Dennis själv för att kringgå problemet med 5V ICSP när PIC'en körs på 3.3V.
Användarvisningsbild
ucadv
Inlägg: 203
Blev medlem: 29 januari 2007, 23:13:49

Inlägg av ucadv »

plocka fram skåpet och mät! du kan mäta på uarten (skriv 0x55 i en loop) eller på din blinka-lilla-diod pinne

utifrån det ska du kunna bestämma den faktiska CPU hastigheten.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> då förutsätter jag att det skall fungera.

Hm... Och det är en del av problemet... :-)

> Jag tog en bit färdig kod,

Vilken ?

EDIT:
Jag kollade just genom flera av Dennis filer, och där
hanteras EECON1 korrekt, så vitt jag kan se...
Användarvisningsbild
Illuwatar
Inlägg: 2256
Blev medlem: 10 november 2003, 14:44:27
Skype: illuwatar70
Ort: Haninge
Kontakt:

Inlägg av Illuwatar »

Jag skall mäta lite på det kort som har allt monterat och se om matningsspänningarna från de swichade huvudreggarna är ren eller inte. Kan vara något sådant som spökar också.

Mäta MCU-frekvensen genom att toggla en pinne är nog en bra idé. En instruktion, tar den en klockcykel?


Koden jag vill få in är inte från Dennis (hans är dessutom i C, vilket gör livet lättare), utan denna (original, helt orörd av mig):

Kod: Markera allt

	radix DEC
	LIST      P=18F252	; change also: Configure->SelectDevice from Mplab 
xtal EQU 20000000		; you may want to change: _XT_OSC_1H  _HS_OSC_1H  _HSPLL_OSC_1H
baud EQU 115200			; standard TinyBld baud rates: 115200 or 19200
	; The above 3 lines can be changed and buid a bootloader for the desired frequency (and PIC type)
	
	;********************************************************************
	;	Tiny Bootloader		18F series		Size=100words
	;	claudiu.chiculita@ugal.ro
	;	http://www.etc.ugal.ro/cchiculita/software/picbootloader.htm
	;********************************************************************
	

	#include "../icdpictypes.inc"	;takes care of: #include "p18fxxx.inc",  max_flash, IdTypePIC
	#include "../spbrgselect.inc"	; RoundResult and baud_rate

		#define first_address max_flash-200		;100 words

		__CONFIG	_CONFIG1H, _OSCS_OFF_1H & _HS_OSC_1H
		__CONFIG	_CONFIG2L, _BOR_ON_2L & _BORV_20_2L & _PWRT_ON_2L
		__CONFIG	_CONFIG2H, _WDT_OFF_2H & _WDTPS_128_2H
		__CONFIG	_CONFIG4L, _STVR_ON_4L & _LVP_OFF_4L & _DEBUG_OFF_4L


;----------------------------- PROGRAM ---------------------------------
	cblock 0
	crc
	i
	cnt1
	cnt2
	cnt3
	counter_hi
	counter_lo
	flag
	endc
	cblock 10
	buffer:64
	dummy4crc
	endc
	
SendL macro car
	movlw car
	movwf TXREG
	endm
	
;0000000000000000000000000 RESET 00000000000000000000000000

		ORG     0x0000
		GOTO    IntrareBootloader

;view with TabSize=4
;&&&&&&&&&&&&&&&&&&&&&&&   START     &&&&&&&&&&&&&&&&&&&&&&
;----------------------  Bootloader  ----------------------
;PC_flash:		C1h				U		H		L		x  ...  <64 bytes>   ...  crc	
;PC_eeprom:		C1h			   	40h   EEADR   EEDATA	0		crc					
;PC_cfg			C1h			U OR 80h	H		L		1		byte	crc
;PIC_response:	   type `K`
	
	ORG first_address		;space to deposit first 4 instr. of user prog.
	nop
	nop
	nop
	nop
	org first_address+8
IntrareBootloader
							;init serial port
	movlw b'00100100'
	movwf TXSTA
	movlw spbrg_value
	movwf SPBRG
	movlw b'10010000'
	movwf RCSTA
							;wait for computer
	rcall Receive			
	sublw 0xC1				;Expect C1h
	bnz way_to_exit
	SendL IdTypePIC			;send PIC type
MainLoop
	SendL 'K'				; "-Everything OK, ready and waiting."
mainl
	clrf crc
	rcall Receive			;Upper
	movwf TBLPTRU
		movwf flag			;(for EEPROM and CFG cases)
	rcall Receive			;Hi
	movwf TBLPTRH
		movwf EEADR			;(for EEPROM case)
	rcall Receive			;Lo
	movwf TBLPTRL
		movwf EEDATA		;(for EEPROM case)

	rcall Receive			;count
	movwf i
	incf i
	lfsr FSR0, (buffer-1)
rcvoct						;read 64+1 bytes
		movwf TABLAT		;prepare for cfg; => store byte before crc
	rcall Receive
	movwf PREINC0
	decfsz i
	bra rcvoct
	
	tstfsz crc				;check crc
	bra ziieroare
		btfss flag,6		;is EEPROM data?
		bra noeeprom
		movlw b'00000100'	;Setup eeprom
		rcall Write
		bra waitwre
noeeprom
		btfss flag,7		;is CFG data?
		bra noconfig
		tblwt*				;write TABLAT(byte before crc) to TBLPTR***
		movlw b'11000100'	;Setup cfg
		rcall Write
		bra waitwre
noconfig
							;write
eraseloop
	movlw	b'10010100'		; Setup erase
	rcall Write
	TBLRD*-					; point to adr-1
	
writebigloop	
	movlw 8					; 8groups
	movwf counter_hi
	lfsr FSR0,buffer
writesloop
	movlw 8					; 8bytes = 4instr
	movwf counter_lo
writebyte
	movf POSTINC0,w			; put 1 byte
	movwf TABLAT
	tblwt+*
	decfsz counter_lo
	bra writebyte
	
	movlw	b'10000100'		; Setup writes
	rcall Write
	decfsz counter_hi
	bra writesloop
waitwre	
	;btfsc EECON1,WR		;for eeprom writes (wait to finish write)
	;bra waitwre			;no need: round trip time with PC bigger than 4ms
	
	bcf EECON1,WREN			;disable writes
	bra MainLoop
	
ziieroare					;CRC failed
	SendL 'N'
	bra mainl
	  
;******** procedures ******************

Write
	movwf EECON1
	movlw 0x55
	movwf EECON2
	movlw 0xAA
	movwf EECON2
	bsf EECON1,WR			;WRITE
	nop
	;nop
	return


Receive
	movlw xtal/2000000+1	; for 20MHz => 11 => 1second delay
	movwf cnt1
rpt2						
	clrf cnt2
rpt3
	clrf cnt3
rptc
		btfss PIR1,RCIF			;test RX
		bra notrcv
	    movf RCREG,w			;return read data in W
	    addwf crc,f				;compute crc
		return
notrcv
	decfsz cnt3
	bra rptc
	decfsz cnt2
	bra rpt3
	decfsz cnt1
	bra rpt2
	;timeout:
way_to_exit
	bcf	RCSTA,	SPEN			; deactivate UART
	bra first_address
;*************************************************************
; After reset
; Do not expect the memory to be zero,
; Do not expect registers to be initialised like in catalog.

            END
Skriv svar