Probleem met bij PIC18F47K42 in MikroBasic

Hallo,

Een aantal jaren geleden heb ik lcd_44780 succesvol gebruikt in JAL met PIC16F877.

Nu probeer ik dit zelfde te doen met PIC18F47K42 in MikroBasic Pro for PIC 7.6.

Ik gebruik de project instellingen van in bijlage.
Direct onder "Main:" in het programma heb ik het volgende toegevoegd:

code:


OSCFRQ.FRQ3 = 0
OSCFRQ.FRQ2 = 1
OSCFRQ.FRQ1 = 1
OSCFRQ.FRQ0 = 1

Wat volgens mij resulteert in het gebruiken van de interne oscillator aan 48MHz, welke snelheid ik ook ingegeven heb in de settings van het project in MikroBasic.

Ik heb het schema en het voorbeeld programma gebruikt van deze link: https://download.mikroe.com/documents/compilers/mikrobasic/pic/help/lc….

In het begin komt op het LCD scherm uiterst rechts "O", na een paar seconden wordt het de eerste lijn van het LCD scherm gevuld met "TF". Op de tweede regel wordt nooit iets weergegeven.

Wat doe ik verkeerd?

Met vriendelijke groeten,
Tom

Arco

Special Member

Moet gewoon werken, ik heb nog nooit problemen met een 44780 display gehad in Mikrobasic. (alleen deze processor heb ik nooit gebruikt)
Hoe ziet de source eruit?

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Ik heb het nog eens geprobeerd met mijn oude vertrouwde PIC16F877 (externe oscillator, 20 MHz) en PIC18F4550 (externe oscillator, 48 MHz). Hiermee werkt het prima.

Hierna heb ik het ook geprobeerd met PIC18F45K50 (interne oscillator, 48 MHz). Hiermee heb ik exact hetzelfde probleem als met PIC18F47K42 (interne oscillator, 48 MHz).

Ik heb mijn experimenteerboard altijd exact hetzelfde gelaten, enkel PIC vervangen (+ kristal toegevoegd/verwijderd). Flikkerende leds werken wel steeds. Lijkt mij een hardware probleem uit te sluiten?

Hieronder de volledige source voor PIC18F45K50 en in bijlage de settings.

code:


program MyProject
' Lcd module connections
dim LCD_RS as sbit at RB4_bit
    LCD_EN as sbit at RB5_bit
    LCD_D4 as sbit at RB0_bit
    LCD_D5 as sbit at RB1_bit
    LCD_D6 as sbit at RB2_bit
    LCD_D7 as sbit at RB3_bit

    LCD_RS_Direction as sbit at TRISB4_bit
    LCD_EN_Direction as sbit at TRISB5_bit
    LCD_D4_Direction as sbit at TRISB0_bit
    LCD_D5_Direction as sbit at TRISB1_bit
    LCD_D6_Direction as sbit at TRISB2_bit
    LCD_D7_Direction as sbit at TRISB3_bit
' End Lcd module connections

dim txt1 as char[16]
    txt2 as char[9]
    txt3 as char[8]
    txt4 as char[7]
    i    as byte                 ' Loop variable

sub procedure Move_Delay()       ' Function used for text moving
  Delay_ms(500)                  ' You can change the moving speed here
end sub

main:
'   Main program 
OSCCON.IRCF2 = 1  'INTOSC 16 MHz
OSCCON.IRCF1 = 1  'INTOSC 16 MHz
OSCCON.IRCF0 = 1  'INTOSC 16 MHz
UCFG.FSEN = 1 'USB full speed 48 MHz

TRISA = 0
ANSELA = 0

LATA.0=0
LATA.1=1
delay_ms(500)
LATA.0=1
LATA.1=0
delay_ms(500)
LATA.0=1
LATA.1=1
delay_ms(500)

  TRISB = 0
  PORTB = 0xFF
  TRISB = 0xFF
  ANSELB  = 0

  txt1 = "mikroElektronika"
  txt2 = "EasyPIC6"
  txt3 = "Lcd4bit"
  txt4 = "example"

  Lcd_Init()                     ' Initialize Lcd
  Lcd_Cmd(_LCD_CLEAR)            ' Clear display
  Lcd_Cmd(_LCD_CURSOR_OFF)       ' Cursor off
  Lcd_Out(1,6,txt3)              ' Write text in first row
  Lcd_Out(2,6,txt4)              ' Write text in second row
  Delay_ms(2000)
  Lcd_Cmd(_LCD_CLEAR)            ' Clear display

  Lcd_Out(1,1,txt1)              ' Write text in first row
  Lcd_Out(2,5,txt2)              ' Write text in second row
  Delay_ms(500)

  ' Moving text
  for i=0 to 3                   ' Move text to the right 4 times
      Lcd_Cmd(_LCD_SHIFT_RIGHT)
      Move_Delay()
  next i

  while TRUE                     ' Endless loop
    for i=0 to 7                 ' Move text to the left 8 times
      Lcd_Cmd(_LCD_SHIFT_LEFT)
      Move_Delay()
    next i

    for i=0 to 7                 ' Move text to the right 8 times
      Lcd_Cmd(_LCD_SHIFT_RIGHT)
      Move_Delay()
    next i
  wend
end.
Arco

Special Member

Je zet trisb als inputs (0xFF), dat gaat niet werken...

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Bedankt, daar had ik overgekeken (stond fout in mikrobasic voorbeeld).

Maar dat lost het probleem echter niet op...

In PIC18F45K50 werkt het nu wel wanneer ik een externe oscillator gebruik ipv de interne oscillator.

Bij PIC18F47K42 lukt het mij niet om de externe oscillator aan de praat te krijgen. (Flikkerende leds werken ook niet.)
Ik heb een 20 MHz kristal aangesloten op OSC1 en OSC2.
Config in bijlage en in source code heb ik het volgende toegevoegd:

code:


'NOSC[2:0] = 111 'ext osc
OSCCON1.NOSC2 = 1
OSCCON1.NOSC1 = 1
OSCCON1.NOSC0 = 1
'NDIV[3:0] = 0000 'post divider = 1
OSCCON1.NDIV3 = 0
OSCCON1.NDIV3 = 0
OSCCON1.NDIV3 = 0
OSCCON1.NDIV3 = 0

Wat moet ik nog meer doen om de externe oscillator te gebruiken?

Arco

Special Member

Je hebt ext osc aan staan, gebruik je die ook? (dat wordt maar weinig gebruikt, meestal wordt een gewoon kristal gebruikt)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Ik gebruik een kristal van 20 MHz, dat heb ik aangesloten aan OSC1/RA7 en OSC2/RA6, op beide pinnen ook een 22 pF naar gnd.

Welke andere optie moet ik dan kiezen?

Arco

Special Member

Het is me niet helemaal duidelijk...

Je posts lopen door elkaar met verschillende type pics en interne/externe oscillator/kristal, en wat het probeem is.
Wat werkt er wel/niet en bij welke processor?

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Wat ik wil:
-LCD met PIC18F47K42 op 48 MHz (intern of kristal)

LCD werkt wèl met:
-PIC16F877, kristal, 20 MHz
-PIC18F4550, kristal, 48 MHz
-PIC18F45K50, kristal, 20 MHz

LCD werkt nièt met: (flikkerende leds werken wel met:)
-PIC18F45K50, interne oscillator, 48 MHz
-PIC18F47K42, interne oscillator, 48 MHz

Flikkerende leds werken nièt met:
-PIC18F47K42, kristal, 20 MHz

Ik zie dus een verband dat de interne oscillator een probleem veroorzaakt dat er met een kristal niet is.
Daarom hoop ik dat, wanneer ik een kristal zal gebruiken met PIC18F47K42, het LCD wel zal werken.

Dus op dit moment wil ik PIC18F47K42 aan de praat krijgen met een kristal. En dit is momenteel mijn probleem.

Arco

Special Member

Als de leds wel knipperen met een kristal, en het lcd niet werkt, dan is er iets mis met de instellingen/clockspeed.
Klopte de snelheid wel? (kun je met knipperende led zien)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Ja:

code:


while true
LATA.0=0
LATA.1=1
delay_ms(500)
LATA.0=1
LATA.1=0
delay_ms(500)
wend

Aantal keer geteld dat led van RA0 aangaat per minuut en dit was 60 keer.
Snelheid klopt dus steeds.

Update:

Blijkbaar moet enkel NDIV verder ingesteld worden in programma. Kristal werkt nu wel voor flikkerende leds.

PIC18F47K42: LCD werkt wèl:
-kristal 8 MHz zonder PLL (8MHz CPU)
-interne oscillator 4 MHz, CDIV =4/1 (1 MHz CPU)

PIC18F47K42: LCD werkt nièt: (flikkerende leds werken wel steeds en juiste snelheid)
-kristal 8 MHz met 4x PLL (32 MHz CPU)
-kristal 20 MHz zonder PLL (20 MHz CPU)
-interne oscillator 64 MHz, CDIV 1/1 (64 MHz CPU)

(Een 12 MHz en 48 MHz kristal is onderweg.)