Continue to Site

Welcome to our site!

Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.

  • Welcome to our site! Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.

Pic18f25q10 osccon1 settings swordfish basic

I changed code to this it should be right for 64 mhz but no joy
Code:
Sub SendByte(ByVal DataByte As Byte)
    Dim i As Byte
    
    For i = 0 To 7 ' Loop 8 times for 8 bits
    If DataByte.bits(7 - i) = 1 Then ' Send a '1' bit
        ' Send 1-bit (T1H: ~0.8us HIGH, T1L: ~0.45us LOW)
        ' T1H: 12 instruction cycles (0.75us)
        ' T1L: 7 instruction cycles (0.4375us)
        WS2812BDataPin = 1
        nop ' 62.5ns
        nop ' 125ns
        nop ' 187.5ns
        nop ' 250ns
        nop ' 312.5ns
        nop ' 375ns
        nop ' 437.5ns
        nop ' 500ns
        nop ' 562.5ns
        nop ' 625ns
        nop ' 687.5ns
        nop ' 750ns (approx T1H)

        WS2812BDataPin = 0
        nop ' 62.5ns
        nop ' 125ns
        nop ' 187.5ns
        nop ' 250ns
        nop ' 312.5ns
        nop ' 375ns
        nop ' 437.5ns (approx T1L)
    Else ' Send a '0' bit
        ' Send 0-bit (T0H: ~0.4us HIGH, T0L: ~0.85us LOW)
        ' T0H: 6 instruction cycles (0.375us)
        ' T0L: 13 instruction cycles (0.8125us)

        WS2812BDataPin = 1
        nop ' 62.5ns
        nop ' 125ns
        nop ' 187.5ns
        nop ' 250ns
        nop ' 312.5ns
        nop ' 375ns (approx T0H)

        WS2812BDataPin = 0
        nop ' 62.5ns
        nop ' 125ns
        nop ' 187.5ns
        nop ' 250ns
        nop ' 312.5ns
        nop ' 375ns
        nop ' 437.5ns
        nop ' 500ns
        nop ' 562.5ns
        nop ' 625ns
        nop ' 687.5ns
        nop ' 750ns
        nop ' 812.5ns (approx T0L)
    End If
   Next
End Sub
' Subroutine to send a single color (Green, Red, Blue) to the WS2812B.

I have a module that has these setting

Module myosc

OSCCON1 = $60
OSCFRQ = 8
On test toggle it looks like the OSC is running at 64 mhz
 
But in this code its not outputting the the right data for the ws2812 leds
Code:
'-------------------------------------------------------------------------------
' WS2812B Basic Control Example for Swordfish
' Microcontroller: PIC18F252
' Clock: 20MHz
'
' This code controls a WS2812B LED strip using software bit-banging.
' Timing is CRITICAL for WS2812B. The NOPs in SendByte are adjusted
' for a 20MHz clock (5 MIPS, 200ns per instruction cycle).
'
' You may need to fine-tune the NOP counts slightly for optimal performance
' with your specific LEDs and setup.
'-------------------------------------------------------------------------------

Device = 18f25q10
Clock = 64 ' MHz                                                                                            

' --- Configuration for PIC18F252 @ 20MHz ---
' Using INTRC as an option, but external crystal is more accurate for timing.
' Ensure your crystal and oscillator settings match your hardware.
'Config OSC = HSPLL     ' High-Speed Crystal/Resonator with PLL (for higher speeds like 40MHz)
' If you are actually using a 20MHz crystal without PLL, use HS
' Config OSC = HS
'Config RSTOSC = HFINTOSC_64MHZ
'Config WDT = Off       ' Watchdog Timer Off
'Config MCLRE = On      ' Master Clear Enable
'Config PWRT = On       ' Power-up Timer Enable
'Config BOR = On        ' Brown-out Reset Enable
'Config LVP = Off       ' Low-Voltage Programming Off (good practice for programming stability)
'Config CP0 = Off       ' Code Protection Off

Include "system.bas"    ' for NOP macro
Include "myosc"       ' has these setting    OSCCON1 = $60  OSCFRQ = 8
' --- Pin Definitions ---
Dim WS2812BDataPin As PORTC.2 ' **CHANGE THIS if you use a different pin**
                                 ' (e.g., PortB.0, PortA.5, etc.)

' --- WS2812B Parameters ---
Const NUM_LEDS As Byte = 20 ' **CHANGE THIS to the number of LEDs you have**

' Define the LED color data array (GRB format)
Dim LED_Data(NUM_LEDS * 3) As Byte ' 3 bytes per LED (Green, Red, Blue)


' --- Subroutines ---

' Subroutine to send a single byte (8 bits) to the WS2812B.
' This routine is highly time-sensitive and uses NOPs for precise delays.
' Assumes 20MHz clock (200ns per instruction cycle).
Sub SendByte(ByVal DataByte As Byte)
    Dim i As Byte
   
    For i = 0 To 7 ' Loop 8 times for 8 bits
    If DataByte.bits(7 - i) = 1 Then ' Send a '1' bit
        ' Send 1-bit (T1H: ~0.8us HIGH, T1L: ~0.45us LOW)
        ' T1H: 12 instruction cycles (0.75us)
        ' T1L: 7 instruction cycles (0.4375us)
        WS2812BDataPin = 1
        nop ' 62.5ns
        nop ' 125ns
        nop ' 187.5ns
        nop ' 250ns
        nop ' 312.5ns
        nop ' 375ns
        nop ' 437.5ns
        nop ' 500ns
        nop ' 562.5ns
        nop ' 625ns
        nop ' 687.5ns
        nop ' 750ns (approx T1H)

        WS2812BDataPin = 0
        nop ' 62.5ns
        nop ' 125ns
        nop ' 187.5ns
        nop ' 250ns
        nop ' 312.5ns
        nop ' 375ns
        nop ' 437.5ns (approx T1L)
    Else ' Send a '0' bit
        ' Send 0-bit (T0H: ~0.4us HIGH, T0L: ~0.85us LOW)
        ' T0H: 6 instruction cycles (0.375us)
        ' T0L: 13 instruction cycles (0.8125us)

        WS2812BDataPin = 1
        nop ' 62.5ns
        nop ' 125ns
        nop ' 187.5ns
        nop ' 250ns
        nop ' 312.5ns
        nop ' 375ns (approx T0H)

        WS2812BDataPin = 0
        nop ' 62.5ns
        nop ' 125ns
        nop ' 187.5ns
        nop ' 250ns
        nop ' 312.5ns
        nop ' 375ns
        nop ' 437.5ns
        nop ' 500ns
        nop ' 562.5ns
        nop ' 625ns
        nop ' 687.5ns
        nop ' 750ns
        nop ' 812.5ns (approx T0L)
    End If
   Next
End Sub
' Subroutine to send a single color (Green, Red, Blue) to the WS2812B.
' WS2812B expects GRB order.
Sub SendColor(ByVal Green As Byte, ByVal Red As Byte, ByVal Blue As Byte)
    SendByte(Green)
    SendByte(Red)
    SendByte(Blue)
End Sub

' Subroutine to send all LED data from the buffer to the strip.
' This causes the LEDs to update their colors.
Sub ShowLEDs()
    Dim i As Word
   
    For i = 0 To (NUM_LEDS * 3 - 1) Step 3
        SendColor(LED_Data(i), LED_Data(i + 1), LED_Data(i + 2))
    Next
    ' Send the reset pulse (data line low for > 50us)
    WS2812BDataPin = 0
    DelayUS(60) ' Ensure at least 50us reset pulse (use Delay_us built-in)
End Sub

' Subroutine to set the color of a specific LED in the internal buffer.
' Colors are stored as Green, Red, Blue.
Sub SetLEDColor(ByVal LED_Index As Byte, ByVal Red As Byte, ByVal Green As Byte, ByVal Blue As Byte)
    If LED_Index < NUM_LEDS Then
        LED_Data(LED_Index * 3)     = Green ' Store Green component
        LED_Data(LED_Index * 3 + 1) = Red   ' Store Red component
        LED_Data(LED_Index * 3 + 2) = Blue  ' Store Blue component
    End If
End Sub

' --- Main Program ---
' temp variables
Dim i As Byte
Dim hue As Byte = 0

    ' Initialize the data pin as output low
    Low(WS2812BDataPin)

    ' Clear all LEDs initially (set to off)
    For i = 0 To NUM_LEDS - 1
        SetLEDColor(i, 0, 0, 0) ' All Off
    Next
    ShowLEDs() ' Send all 'off' data to LEDs
    DelayMS(100) ' Small delay for LEDs to update

    ' --- Set some colors for demonstration ---
    SetLEDColor(0, 255, 0, 0)   ' First LED Red
    'SetLEDColor(1, 0, 255, 0)   ' Second LED Green
    'SetLEDColor(2, 0, 0, 255)   ' Third LED Blue
    'SetLEDColor(3, 255, 255, 0) ' Fourth LED Yellow (Red + Green)
    'SetLEDColor(4, 0, 255, 255) ' Fifth LED Cyan (Green + Blue)
    'SetLEDColor(5, 255, 0, 255) ' Sixth LED Magenta (Red + Blue)
    'SetLEDColor(6, 255, 255, 255) ' Seventh LED White (Full Brightness)
    'SetLEDColor(7, 10, 10, 10)  ' Eighth LED Dim White

    ShowLEDs() ' Send the updated data to the LEDs
     'OSCCON1 = $60
    ' OSCFRQ = $08
    ' --- Simple Animation Loop ---
    While (true)
      SetLEDColor(0, 255, 255, 255)   ' First LED white
     ' SetLEDColor(1, 0, 255, 0)   ' First LED Red
     ' SetLEDColor(2, 0, 0, 255)   ' First LED Red
     ' SetLEDColor(3, 0, 255, 0)   ' First LED Red
     ' SetLEDColor(4, 0, 0, 255)   ' First LED Red
     ' SetLEDColor(5, 255, 0, 0)   ' First LED Red
     ' SetLEDColor(6, 0, 255, 0)   ' First LED Red
     ' SetLEDColor(7, 0, 0, 255)   ' First LED Red
     ' SetLEDColor(8, 255, 0, 0)   ' First LED Red
      'SetLEDColor(9, 255, 0, 0)   ' First LED Red
     ' SetLEDColor(10, 255, 0, 0)   ' First LED Red
     ' SetLEDColor(11, 255, 0, 0)   ' First LED Red
     ' SetLEDColor(12, 255, 0, 0)   ' First LED Red
     ' SetLEDColor(13, 255, 0, 0)   ' First LED Red
     ' SetLEDColor(14, 255, 0, 0)   ' First LED Red
     ' SetLEDColor(15, 255, 0, 0)   ' First LED Red
     ' SetLEDColor(16, 255, 0, 0)   ' First LED Red
     ' SetLEDColor(17, 255, 0, 0)   ' First LED Red
     ' SetLEDColor(18, 255, 0, 0)   ' First LED Red
     ' SetLEDColor(19, 255, 0, 0)   ' First LED Red
       
      ShowLEDs() ' Send the updated data to the LEDs.8..
    End While
   
'End Program
 
Are you saying you tried what I suggested and it didn't compile?

Intosc.bas has been included as a standard library file for quite a while now.
 
Compile was fine just clock is running slow like 6 mhz
No i forgot the name and made one but mine missed a lot
But using
Device=18F25Q10
Clock=64
Include "intosc.bas"
I'm still not getting a 64 mhz clock
And I can't figure how to over ride the module SystemTypes I was going to try a crystal
 
Tell me how do you make changes to the system file configuration bits if I add to main code it doesn’t over ride them like how to add the clock out to send the main clock out I think RB6 but it maybe RB7
 
with the code in post #10 I get:
Code:
MAIN
?I000000_F002_001935_M000002 ; L#MK OSCTUNE = INTOSC_OSCTUNE
    MOVLB 14
    CLRF OSCTUNE,1
?I000001_F002_001938_M000002 ; L#MK SET_INTOSC(_clock)
?I000002_F002_001938_M000002 ; L#MK SET_INTOSC(_clock)
    MOVLW 0X60
    MOVWF OSCCON1,1
?I000003_F002_001938_M000002 ; L#MK SET_INTOSC(_clock)
    MOVLW 0X08
    MOVWF OSCFRQ,1
?I000004_END; L#MK
SBGLB2
    SLEEP
    BRA SBGLB2
 CONFIG FEXTOSC = OFF
 CONFIG RSTOSC = HFINTOSC_64MHZ


so it looks like it works for me.

You can add whatever config settings you like to your main program (after all the includes) and they should override any settings)
 
I’ve looked online and everything and today it said pll had to be turn on maybe that did that I’m on a phone but I’ll tell you if it works
The clock on these chips is something else
And there atml looking data sheet are bad
The old ones was better
 
Jerry it worked for me just not 64 MHz clock
It’s starting up at 16 MHz and it never switched to 64 MHz
 
The AI said bit bang at 64 MHz would be better but the problem there was the clock it messed up the timing I’m work on this with your new settings both the bit bang code and the clc code Nigel post has a microchip app note that’s good for ws2812b leds
I’m really not using those but from what the ws2815b data sheet said the timing is same just you have two data lines one is so if a led goes out it don’t kill the whole set and there 12 volt I have 9600 of these on a esp32
The problem is I have older light I’m replacing that are one color the had button to pick colors
The esp 32 uses an app on WiFi 30 controller would kind of bog down the Wi-Fi?
 

Latest threads

New Articles From Microcontroller Tips

Back
Top