PicBasic, GLCD en 16F886

JoWi

Special Member

In een project met een Samsung GLCD heb ik de 16F876A vervangen door een 16F886.
Volgens Murphy werkt het dan niet meer.

Van de 16F886 de errata-sheet en migration guide doorgespit, maar volgens mij heb ik alles wel afgevangen.

Zie het onderstaande programma, met een 876A werkt het foutloos. Met de 866 knippert het ledje vrolijk maar blijft het display blanko. Er zitten dus geen fouten in de bedrading op het breadboard.

code:

Device 16F886                           ;Device used
@CONFIG_REQ
@__CONFIG _CONFIG1, XT_OSC & WDT_OFF & PWRTE_ON & LVP_OFF & BOR_OFF & IESO_OFF

;Device 16F876A
;CONFIG XT_OSC, WDT_OFF, PWRTE_ON, LVP_OFF

XTAL = 4                                ; 20 MHz Xtal
           
Symbol  LCD_RESETPIN    PORTC.3         ; Graphic LCD resetlijn
Symbol  LED_ERRORPIN    PORTC.7         ; Error signal (led or buzzer)
                                        
Declare LCD_TYPE        SAMSUNG         ; Graphic LCD definitie
Declare LCD_DTPORT      PORTB
Declare LCD_RWPIN       PORTC.4
Declare LCD_RSPIN       PORTC.5
Declare LCD_ENPIN       PORTC.6
Declare LCD_CS1PIN      PORTC.0
Declare LCD_CS2PIN      PORTC.1
Declare INTERNAL_FONT On
Declare FONT_ADDR = 0

TRISA   = %11111111                     ; Definieer I/O lijnen
TRISB   = %00000000
TRISC   = %00000000
ANSEL   = %00000000                     ; 16F886
ANSELH  = %00000000                     ; 16F886
ADCON0  = %00000000                     ; 16F886
CM1CON0 = %00000000                     ; 16F886 
CM2CON0 = %00000000                     ; 16F886 
CM2CON1 = %00000010                     ; 16F886 

DelayMS 1000                            ; Power up delay
LCD_RESETPIN = 0                        ; Reset de display controller
DelayMS 20                              ; Pull ~RST low for 20 milliseconds
LCD_RESETPIN = 1
DelayMS 20
Cls                                     ; clear screen

Print At 0, 2, "GLCD TESTPROGRAMMA"

While 1==1
  Toggle LED_ERRORPIN                   ; Indicator for loop speed
  DelayMS 200
Wend

Include "FONT.BAS"
      
End

Er zitten wat overtollige regels in (de comparatorinstelling zijn al default na een reset, maar ik weet niet of PicBasic er zelf iets mee doet).

Mis is iets of moet ik de assembly output doorspitten (in welk geval ik net zo goed assembly had kunnen gebruiken.) ???

Ignorance is bliss
JoWi

Special Member

Ik ben een klein stapje verder: De LINE en PLOT commando's werken gewoon. Maar het printen van tekst (PRINT AT) dus niet.

Iemand een idee, ik gebruik een internal font.

Ignorance is bliss

BOX, CIRCLE, LINETO, UNPLOT, enz. werken ook?

[Bericht gewijzigd door Frits Kieftenbelt op zaterdag 12 april 2008 10:56:42 (19%)

Ohm sweet Ohm | www.picbasic.nl

Ik weet niet of het wat uitmaakt, maar ik gebruik:

Include "FONT.INC"
ipv:
Include "FONT.BAS"

En wacht nog even 100 ms ofzo na de eerste CLS, die schermen zijn erg trage dingen in verhouding met een uC.

EDIT: ik zie nog iets.
Je hebt staan:

code:


Declare LCD_TYPE        SAMSUNG         ; Graphic LCD definitie
Declare LCD_DTPORT      PORTB
Declare LCD_RWPIN       PORTC.4
Declare LCD_RSPIN       PORTC.5
Declare LCD_ENPIN       PORTC.6
Declare LCD_CS1PIN      PORTC.0
Declare LCD_CS2PIN      PORTC.1
Declare INTERNAL_FONT On
Declare FONT_ADDR = 0

Al deze declares zijn niet nodig, en geven bij mij ook een foutmelding.
Je moet er dit van maken:

code:


LCD_DTPORT = PORTB
LCD_RWPIN = PORTC.4
Enz.

Dit geld ook voor INTERNAL_FONT en FONT_ADDR.

Je zult ook zien dat deze woorden een andere kleur krijgen, bij mij rood.

[Bericht gewijzigd door René Kramer op zaterdag 12 april 2008 11:47:11 (61%)

Ook tegenwind gaat liggen.
JoWi

Special Member

"FONT.BAS" is een copy van "FONT.INC".
Als je in de documentatie kijkt zie je dat

code:

Declare LCD_TYPE SAMSUNG

en

code:

LCD_TYPE = SAMSUNG

equivalent zijn.

Het identieke programma WERKT op een 16F876A !!!!

@Frits: Circle, Box enzo werken allemaal, maar als je EERST een PRINT statement aanroept dan weer niet.

Ik denk er nu over om de assembly output van de 16F876A gecompileerde output eens te plakken in de 16F866 code en dat door MPASM te sleuren.Als het dan wel werkt maakt Crownhill er een zootje van in zijn print statement voor de 16F866.

Dat is nog niet zo simpel, want de adressen van de variabelen verschuiven.... En ook de SFR's zitten niet allemaal op dezelfde plek

Ignorance is bliss

Ikzelf heb nog niets gedaan met een grafisch display (druk, druk), maar heb je dit ook nog geprobeerd.
DECLARE LCD_TYPE = GRAPHIC

Ohm sweet Ohm | www.picbasic.nl

Misschien een digitaal/analoog lijntje fout?
In de 16F877 is een pin bijv. digitaal en in 16F866 analoog
Daar had ik laatst ook gekloot mee, de halve dag mee vergooit

JoWi

Special Member

Op 12 april 2008 12:58:36 schreef Boeip:
Misschien een digitaal/analoog lijntje fout?

Daar is dit stuk voor:

code:

ANSEL   = %00000000                     ; 16F886
ANSELH  = %00000000                     ; 16F886
ADCON0  = %00000000                     ; 16F886
CM1CON0 = %00000000                     ; 16F886 
CM2CON0 = %00000000                     ; 16F886 
CM2CON1 = %00000010                     ; 16F886 
Ignorance is bliss
JoWi

Special Member

Het probleem is gevonden: Het betreft een bug in de PICBASIC compiler.

Je kan eromheen werken door de assembler output van de compiler te patchen.
Maar tot die tijd: Geen 16F886 met een Samsung LCD gebruiken als je ook tekst wil printen met INTERNAL_FONT = 1.

Kan ik erachter komen hoe snel de support van Crownhill is :)
De oplossing van het probleem hebben ze al. :) :)

Ignorance is bliss