Modules identificeren met microcontroller?

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Jim80
  • Registratie: November 2019
  • Laatst online: 13-09 22:25
Voor de elektronica-freaks:

Kort samengevat werk ik aan een controllerbord met een ATMEGA controller om allerlei dingen aan te sturen (relais, thermometers, cv ketel, ultrasoon afstandsmeter, stappenmotor, drukknoppen, led's, RS422...)

Op dit controllerbord kunnen tot 8 kleine printjes zoals lego geprikt worden, en het geheel kan dan in een DIN-rail behuizing worden ingebouwd waarbij je dus zo'n din-module zelf kan samenstellen met aansluitingen naar keuze.

Ik zoek een manier waarop de controller het type van elk opgeklikt printje kan identificeren (en ook de plaats!) zodat de software weet of er bijvoorbeeld een drukknop of stappenmotor aan hangt. De vereisten zijn:
  • Spotgoedkoop en weinig componenten
  • Slechts 1 pin in gebruik van de module-connector
  • Max 2 pinnen van de CPU, mag analoog zijn. I2C is reeds aanwezig en telt niet mee als extra pin
  • Minimaal 100 types module identificeerbaar
  • Op een module is héél weinig plaats, een SOIC-8 zou reeds te veel andere nuttige PCB ruimte wegnemen
Ik heb reeds een oplossing die 2 pinnen van een module connector gebruikt. Deze vereist slechts 1 weerstand op de module (kleiner en goedkoper kan niet!). Elk type module krijgt dan een andere weerstandwaarde. Op het controllerbord zit dan een i2c i/o expander die elke module-weerstand afzonderlijk kan activeren met een spanningsdeler, waarbij de waarde dan bepaald kan worden met een ADC input van de MCU.

Ideaal zou de moduleweerstand op de module aan 1 kant verbonden zijn met GND of 3,3v zodat er nog maar 1 pin gebruikt wordt voor identificatie. Maar dan zou ik een 8-channel ADC nodig hebben op i2c en dat is niet meer zo gemakkelijk of goedkoop te vinden.

Iemand soms een idee om het met 1 pin te doen op de connector?

Afbeeldingslocatie: https://tweakers.net/i/LPJYbYbQK71aUZ6D-G6H9Cc2Yqs=/800x/filters:strip_exif()/f/image/S4Hn6U6k722LVmgXIm1C8Fts.png?f=fotoalbum_large

Afbeeldingslocatie: https://tweakers.net/i/sSdTuRWszhqRj8GLvIAx9jw5Fr4=/800x/filters:strip_exif()/f/image/I8Q4cYFDcpKfdskCVBvJsFuo.png?f=fotoalbum_large

[ Voor 7% gewijzigd door Jim80 op 19-06-2023 07:47 ]


Acties:
  • 0 Henk 'm!

  • Jim80
  • Registratie: November 2019
  • Laatst online: 13-09 22:25
@jeroen3 De MCU zou ook nog moeten weten op welke connector elke module zit, anders kan hij die nooit aansturen want elke module heeft dedicated i/o pins van de MCU. Met een 1-wire EEPROM weet je wel welke modules er allemaal zijn, maar niet waar ze zitten.

Ik heb m'n post met deze vereiste aangepast...

Acties:
  • 0 Henk 'm!

  • memphis
  • Registratie: Oktober 2000
  • Laatst online: 16:31

memphis

48k was toen meer dan genoeg.

Ik zie ontwerpers een simpele spanningsdeler gebruiken als revisie detectie. Een bepaalde spanningsgebied staat voor een bepaalde revisie.

Er zijn mensen die mij een GOD vinden


Acties:
  • +1 Henk 'm!

  • jeroen3
  • Registratie: Mei 2010
  • Nu online
Die snap ik niet zo goed. Je weet toch op welke pin welk single-wire device antwoord geeft?
Als je niet voldoende vrije pinnen op je atmega hebt kun je een mux toevoegen, je hebt al i2c dus dat moet haalbaar zijn.
Je moet toch muxen op pinnen op één manier tenzij je een daisy-chain methode gaat gebruiken, maar dat kost twee pinnen per module. (en een protocol zoals WS2812B)

[ Voor 5% gewijzigd door jeroen3 op 19-06-2023 08:26 ]


Acties:
  • 0 Henk 'm!

  • Jim80
  • Registratie: November 2019
  • Laatst online: 13-09 22:25
@jeroen3 De vereiste was inderdaad max 2 pinnen op de CPU. Maar inderdaad, met de i2c i/o expander zou ik elke chip kunnen bit-bangen en dan heb ik zelfs geen extra i/o nodig. Geeft wel een enorme overhead maar dit hoeft toch maar eenmalig bij opstart te gebeuren. Of zoals je zegt met een mux op i2c kost het maar 1 extra pin.

Ik zie dat er EEPROM's in SOT-23 zijn voor amper 15 €cent dus dit is zeker een goede oplossing. Thx!

Acties:
  • +1 Henk 'm!

  • SA007
  • Registratie: Oktober 2002
  • Laatst online: 00:03

SA007

Moderator Tweaking
Je zou een weerstandje naar gnd kunnen 'activeren' met een 4051, dat is een 8-voudige analoge switch, en kan je 1 adc opknippen naar 8 adc's.

De 4051 is niet i2c helaas, kan er ook niet zo een i2c versie van vinden, maar kan wel prima aan een i2c expander hangen.
De 4051 heeft 3 'selecteer' pinnen waar je gewoon binair kiest welke je wil uitlezen.

Overigens zijn i2c 8-kanaals adc's ook prima te koop, maar met ~4 euro/stuk wel wat prijziger dan alleen een 4051.

Ervan uitgegaan dat je tijdens de 'boot' kijkt welke modules er zijn en ze dan pas gaat gebruiken kan je waarschijnlijk nog best wat pinnen dubbel gebruiken, wat random ideen daarvoor:
- Als je je i2c niet aan het gebruiken best kan je de data/clock pinnen prima gebruiken als selecteerpinnen.
- Idem voor spi
- Tijdens het selecteren kan je prima een act/info/etc ledje gebruiken.

Acties:
  • 0 Henk 'm!

  • Jim80
  • Registratie: November 2019
  • Laatst online: 13-09 22:25
@SA007 Bedankt voor de tips! Ik had al aan iets gelijkaardigs gedacht zoals een 4016, maar een 4051 is hier inderdaad veel beter geschikt voor. Mijn vrees was een beetje dat de weerstandswaarde minder nauwkeurig kan uitgelezen worden met een analoge switch (bv niet rail-to-rail) er tussen.

Zou eventueel ook door een 4xxx teller aangestuurd kunnen worden, dan is het eigenlijk een shift register geworden en is er ook maar 1 pin nodig.

8 kanaals i²c ADC is ook nog een idee, zal hier nog eens verder achter zoeken maar ze zijn redelijk schaars. 4€ is geen ramp voor het moederbord, het is vooral de modulekant die klein en goedkoop moet blijven.

Acties:
  • 0 Henk 'm!

  • jeroen3
  • Registratie: Mei 2010
  • Nu online
Alternatieve (meer uitdagende) methode, wat meer uit de automatisering afgekeken, kun je de modules "in serie" zetten en bijvoorbeeld via een bus protocol benaderen. Dan moet er wel op elke module een eigen client zitten maar je kunt dan in theorie modules koppelen tot de adressen op zijn.
Maar elke module een ATTiny is niet onmogelijk, wel een flinke uitdaging (in software).
Hangt er een beetje vanaf wat je doel is.

Initiële detectie werkt dan als elke module een chip-select heeft en de modules geven ook hun "chip select" door. Dus standaard heeft elke module een "listen" input and "initialized" output, welke in een keten aan elkaar gekoppeld zijn. (listen -> init -> listen -> init)
Hij luistert naar een standaard adres als "listen" hoog is. De eerste heeft "listen" hoog, en laat "initialized" laag.
Wanneer ingesteld op een adres zet hij "initialized" op hoog en luistert de volgende in de keten. Op die wijze kun je met 4 pinnetjes op de module connector tientallen modules stapelen.
De laatste module moet wel kunnen zien dat hij de laatste is, dus er zal een soort dummy op het einde moeten die een pinstate forceert die normaal niet kan.

Ik weet niet zeker of het exact zo werkt, maar zo zou ik het doen als ik een systeem zoals Beckhoff / Wago heeft moet bouwen met een atmega, ipv kbus of ethercat.
Nou, dat was mijn hersenspinsel. Doe ermee wat je wil.

Acties:
  • 0 Henk 'm!

  • Jim80
  • Registratie: November 2019
  • Laatst online: 13-09 22:25
@jeroen3 Die manier van werken is me ook niet onbekend :)

Voor mijn toepassing is het eerder een sternetwerk, dus ik heb niet echt de mogelijkheid om de modules onderling te daisy chainen, of dat kost me terug een exra pin op de connector waardoor ik terug met 2 gebruikte pinnen zit.

Dan is de EEPROM oplossing eleganter, kleiner en goedkoper dan er een ATTINY op te zetten :)

Maar ik blijf twijfelen tussen een eenvoudige analoge (weerstand) oplossing, of een digitale die meer software/werk vereist (het bit-bangen door een i/o expander van een 1-wire protocol met manchester codering en kritische klokstabiliteit gaat niet zo evident zijn)
Pagina: 1