Det hela ser ut som det vanliga read-modify-write problemet.
Notera att en BSF/BCF operation innebär tre faser. Först läses *hela* porten, sedan ändras den bit man har pekat ut, sist skrivs alla 8 bitarna tillbaka till porten. Det du gör är att först sätta en bit, sedan direkt en annan. Om det nu är så att den första biten är beslastad (med t.ex en viss kapacitans), så kanske den inte har hinnit bli hög innan porten läses igen i det andra BSF kommandot.
Det finns flera sätt att komma runt detta problem :
- Sätt in ett par NOP mellan de två varje BSF/BCF.
- Använd ett "shadow" register.
- Använd LATx registret.
Generellt sätt, bör man inte göra två eller flera BSF/BCF operationer mot *samma* port direkt efter varandra. Det är upplagt för problem, kanske inte märks direkt, men senare när t.ex produkten har hamnat på ett mönsterkort med andra elektriska egenskaper. Om man vill vara riktigt säker skall man *aldrig* gör BSF/BCF direkt mot PORTx registren.
Tyvärr är inte databladet helt tydligt på denna punkt, men det är *inte* en bugg...
> När jag istället kör
> movlw 'b00000101'
> movwf PORTA
Som förväntat.
Prova gärna också med 2-3 NOP's mellan de två BSF.
> märkte just att
> bsf LATA, RA0 ; data mode
> bsf LATA, RA2 ; LCD E-line high
Japp, och orsaken till det framgår av databladet.
LATx är "output latchen", medan PORTx läser från *pinnarna*.
> ett nytt problem uppstod när jag började använda LATA, det går bra
> att köra bsf på LATA, men bcf fungerar inte alls.
Kod exempel !
Vad betyder "fungerar inte alls" ???