W jaki sposób mcu może ustalić, na której wersji sprzętu działa?

13

Pracuję nad nowym projektem produktu i prawdopodobnie będą istnieć małe lub duże zmiany / poprawki sprzętowe przez cały okres użytkowania produktu. W przypadku przyszłych aktualizacji oprogramowania układowego w terenie potrzebuję sposobu ustalenia wersji sprzętowej. Jaka jest dobra strategia?

Obecnie ciągnę dwa zapasowe piny w górę / w dół rezystorami zewnętrznymi i sprawdzam wzór. Pozwala to tylko na 4 wersje sprzętowe, ale może to wystarczyć do celów praktycznych. Może to stać się problemem, jeśli będę potrzebować jednego lub obu tych pinów w przyszłej wersji sprzętowej.

Wydaje mi się, że bardziej ekonomicznym sposobem może być podłączenie dzielnika rezystora do pinu ADC. Każda wersja sprzętu może mieć inne rezystory wartości. Niestety nie mam żadnych zapasowych ADC w moim obecnym projekcie.

Sądzę, że innym sposobem może być zakodowanie numeru wersji sprzętu w pamięci EEPROM lub pamięci flash mcu podczas produkcji? (W tej chwili nie mamy tego obiektu.)

Chyba szukam propozycji elastycznej i niezawodnej metody.

[EDYTOWAĆ]

Re. sugestia z @ trav1s: Nie mam magistrali adresowej jako takiej, ale mam EEPROM 24LCxx na magistrali I2C. Niskie 3 bity adresu podrzędnego są podłączone na stałe. Chyba mógłbym zmienić bity adresu i wyszukać EEPROM podczas uruchamiania.

Morten
źródło

Odpowiedzi:

7

Z tym mam do czynienia na bieżąco. Dysponujemy bardzo złożonym sprzętem, który istnieje na rynku od prawie 10 lat, z różnymi wersjami różnych podsystemów. Niektóre podsystemy mają 2-bitowy kod, ale jak wspomniałeś, nie zawsze to wystarcza.

Sugestia EEPROM jest dobra, ale wymaga zaprogramowania EEPROM i zapełnienia płyty odpowiednią wersją.

Sugerowałbym 8-bitowy równoległy szeregowy rejestr przesuwny, taki jak 74HC166. Numer wersji można ustawić na wejściu przez samą płytkę PC, wiążąc wejścia WYSOKA lub NISKA, a następnie wystarczy tylko 3 piny, aby załadować i odczytać rejestr przesuwny z MCU.

Lyndon
źródło
Podoba mi się, że wersja sprzętowa jest wbudowana na płycie, w ten sposób potrzebuję tylko jednej wersji oprogramowania układowego i nie muszę obsługiwać wstępnie zaprogramowanych pamięci EEPROM. Wygląda na to, że rejestr zmian można znaleźć za około 0,1 USD i to jest OK.
morten
2
Wzdłuż tych samych linii można również użyć ekspandera portów I2C zwisającego z szyny I2C. Może to być nieco droższe.
alex.forencich
8

Nie użyłbym numeru wersji zaprogramowanego w mikrokontrolerze. Chyba że oprogramowanie różni się dla różnych wersji planszowych, ale wersja planszowa wydaje mi się zbędna. Miej jak najmniej wersji oprogramowania mikrokontrolera, najlepiej tylko jedną. Każda inna wersja może powodować problemy logistyczne.

Kod EEPROM jest dobrym pomysłem, ponieważ pozwala na wiele różnych kodów kart, ale wyjmij go z mikrokontrolera, w osobnym urządzeniu. EEPROM jest drogi dla dużych pojemności (dużo droższy na bit niż Flash), ale dla kilku bajtów można je znaleźć tanio. Ten ma tylko 16 centów na 100 i potrzebuje tylko 1 linii We / Wy.

Sposobem zmniejszenia prawdopodobieństwa błędów jest posiadanie innego pakietu dla każdej wersji planszy. Więc miej partię pamięci EEPROM zaprogramowaną z wersją nr 1 w SOT-23, następną wersją 2 w MSOP itp. Wtedy nie możesz mieć EEPROM wersji 1 na płycie w wersji 2.

stevenvh
źródło
Dzięki. To może być głupie pytanie, ale jak mam zaprogramować partię pamięci EEPROM przed umieszczeniem ich na płycie? Nie mam możliwości zdjęcia EEPROMS z taśmy, zaprogramowania ich, ponownego włożenia na taśmę i wysłania taśmy do asemblera PCB.
morten
@morten - Twój dostawca może to dla Ciebie zrobić. Wysyłasz im swój plik (ten jeden bajt :-)) i odzyskujesz zaprogramowane części, oznaczone wybranym przez siebie oznaczeniem. Koszt będzie zależeć od wielkości partii; będziesz miał stały koszt + koszt jednej części. Kiedyś obliczyliśmy, czy programowanie nie byłoby tańsze, ale w każdym razie dla tysięcy nie było warto.
stevenvh
4

Jedną z opcji, która wykorzysta tylko dwa cyfrowe piny, jest mniej więcej taka:

Schemat obwodu

Zmieniając wartości R1 i C1 można ustawić różne czasy ładowania kondensatora, które można zmierzyć w celu ustalenia wersji sprzętowej.

Bruno Ferreira
źródło
Aha, całkiem sprytne rozwiązanie :-)
morten
2

Jeśli na magistrali adresowej jest wolne miejsce, możesz umieścić w pamięci ROM rejestr, który może być odczytany przez MCU. Rejestr zawierałby numer wersji sprzętu. Gdy MCU odczytuje z tego adresu, rejestr zapisuje swoją wartość na szynie danych. Rejestr może być podłączony na płycie lub jeśli chcesz mieć możliwość zmiany numeru wersji gołymi rękami, możesz zrobić szpilki, które można wiązać w górę / w dół, tak jak teraz.

Travisbartley
źródło
Może mógłbym użyć adresu samej pamięci EEPROM ... patrz edycja na pytanie.
morten
DOBRZE. Nie wiedziałem, że jest autobus I2C. Może mógłbyś po prostu stworzyć małego slave'a I2C, który odczytuje numer wersji, gdy MCU odczytuje z niego.
travisbartley