Seriell LCD igen. Hjälp mig...
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
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
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.
/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.
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 :
Kan även skrivas (med samma funktion) :
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 :
Och sedan (från "main") :
Så blir det lite mindre kod och lättare att läsa.
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.
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.
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
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.
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
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
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..
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..

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 !
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 !
> "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...
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...

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.
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.
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...
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...