Sterrenhemel

Dit topic is gesloten

Bavelt

Golden Member

Wat zou een goede methode zijn om uC's met elkaar te laten communiceren?
I2C? Of Wellicht UART?

Fouten zijn het bewijs dat je het probeert..
bprosman

Golden Member

Op 6 februari 2021 10:32:00 schreef Bavelt:
Wat zou een goede methode zijn om uC's met elkaar te laten communiceren?
I2C? Of Wellicht UART?

Wat ik zou doen is een UART over RS485, dat is heel robuust.

De jongere generatie loopt veel te vaak zijn PIC achterna.
Lambiek

Special Member

Op 6 februari 2021 10:32:00 schreef Bavelt:
Wat zou een goede methode zijn om uC's met elkaar te laten communiceren?
I2C? Of Wellicht UART?

I2C is voor korte afstanden, tenzij je een I2C expander gaat gebruiken.

Ik zou doen wat bprosman zegt.

Het project zit ook niet echt mee hé. ;(

Als je haar maar goed zit, GROETEN LAMBIEK.
Arco

Special Member

Weet je zeker dat het door de kabels komt? (gebeurt het met korte kabels ook?)
Afstanden tot enkele tientallen meters moet met i2c/spi en goede kabels makkelijk lukken.
(Wij hebben met i2c zelfs netwerkjes van 200m gemaakt zonder ooit enig probleem. Dat was dan wel met de P82B715 i2c extenders)

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

Golden Member

Je kunt ook de kabels van de leds verlengen, zodat je de modules dichter bij elkaar kunt plaatsen.

Je hebt nu de MAX7219 modules achter elkaar staan, wat als je ze nu parallel aansluit? Dan doen de vier vakken wel hetzelfde, maar dat is toch niet erg?

[Bericht gewijzigd door marcob op zaterdag 6 februari 2021 11:07:32 (44%)

People tend to overestimate what can be done in one year and to underestimate what can be done in five or ten years
Bavelt

Golden Member

Op 6 februari 2021 11:05:13 schreef marcob:
Je kunt ook de kabels van de leds verlengen, zodat je de modules dichter bij elkaar kunt plaatsen.

Je hebt nu de MAX7219 modules achter elkaar staan, wat als je ze nu parallel aansluit? Dan doen de vier vakken wel hetzelfde, maar dat is toch niet erg?

Dat was idd een van mijn varianten. Want als de MAX-en dicht bij elkaar staan, werkt het gewoon. Dat de draden naar de leds langer zijn kan geen probleem zijn, omdat daar geen HF-signalen naar toe gaan.

Maar het betekent wel 16 draden van ieder paneel naar de unit met uC en Max-en. is dus 108 draden met een lengte van 30 cm tot 2.40 meter...

Ik kan ze niet parallel schakelen, omdat ieder paneel (matrix) zijn eigen functie heeft.

Op dit moment ben ik de max-printjes aan het modificeren zoals een eerder aangegeven post. Er komen dan weerstanden tussen de Clock en de Load van 2K naar de chips toe.

Het idee hierachter is dat die weerstand samen met de capacitieve ingang van de PIC een soort RC-filer vormt. Helemaal jofel natuurlijk niet, maar het is de moeite van het proberen waard denk ik.
Ik heb er nl al heel veel tijd in gestoken en de panelen staan hier helemaal afgemonteerd...

Als dat niet werkt, dan wordt het ombouwen met idd draden naar de LEDs, danwel een heel ander ontwerp.
En dan maar hopen dat het veel regent buiten :/ , want dat gaat natuurlijk weer een héle portie tijd kosten...

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Misschien dat Arco dat weet:

Ik heb de clockfequentie in het project op 32Mhz staan. Da was ingegeven om een timer-interrupt van 100ns te krijgen.

Maar omdat de SPI2_Init_Advanced niet verder kan delen dan door 64, is de SPI clock daarmee dus 500.000 hZ.

Is het met MikroBasic wellicht toch te regelen om een goede interrupt van 100nS te krijgen en tevens een SPI clock zo laag mogelijk (bv 15 kHz)?

Fouten zijn het bewijs dat je het probeert..
bprosman

Golden Member

Als dat niet werkt, dan wordt het ombouwen met idd draden naar de LEDs, danwel een heel ander ontwerp.

Zoveel anders hoeft het niet te zijn. Zet een processor kort bij de MAX, dan kan de bedrading van de MAX naar de LED's origineel blijven.

De jongere generatie loopt veel te vaak zijn PIC achterna.
Arco

Special Member

Is het met MikroBasic wellicht toch te regelen om een goede interrupt van 100nS te krijgen en tevens een SPI clock zo laag mogelijk (bv 15 kHz)?

Die 100nS zal wel een foutje zijn?... ;) (want dat kan nooit, ik denk dat je 100uS bedoelt?)
Je kunt T2 (timer 2) ook als source voor de SPI instellen, dan loopt die op T2/2 = 5kHz...

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

Golden Member

Op 6 februari 2021 12:57:43 schreef Arco:
[...]
Die 100nS zal wel een foutje zijn?... ;) (want dat kan nooit, ik denk dat je 100uS bedoelt?)
Je kunt T2 (timer 2) ook als source voor de SPI instellen, dan loopt die op T2/2 = 5kHz...

Inderdaad..100uS |:( (Zou anders wel héél rap zijn...)

Ah, dat van die T2 wist ik niet. Dat ga ik dan ook maar eens proberen!

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Ik heb nu:

pic basic code:

SPI2_Init_Advanced(_SPI_MASTER_TMR2, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH)

TMR2 wordt ook gebruikt voor de interrupt.

Maar nu krijg ik geen clock op de SPI..

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Je kunt ook mode 1010 gebruiken:

1010 = SPI Master mode, clock = FOSC/(4 * (SSPxADD+1))

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

Golden Member

Ik vrees dat ik het niet goed doe:

pic basic code:


ssp1con1 = %00001010

Ik las dat SSPM de bits zijn waar het om gaat. Maar SSPM kent-ie niet..

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Met deze constructie:

pic basic code:

SPI2_Init_Advanced(_SPI_MASTER_OSC_DIV64, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH)

  SSP1CON1 = %00001010

Blijft de clock 500.000 Hz..

Maar kan dit zo wel? Eerst op 500.000 Hz en daarna de 0101 mode?

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Op 6 februari 2021 14:33:22 schreef Arco:
Je kunt ook mode 1010 gebruiken:

[...]

Ik ben na wat lees-en speurwerk er uit:

Zo werkt het:

pic basic code:

SSP2ADD  = %11111111
SSP2CON1 = %00101010

Hiermee wordt bereikt dat de Clock van de SPI2 31.250 Khz wordt. Dat is dan volgens mij wel de laagst mogelijke waarde bij een FOsc van 32 Mhz.

Deze frequentie lijkt me aanzienlijk beter ivm de lange draden dan de eerdere 500 kHz.

Of is dat nog te hoog? (wellicht de klokfrequentie FOsc verlagen en een mindere post/prescaler? Ik moet wel de interrupt van 100uS goed houden voor mijn IR-remote).

Fouten zijn het bewijs dat je het probeert..

Op 6 februari 2021 10:32:00 schreef Bavelt:
Wat zou een goede methode zijn om uC's met elkaar te laten communiceren?
I2C? Of Wellicht UART?

Nog beter is CAN-bus. Op lange afstanden is alles wat single wire is gewoon slecht of werkt niet.

Je kunt ook alle TTL signalen die je nu hebt differential maken met een RS485 buffer en 4 twisted-pairs. Kost dan wel veel draden en wat extra ruimte op je printen (of een tijdelijk bijzet printje). Maar dan kun je het bestaande protocol/hardware blijven gebruiken.
Dan zou je voor de data/clock-lijnen een rj45 plug kunnen gebruiken en utp kabel.
Let dan wel op dat de draden 1/2, 3/6, 4/5, 7/8 gepaard zijn.

1-st law of Henri: De wet van behoud van ellende. 2-nd law of Henri: Ellende komt nooit alleen.
Arco

Special Member

SPI moet natuurlijk op een lage bitrate en maar 2.5m kabel ook gewoon werken, is nou niet echt schrikbarend lang.
Beste is een utp/ftp/stp kabel met de met de data aders getwiste 'reserve aders' aan gnd gehangen, en een afsluitweerstand naar Gnd aan het eind.
(beste is 100~120 Ohm, da's de impedantie van de kabel)

Dat is meestal niet haalbaar, omdat de stroom dan te hoog wordt voor de drivers in de master.
Daarom is een serieweerstand van 100~120 Ohm vlakbij de master de een na beste oplossing.

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

Golden Member

Op 6 februari 2021 12:49:00 schreef bprosman:
[...]
Zoveel anders hoeft het niet te zijn. Zet een processor kort bij de MAX, dan kan de bedrading van de MAX naar de LED's origineel blijven.

Dat is juist. Maar dat betekent dan wel voor ieder paneel een eigen uC.

Wanneer ik alle Max-en EN de uC bij elkaar op één printje zet, dan gaan de draden van de MAX-en naar de Leds op de panelen. (Dat zijn dan wel 128 draden: 8 matrixen van 8 rijen en 8 kolommen...)

Dan kan ik wél gebruik blijven maken van de huidige matrix-bedrading op de panelen.
Ik hou deze variant nog even achter de hand, ik test eerst of ik er met SPI uitkom.

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Op 7 februari 2021 11:25:26 schreef Arco:
Beste is een utp/ftp/stp kabel met de met de data aders getwiste 'reserve aders' aan gnd gehangen.

Oops... :X en ik heb alle niet-gebruikte pinnen van de RJ45 chassisdelen afgeknipt.
Waarom?
Dat was bijna onvermijdelijk, omdat die RJ45 jacks geen 0,1" afstand hebben tussen hun pinnetjes en daarom niet passen in een standaard gaatjes board...

(5 lukte nog net wel met wat wringen, duwen en verbuigen..)

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Wat gaat er precies mis en met welke displays? Alleen met de laatst bijgeplaatste of met allemaal?

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

Golden Member

Nou, het lijkt allemaal gelukt nu. :)

De combinatie tussen de Clock van de SPI terug naar 31.250 kHz en het aanbrengen van een weerstand van 2K tussen zowel de CS en de CLK lijn naar de MAX7219 maakt dat het nu werkt!
De Connectors bestaan uit RJ45 chassisdelen, hetgeen veel robuuster is dan Dupont connectors. Je 'klikt' de UTP kabels er op de tast al in.

Ik laat het een nachtje proefdraaien, maar ik heb er nu best wel vertrouwen in.
Zou ook heel fijn zijn, na al het werk dat ik er al heb ingestoken.
Maar wél uiterst leerzaam!

De volgende uitdaging heb ik alweer klaar. In de nachtelijke hemel komt de planeet Mars (licht oranje ledje) op gezette tijden op en vindt zijn weg langs de nachtelijke hemel. Hiervoor heb ik aparte ledjes gemonteerd, in een willekeurig patroon.

Omdat het me leuk lijkt om Mars af en toe lichter/donkerder te laten oplichten, lijkt dit me een typisch 'PWM geval'.
Ik dacht zelf aan een PIC12F1572, omdat deze een 16-bits PWM heeft.

Vanuit de PIC16F18857, mijn hoofdprocessor, laat ik dan een Poort hoog worden, en doorgeven aan de 1572. Die weet dan dat hij Mars moet aansturen en (langzaam) de helderheid moet wisselen.

Wellicht kan het ook slimmer, maar dit leek me wel wat...

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Grappig,
Ik heb al mijn functies in het programma weer ingeschakeld en het werkt.

Alleen zag ik dat ik bij

pic basic code:

Soft_I2C_init() 

het commentaar-vinkje was vergeten weg te helen. Het statement werd dus niet uitgevoerd.

Tóch werkt het als een tierelier..

Blijkbaar geen Init nodig voor de Soft_I2C?

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Ik zoek voor de klok op de sterrenhemel eigenlijk nog een simpele methode om voor de zomertijd een uurje op te tellen.

MikroBasic heeft geen routines om datums met elkaar te vergelijken (zoiets als DateDiff in Visual Basic.NET).

Ik heb zelf al wel eerder een routine hiervoor gemaakt, die een tijdsmoduultje DS1332 schrijft, maar vond ik wel een heel gedoe. (zoals EEProm flash etc).

Wellicht is hier ergens een algortime voor?

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Update: ik zag bij een oude post een bericht van Arco:

pic basic code:

Dim DSTState     As Byte
    OldDSTState  As Byte

Const DSTParm As Byte[16] = (31,5,31,2,3,10,2,3,14,2,7,2,3,11,2,2)

'==============================================================================
Sub Function Is_DST(Dim pZone As Byte) As Byte               'Tests if it's DST
'==============================================================================
  Dim lBegin, lEnd, lZone As Byte
  '----------------------------------------------------------------------------
  If pZone Then
    lZone = (pZone - 1) << 3
    Result = 0
    lBegin = (((5 * tYear) div 4) - (tYear div 100) + (tYear div 400)) Mod 7
    lEnd   = DstParm[lZone+2] - (lBegin+DstParm[lZone+3]) Mod 7
    lBegin = DstParm[lZone+0] - (lBegin+DstParm[lZone+1]) Mod 7
    '--------------------------------------------------------------------------
    If (tMonth <= DstParm[lZone+4]) Or (tMonth >= DstParm[lZone+5]) Then
      If ((tMonth = DstParm[lZone+4]) And (tMonthDay < lBegin)) Or
         ((tMonth = DstParm[lZone+5]) And (tMonthDay > lEnd)) Or
         ((tMonth = DstParm[lZone+4]) And (tMonthDay = lBegin) And (tHour < DstParm[lZone+6])) Or
         ((tMonth = DstParm[lZone+5]) And (tMonthDay = lEnd) And (tHour >= DstParm[lZone+7])) Then
        DSTState = 1
      End If
    End If
    If (tMonth >= DstParm[lZone+4]) Or (tMonth <= DstParm[lZone+5]) Then
      If ((tMonth = DstParm[lZone+4]) And (tMonthDay > lBegin)) Or
         ((tMonth = DstParm[lZone+5]) And (tMonthDay < lEnd)) Or
         ((tMonth = DstParm[lZone+4]) And (tMonthDay = lBegin) And (tHour >= DstParm[lZone+6])) Or
         ((tMonth = DstParm[lZone+5]) And (tMonthDay = lEnd) And (tHour < DstParm[lZone+7]-1)) Then
        DSTState = 2
      End If
    End If
    If DSTState = 0 Then
      If tMonth = DstParm[lZone+4] Then DSTState = 2 Else DSTState = 1 End If
    End If
    If DstState = 2 Then Result.0 = 1 End If
    If DstState = 1 Then Result.0 = 0 End If

    If OldDSTState <>  DSTState Then
      Result.1 = 1
      OldDSTState = DSTState
    Else
      Result.1 = 0
    End If
  End If
End Sub

Zou dus ook bruikbaar kunnen zijn!

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Deze routine geeft terug of een datum wel of niet DST (ofwel zomertijd) is:https://www.circuitsonline.net/forum/view/message/2209204#2209204

edit: Je had 'm al gevonden... ;)

De routine is wat complex, doordat de tijd om 3 uur 's nachts wordt teruggezet, en de tijdstippen 02:00 en 03:00 die nacht dus 2x voorbij komen...
Bij zomertijd is bit 0 gelijk aan '1', anders '0'.
Als er sinds de laatste call van de routine een wijziging is van Z-> W of W->Z dan is bit 1 geset, anders niet.

[Bericht gewijzigd door Arco op woensdag 10 februari 2021 18:59:32 (47%)

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

Dit topic is gesloten