Shop OBEX P1 Docs P2 Docs Learn Events
use object across cog — Parallax Forums

use object across cog

NyarlathotepNyarlathotep Posts: 2
edited 2008-08-17 06:18 in Propeller 1
Hi to all.

I have the following code:

CON
  _CLKMODE      = XTAL1 + PLL16X                        
  _XINFREQ      = 5_000_000
  _STACK        = 1024

  UkFormat      = 0                                          'False (zero)
  UsaFormat     = 1                                         'True (non-zero)

VAR

  byte Counter
  byte Secs                                             'Seconds passed
  long StackClock[noparse][[/noparse]18]                                         'Stack space for new cog
  long StackWrite[noparse][[/noparse]18]

OBJ
  LCD : "LCD"
  CommPort : "FullDuplexSerial"
  RTC: "RealTimeClock"
  
PUB MAIN
  
  CommPort.Start(31, 30, 0, 115200)
  'Start Real time clock
  RTC.Start

  RTC.SetTime(07,40,00)                                 
  RTC.SetDate(16,08,08)
  
  'LCD.START

  cognew(CLOCK, @StackClock)
  'cognew(WRITE, @StackWrite)
  
PUB CLOCK

  LCD.START

  repeat
  
    'Wait for next second to pass, rather than constantly sending time/date to debug comms
    Secs := RTC.ReadTimeReg(0)                          'Read current second
    repeat while Secs == RTC.ReadTimeReg(0)             'Wait until second changes

    'Spit out start of message to terminal
    CommPort.Str(String("Time:"))
        
    'Spit out string time to terminal
    CommPort.Str(RTC.ReadStrTime)
    LCD.MOVE(1,4)
    LCD.STR(RTC.ReadStrTime)

    'Spit out more of message to terminal
    CommPort.Str(String("  Date:"))
               
    'Spit out string date to terminal
    CommPort.Str(RTC.ReadStrDate(UkFormat))
    'LCD.STR(String(" "))
    'LCD.STR(RTC.ReadStrDate(UkFormat))

    'Spit out raw data message to terminal
    'CommPort.Str(String("  Raw data: "))
    
    'Repeat Counter from 0 to 5
    '  CommPort.Dec(RTC.ReadTimeReg(Counter))
    '  Commport.tx(" ")

    CommPort.Tx(13)  '<CR>

PUB WRITE

  LCD.START
  LCD.MOVE(3,1)
  LCD.STR(STRING("Prima riga"))



I want to start lcd only once and ti use it with many cogs in cuncurrency, so when with one cog writes the current time, another write temperature.

If I started lcd in main cog with LCD.START, when I start another cog it cannot use lcd. Why?

Thanx

Post Edited (Nyarlathotep) : 8/16/2008 7:04:31 AM GMT

Comments

  • mirrormirror Posts: 322
    edited 2008-08-16 08:52
    Hi, quite a while ago I wrote an object called SerialMirror - http://obex.parallax.com/objects/189/. It's a variation of FullDuplexSerial where the serial port is shared between·from multiple cogs.

    The basic principle requires an understanding of the difference between the VAR and DAT sections of an object. DAT variables are common to all instances of an object, but VAR variables are unique for each instance of the object.

    What you may need to do is a (hopefully minimal) rewrite of the LCD object to move all the variables into the DAT section. It's not too difficult once you get the hang of it!

    ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
  • StefanL38StefanL38 Posts: 2,292
    edited 2008-08-16 17:24
    hello,

    if more than one cog sends data to the LCD it can happen that the serial bitstreams are messed up if two or more cogs send data at the same time

    To avoid this you could use a variablebuffer. ONE cog is dedicated to send the data to the LCD.
    All other cogs write their data into that buffer.

    One principle could be that the LCD-cog writes the complete buffer every second (10times a second).
    Another principle is to use two buffers (Inputbuffer already-written-buffer). Then the LCD-cog compares the content of the two buffers
    and if he detects a difference in the content of a byte then send the new characters
    and after sending it updating the already-written-buffer.

    All methods inside ONE spinfile can share their global variables.
    So you would just define two bytearrays

    best regards

    Stefan
  • John AbshierJohn Abshier Posts: 1,116
    edited 2008-08-16 22:56
    Multiple cogs writing to the LCD is a good place to use a lock. See page 230 of the Propeller manual

    John Abshier
  • NyarlathotepNyarlathotep Posts: 2
    edited 2008-08-17 06:18
    Thanx to all.

    I've used buffers and a new cog to manage lcd (HD44780) and now it works.

    For future reviews, I've attached new code.

    Bye blush.gif
Sign In or Register to comment.