Resultat display
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.
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
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.
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.
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.
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.
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
bsf PIE1, TXIE
bsf PIE1, RCIE
banksel INTCON
bsf INTCON, PEIE
bsf INTCON,GIE
Det som är i rött är tilllagt i efterhand.
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
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
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.
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.
> 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.
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.
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.
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.
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.
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'...