Seriell LCD igen. Hjälp mig...

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Icecap
Inlägg: 26647
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Har du ställd portens TX-pinne till utgång?
Användarvisningsbild
klasg
Inlägg: 187
Blev medlem: 29 juni 2005, 21:12:24

Inlägg av klasg »

Icecap:
Jag har ettställt den pinne.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

klasg skrev:En liten kodsnutt som skickar ut data på tx mottages gärna...
Tror jag säkert... :-) :-)

Men intressantare är hur *din* kod ser ut !
Det kan väll inte vara så många rader, eller ?

Posta din kod så får vi se...
Användarvisningsbild
klasg
Inlägg: 187
Blev medlem: 29 juni 2005, 21:12:24

Inlägg av klasg »

Hehe...Jaja, okejdå sodjan. :)
Kommer efter lunchen någon gång.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Fint !
Jag har säkert någon serie rutin någonstans, men dels så är det säkert
inte för F88'an, dels måste jag leta (tar tid), och det är ju du som
vill ha hjälp, så då använder vi din tid istället... :-) :-)
Användarvisningsbild
klasg
Inlägg: 187
Blev medlem: 29 juni 2005, 21:12:24

Inlägg av klasg »

Hehe...
här kommer koden iaf.
Skratta inte åt den nu bara.
/Klas

EDIT: macrot mdly har inte jag gjort, det har jag kopierat från mikroelektronikas ebook
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Återkommer......
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

OK, håll till godo !
/Janne.



Först kanske det viktigaste...

Har du överhuvudtaget kollat i den LST fil som skapas ?
Då borde du se att det saknas en massa av koden.
Och det beror på att det finns ett "END" i MDLY
makrot (direkt före ENDM). Detta macro kan aldrig ha
fungerat som det ser (såg ut) ut.

Kommentera bort "END" (eller plocka bort det helt)
så kommer all kod med när du bygger applikationen.

Det finns ingen större anöening att kolla vidare innan
detta är testat igentligen, men här kommer några saker
som jag hittade *innan* jag såg END'et... :-)


Varför inte använda den processor include fil som är med MPLAB ?
Är det något speciellt med slcd-p16f688.inc ?

Byt ut
#include "slcd-p16f688.inc"
till
#include "p16f688.inc"
och plocka bort slcd-p16f688.inc från proejtk katalogen.

Det kanske är bättre att köra med BANKSEL konsekvent,
med bank0/bank1 macrona måste du ju själv kolla
att du använder rätt bank. med BANKSEL gör MPASM det
åt dig. Jag har inte verifierat att alla bank0/bank1
är rätt...

När det gäller TRISC, kolla vad det står på sidan 77 i
databladet. Det är i kapitlet om EUSART'en, så det bör
du ha tittat igenom ;-)

Jag får inte ihop värdena för SPBRG. Det verkar
vara för 19.2 kbaoud om BRG=1 och BRG16=0, kolla
en gång till på BAUDCTL i databladet. Jag hittar inte
BAUDCTL i din kod, och även om reset-värderna kanske
är OK, så är det bättre (om inte så för tydlighets
skull) att i alla fall sätta registret som man vill ha det.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Hej.
Ett par andra saker som inte är igentligen "fel", men ändå... :-)

Om du ändrar "cblock 0x20" till "cblock 0x70", behövs varken bankx eller BANKSEL före dina variabler. Se minnesmappen på sida 8 i DB.

Den här delen :

Kod: Markera allt

            movlw   0xfe            ; Value 254 before sending LCD-command.
            movwf   storetx         ; Temp store in memory.
holdtx0 bank0
            btfss    pir1,txif       ; Check before transmitting.
            goto     holdtx0
            bank0
            banksel   storetx
            movfw   storetx
            movwf   txreg           ; Send if it's OK 2 send.
Kan även skrivas (med samma funktion) :

Kod: Markera allt

            movlw   0xfe            ; Value 254 before sending LCD-command.
            bank0
holdtx0
            btfss   pir1,txif       ; Check before transmitting.
            goto    holdtx0
            movwf   txreg           ; Send if it's OK 2 send.
Finns alltså ingen anledning att lägga datat i storetx (om det inte behövs där av någon annan anledning). För just detta exempel ser jag inte att storetx behövs alls.

Sen skulle man kunna skriva t.ex :

Kod: Markera allt

sendchar
              bank0
wait_for_tx
            btfss   pir1,txif
            goto    wait_for_tx
            movfw   txreg
            return
Och sedan (från "main") :

Kod: Markera allt

            movlw  h'FE'
            call      send_char
            movlw  a'1'
            call      send_char
            movlw  h'FE'
            call      send_char
            movlw  a'2'
            call      send_char
            movlw  a'H'
            call      send_char

Så blir det lite mindre kod och lättare att läsa.
Användarvisningsbild
klasg
Inlägg: 187
Blev medlem: 29 juni 2005, 21:12:24

Inlägg av klasg »

Tack för svaret.

Angående labeln end:
Även om jag hade vetat att jag skulle titta i *.lst så hade jag inte vetat vad jag skulle titta efter och alltså inte hittat något fel. Så det var kanon att du hittade det. Jag antar att jag inte kan ta bort end eftersom den används i macrot, men döpt om den har jag gjort. Och då såg det bättre ut i *.lst.

Anledningen till att jag gjorde en egen include-fil för 16F688 var helt enkelt för att jag ville skriva i gemener (och jag ville inte ändra i orginalfilen). Numera vet jag att det finns en inställning i MPLAB så man kan blanda gemener och versaler. Vid vanlig programmering vet jag att man inte bör göra så, men nu gör jag det iaf. Så include-filen är fixad, borttagen.

Jo, det blir kanske lite tydligare med banksel istället för bankX. Fixat.

Jorå, jag har läst sida 77. Då kom jag fram till att jag borde skriva som jag har gjort. (Har väl fel som vanligt) Jag använder ju inte RC, därför tog jag bort den biten.

I tabell 10-3. SYNC = 0, BRGH = 1, BRGH16 = 0. Och för 9.6kbaud står det SPBRG 25. Men jag kanske tittar i fel tabell...

Jag såg att BAUDCTL inte behövde ändras - därför gjorde jag inte det. Men det blir nog tydligare då som du säger.

Trots att jag ändrade dessa saker så funkar det inte. Inte ens när jag ställer RC och de sakerna... Någonting är fel.
/Klas
Användarvisningsbild
klasg
Inlägg: 187
Blev medlem: 29 juni 2005, 21:12:24

Inlägg av klasg »

Svar två:
Storetx hade jag tänkt använda vid interrupt. Men det gör jag inte nu så man kan ju ta bort det. Blir betydligt kortare då också. Men att man inte behöver skriva varken banksel eller bankX om man ändrar till 0x70 fattar jag inte riktigt. Båda ligger väl i bank0 ändå? Kan man inte vara i bank0 hela tiden även fast man har minnesadressen 0x20?
Kanon med så här mycket hjälp. Tack!
/Klas

EDIT: Jag hade tänkt fixa nåt send_char-macro eller liknande men jag var lite lat och kopierade bara den snutt jag hade skrivit och ändrade det som skulle skickas...ska fixa det. Snor kanske den som du skrev.. ;)
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Kör "case insenstive", det är mycket enklare. D.v.s som du gör nu.
Att klicka i rutan är en standard inställning för ett nytt projekt. Borde vara default...

Ta bort END ur makrot. (ENDM måste dock vara kvar).

> "Jag såg att BAUDCTL inte behövde ändras - därför gjorde jag inte det. Men det blir nog tydligare då som du säger."

Det visar att man i alla fall har TÄNKT på det, vilket är värt mycket, både för andra och en själv när man tittar på koden efter ett år. Många rekomenderar att man sätter i princip alla register vid uppstart, bara för att det skall vara tydligt.

> "I tabell 10-3. SYNC = 0, BRGH = 1, BRGH16 = 0. Och för 9.6kbaud står det SPBRG 25."

Jo under "4 Mhz" !! Men eftersom du inte har ändrat default (se sid 23 och ett par frammåt) INTOSC, så går din processor i 8 Mhz. Och där står SPBRG = 51.

Antingen ändrar du hastigheten på INTOSC eller värdet i SPBRG.

Uppdatera gärna (om det inte är för mycket job) din ZIP fil !
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> "Men att man inte behöver skriva varken banksel eller bankX om man ändrar till 0x70 fattar jag inte riktigt."

Kolla vad det står längst ner i bankerna på sid 8 !!

Sista 16 registren "delas" mellan alla fyra bankerna. Det är alltså samma register, eller hur man skall uttrycka det...

EDIT : Varför, kanske du frågar, jo för att få högsta hastighet. Inga banking instruktioner behövs för att accessa dessa sista 16 register...

EDIT2 : Nu blir det "radiotystnad" ett tag, medans jag handlar ett six-pack... :-)
Användarvisningsbild
klasg
Inlägg: 187
Blev medlem: 29 juni 2005, 21:12:24

Inlägg av klasg »

Tja, ursäkta om det dröjde, man jag har varit ute och sprungit, handlat, käkat, och hållit på och rätta till lite i filen.

Här är en uppdatering.
Men jag kan inte testa skiten nu. Bara simulera. Och gör man det så ser man att den bara ligger och stuttsar i sendchar. Så det måste vara någonting fel med USART.
/Klas

EDIT. Självklart har du rätt om baudraten. 51 ska det stå. Borde jag ha fattat.
EDIT. Uppdaterade zipen igen, såg en miss.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Hej.

Kolla TXSTA.TXEN på sid 78. TXEN bör nog vara = 1.

Du ska nog inte testa PIR1.TXIF utan TXSTA.TRMT i sendchar.
TXIF är interrrupt flaggan, och eftersom du aldrig sätter den = 0, så kommer den alltid att vara = 1. OCh dessutom använder du ju inte interrupt.

Om du sätter BRG16=1, så måste du ladda både SPBRGH *och* SPBRG med ett 16 bitars värde enligt tabellen, 207 decimalt, om jag ser rätt (ok, det betyder att den "höga" delen=0, men den låga blir hur som helst inte = d'51'...). Men enligt tabellerna vinner man inget på det, det blir samma "% error" (0.16%) i alla fall.

Det var väll det så här lite snabbt.

Jag körde genom det i MPSIM, och det löpte ienom och stannade i "goto stop", som det ska. Men däremot så är jag inte säker på om USART delen fungerar som den ska...
Skriv svar