Resultat display

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Stewal
Inlägg: 354
Blev medlem: 17 januari 2008, 16:38:41
Ort: Nämdö

Inlägg av Stewal »

Tackar!
Stewal
Inlägg: 354
Blev medlem: 17 januari 2008, 16:38:41
Ort: Nämdö

Inlägg av Stewal »

Jag har kortat ner koden för att se om data tas emot och visas på displayen, men när jag startar upp så händer inget.
Den kör igenom koden, för man ser att adr. pinnarna har ändrats.
Jag sänder en ascii kod från datorn, kan va bra att tillläga,

Här är koden, är det någon som kan se något fel?

Vill även passa på och tacka Sodjan för ASM koden, som i sitt ursprung är till en DLR3416.

Kod: Markera allt

;*******************************************************
 list      p=16f886             ; list directive to define processor
 #include <p16f886.inc>         ; processor specific variable definitions
; 
 __CONFIG _CONFIG1, _DEBUG_OFF & _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF & _CPD_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
 __CONFIG _CONFIG2, _WRT_OFF & _BOR21V
;
    errorlevel -302 
;**********************************************************************
    #define     DLR3416_A0      PORTA, 0
    #define     DLR3416_A1      PORTA, 1
    #define     DLR3416_A2      PORTA, 2
    #define     DLR3416_WR      PORTA, 3
    #define     DLR3416_DATA    PORTB
;**********************************************************************
RESET_VECTOR    CODE    0x000       ; processor reset vector
     goto    start                  ; go to beginning of program
INT_VECTOR      CODE    0x004       ; interrupt vector location
        retfie                      ; Ingen interrupt kod...
;**********************************************************************
MAIN    CODE
start
        banksel ansel               ; Stäng av alla analoga funktioner
        clrf    ansel
        clrf    anselh
        banksel trisa               ; Alla pinnar utgångar...
        clrf    trisa
        clrf    trisb
        banksel portc
        clrf	portc
		banksel	trisc
		movlw	b'10000000'
		movwf	trisc
        banksel intcon
        clrf    intcon
        banksel porta               ; se till att vi är på bank 0...
;************************************************************
        call        delay_1s
        bsf         dlr3416_wr
;Sätt en Async Rx
	bsf	STATUS, RP0
	bcf	TXSTA, SYNC	;Async kommunikation
	bcf	TXSTA, BRGH	;Låg klock hastighet
	movlw	B'00011001'	;Sätt Baudrate till 2400
	movwf	SPBRG
	bsf	RCSTA ^ 0x080, SPEN	;Starta serial port
	bcf	RCSTA ^ 0x080, RX9	;Sätt 8 bits mottagning
;Ta emot data
	btfss	PIR1, RCIF		;Väntar på att tecken
	goto	$-1
	movf	RCREG, w		;Ta mottaget tecken
	movwf	DLR3416_CHAR
	bcf	PIR1, RCIF		;Återställ Rx 
;************************************************************
DLR3416_VARS    UDATA_SHR       ; Starta ny data-section.
DLR3416_CHAR    RES 1           ; Tecken som ska skrivas.;
;
DLR3416_CODE        CODE        ; Starta ny code-section.
; Lägg först ut tecknet på datapinnarna.
        movf        dlr3416_char, w
        movwf       dlr3416_data
; Det följande är för att sätta rätt adress
; på A0,A1 och A2 .
		bsf         dlr3416_a0          
        nop
        bsf         dlr3416_a1			
        nop
        bcf         dlr3416_a2			
        nop
        goto        toggle_wr
;
toggle_wr
        bcf         dlr3416_wr          ; Skriv till displayen.
        nop
        bsf         dlr3416_wr
        nop        
;
        return
;**********************************************************************
DLY_VAR      UDATA_SHR
d1           RES 1
d2           RES 1
d3           RES 1
;
DLY_CODE        CODE
;
delay_1s
 movlw 0x08
 movwf d1
 movlw 0x2F
 movwf d2
 movlw 0x03
 movwf d3
Delay_1s_0
 decfsz d1, f
 goto $+2
 decfsz d2, f
 goto $+2
 decfsz d3, f
 goto Delay_1s_0
 goto $+1
 nop
    return
;************************************************************
    end
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Jag har inte kollat allt i detalj, men bara en praktiskt detalj.

Det kan vara bra vid felsökning om du direkt skickar tillbaka
samma teckan som du får från datorn, om du t.ex använder
HyperTerm eller liknande, så får du då direkt ett kvitto
på att det har tagits imot av PIC'en.

Ett par andra småsaker...

I denna kod ändras inte OSCCON, d.v.s att den går på default 4 MHz.
Är SPBRG beräknat till 4 MHz hastighet ?

När man sätter ett register som SPBRG så är det mer praktiskt att
ange värdet decimalt, då är det lättare att härleda det tillbaka till
formlerna utan att behöva "översätta" B'00011001' till ett värde.
I andra fall är det ofta viktigt att veta vilka *bitar* som sätts, som
t.ex för TRIS registrerna eller då de olika bitarna har helt olika
funktion.

> bsf RCSTA ^ 0x080, SPEN
> bcf RCSTA ^ 0x080, RX9

Det kanske fungerar men personligen föredrar jag :

> banksel RCSTA
> bsf RCSTA , SPEN
> bcf RCSTA , RX9

Och byt ut "bsf STATUS, RP0" mot "banksel TXSTA". Det blir
tydligare (och mindre risk för fel).

Sen, jag tar tillbaka det där om att att "RCSTA ^ 0x080" skulle fungera,
det gör det inte. bank-bitarna i STATUS kommer ändå att vara fel (för att
skriva till RCSTA).

Så, gödsla med banksel tills allt fungerar, då kan du (om det behövs)
gå igenom och trimma bort de banksel som kanske är onödiga.
Stewal
Inlägg: 354
Blev medlem: 17 januari 2008, 16:38:41
Ort: Nämdö

Inlägg av Stewal »

Skicka tillbaka samma tecken
Har gjort en ny kod snutt, som skall skicka tillbaka tecknet.
Men det kommer inte tillbaka något, mer än 00 vid uppstart och om man loopar koden.


Är SPBRG beräknat till 4 MHz hastighet ?
Ja, den är uträknad på en klockfrekvens på 4 MHz

SPBRG, så är det mer praktiskt att ange värdet decimalt
Har ändrat det till d'25' som är värdet för 2400 baud på en klockfrekvens på 4 MHz.

Kod: Markera allt

;Sätt en Async Rx
	banksel	TXSTA
	bcf	TXSTA, SYNC	;Async kommunikation
	nop
	bcf	TXSTA, BRGH	;Låg klock hastighet
	nop
	bcf	TXSTA, TX9	;Sätt 8 bits sändning
	nop
	bsf	TXSTA, TXEN	;Sätt data sändning
	banksel	SPBRG
	movlw	d'25'	                ;Sätt Baudrate till 2400, SPBRG value=25
	movwf	SPBRG
	nop
	banksel RCSTA		
	bsf 	RCSTA, SPEN	;Starta serial port
	nop
	bcf	RCSTA, RX9	;Sätt 8 bits mottagning
;		
;Ta emot data
	btfss	PIR1, RCIF		;Väntar på att tecken skall tas emot
	goto	$-1
	movf	RCREG, w		;Ta mottaget tecken
;Sänd mottaget data
	movwf	TXREG
	bcf	PIR1, RCIF		;Återställ Rx
banksel PIE1
bsf PIE1, TXIE
bsf PIE1, RCIE
banksel INTCON
bsf INTCON, PEIE
bsf INTCON,GIE


Det som är i rött är tilllagt i efterhand.
Tottish
Inlägg: 847
Blev medlem: 30 juni 2007, 19:11:37
Ort: Oslo, Norge

Inlägg av Tottish »

Om du inte lyckats ta emot något vettigt i datorn så tycker jag att du ska börja med det. Gör en kod som konsekvent skickar tex. h'55' så länge du håller in en knapp. På så vis får du reda på om det är sändningen eller mottagningen som går åt pipan.
Anlednignen till att använda tex h'55' är att den har lika många ettor som nollor i sänd-sekvensen vilket betyder at en multimeter på TX-pinnen borde visa ett värde mellan 0 och 5V. Antar att du inte har tillgång till oscilloskop eftersom du då borde använt det för felsökning.

Om du gör detta så isolerar du problemet/problemen lite mer och kan arbeta vidare när du får mottagningen i datorn att funka.

Jag kan inte direkt se några fel i din kod men jag är inte så bra på det här med ASM heller. Ovanstående tips är mer generell angreppsteknik på problem. Gör alltid ett så enlkelt test som möjligt från början och bygg utifrån det. Jag vet att det är lockande att göra hela koden på en gång och sen hoppas att det funkar men det är tyvärr inget att rekomendera.

MVH
/Tottish
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Håller helt med Tottish, bryt ner det i delsystem och testa av en del i taget!

Felsökning kurs 1A....
Stewal
Inlägg: 354
Blev medlem: 17 januari 2008, 16:38:41
Ort: Nämdö

Inlägg av Stewal »

Låter bra att dela upp det i delar och tasta en del i taget.

Har kopplat lysdioderna till Tx och Rx mellan MAX232 och PIC´n, så det syns om data skickas eller tas emot. Som det är nu kommer data in från PC´n till PIC´n.
Får göra en kod som skickar data ut och se om det fungerar den vägen.
Stewal
Inlägg: 354
Blev medlem: 17 januari 2008, 16:38:41
Ort: Nämdö

Inlägg av Stewal »

Då kan jag meddela att jag fick igång både sända från datorn och få tillbaka data.
Innan jag bestämde mig för att gå igenom del för del.
Så satte ja alla värdena på TXSTA och RXSTA, alltså även dom som inte behövs sättas.

Det enda nu är att den loopar värdet jag skickad från datorn, så det ligger kvar i minne w.

Så nu kan man börja kolla på koden för sänd och ta emot, varför den loopar.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Så satte ja alla värdena på TXSTA och RXSTA, alltså även dom som inte behövs sättas.

Generellt alltid rekomederat. Sätt alla bitar så som du vill ha dom, även om
det (enligt databladet) kanske är samma som "default". Lite inte på det!
Dessutom så syns det i koden att du faktiskt har tänkt över det, och inte
bara missat någon inställning.

Förresten, Vad var det för inställning som var fel ??

> Det enda nu är att den loopar värdet jag skickad från datorn,

Hur menar du med "loopar" ? Får du tillbaka fler tecken till PC'n än du skickar ?

> så det ligger kvar i minne w.

Ser inte kopplingen till ovanstående.
Stewal
Inlägg: 354
Blev medlem: 17 januari 2008, 16:38:41
Ort: Nämdö

Inlägg av Stewal »

Förresten, Vad var det för inställning som var fel ??
Har raderat och gjort om det hela endel, men tror det var RCSTA, CREN som inte var satt.

Hur menar du med "loopar" ? Får du tillbaka fler tecken till PC'n än du skickar ?

DEt var så att om jag skickade in ascii kod 31, så sände picen tillbaka 31 hela tiden. Alltså den loppade ut 31 hela tiden.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

OK, låter som något problem med checken av flaggorna för t.ex RXREG.
Det finns ingen komplett och aktuell kod just nu, så det är svårt att säga
något närmare. Bara att felsöka alltså... :-)
Stewal
Inlägg: 354
Blev medlem: 17 januari 2008, 16:38:41
Ort: Nämdö

Inlägg av Stewal »

Jag hittade ett bra kod ex. på nätet och har börjat bygga ny kod efter det. Den innehåller bl.a check av 'frame error' och 'overflow', vilket kan va bra att ha om något av dom felen skulle uppstå.
Stewal
Inlägg: 354
Blev medlem: 17 januari 2008, 16:38:41
Ort: Nämdö

Inlägg av Stewal »

Ha nu stöt på ett mycket lustigt problem kommer inte för bi en viss rad.

Koden stannar innan loop, RA0 blir låg och sen händer inget mer.

Kod: Markera allt

         bcf            dlr3416_A0 ;sätt lysdiod låg på ra0
loop
	bcf            dlr3416_A1 ;sätt lysdiod låg på ra1
	call	datain		
	call	transmit
;
	bsf	DLR3416_wr  ;sätt lysdiod hög på ra3
	bsf	DLR3416_A2 ;sätt lysdiod hög på ra2
	bsf	DLR3416_A1 ;sätt lysdiod hög på ra1
	bsf	DLR3416_A0 ;sätt lysdiod hög på ra0
	goto	loop
datain
	bcf     dlr3416_a2 ;sätt lysdiod låg ra2
	btfsc	RCSTA, OERR
	bcf	DLR3416_wr ;sätt lysdiod låg på ra2
	goto	overerror		;om 'overflow error'...
	btfsc	RCSTA, FERR
	goto	frameerror	;om 'framing error'...
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Koden stannar innan loop,

Det tror jag inte på. Det finns inget där som får den att "stanna".
Och en PIC "stannar" i princip aldrig, den gör alltid någonting, det gäller
bara att hitta vad... :-)
Stewal
Inlägg: 354
Blev medlem: 17 januari 2008, 16:38:41
Ort: Nämdö

Inlägg av Stewal »

Har provat ta bort, loop men den kommer aldrig till call kommandot.
Då RA1 inte blir satt låg.

Får väl ta och titta på koden innan och se om det är något som gör att den inte går vidare.
Skriv svar