AVR-SRAM-Beschränkung

Ich bin nur ein Enthusiast, der Rat sucht.

Ich möchte einen Mikrocontroller verwenden, um Frames von einer Kamera zu lesen und diese Frames auf einen kleinen LCD-Bildschirm zu schreiben. Die Kamera und der Bildschirm befinden sich auf demselben SPI-Bus. Ich habe mit einem Arduino Prototypen entwickelt, möchte aber irgendwann zu einem AVR wechseln.

Das Problem ist, dass ein Bildrahmen 9600 Byte groß ist und der Arduino SRAM 2,5 KB groß ist. Ich kann keinen ganzen Frame puffern. Ich habe versucht, von der Kamera zu lesen und jeweils ein paar Zeilen auf den Bildschirm zu schreiben, aber da sie sich auf demselben SPI-Bus befinden, muss ich die Kamera deaktivieren, den Bildschirm aktivieren und dann die Kamera erneut aktivieren. Wenn Sie das Mittelbild der Kamera deaktivieren, verlieren Sie die Synchronisierung.

Ich muss einen Weg finden, 9600 Bytes von der Kamera auf den Bildschirm zu bekommen, ohne die Kamera zu deaktivieren. Scheint, als hätte ich 2 Möglichkeiten: SRAM erhöhen, um einen Frame oder separate SPI-Busse zu puffern.

SRAM erhöhen:

  • AVRs ändern - Der einzige ATmega mit genügend SRAM ist ATmega1284 und hat 44 Pins.
  • Externer SRAM? Habe nie damit gearbeitet.

Separate SPI-Busse:

  • Verschieben Sie den Bildschirm von Hardware-SPI zu regulären Pins und schreiben Sie Software-SPI. (Ich bezweifle, dass das schnell genug wäre.
  • Sieht so aus, als gäbe es mehrere ATtinys und ATmegas mit 2 oder mehr SPI-Bussen. Einige so klein wie 20 Pins. Das würde das Lesen von Einzelbildern zwar noch verzögern, aber hoffentlich nicht zu sehr.

Etwas anderes?

  • FPGA? Nie mit denen gearbeitet...
  • Eine andere Art von Mikrocontroller?

Danke!

Software-SPI könnte durchaus schnell genug sein. SPI ist ein sehr einfaches Protokoll, daher sollte es nicht lange dauern, es auszuprobieren und herauszufinden.
Ein Cortex-M0 in einem DIP8-Gehäuse mit 3x USART + 2x SPI: nxp.com/documents/data_sheet/LPC81XM.pdf
Seite 3 zeigt DIP-Paket mit nur 1 SPI. 3x USART + 2x SPI sind nur für TSSOP- und XSON-Pakete.
Mh, ich hätte weiterlesen sollen. Trotzdem würde es in der Lage sein, das zu tun, was Sie brauchen.

Antworten (3)

Etwas anderes (irgendwie):

Mehrere der ATmega-Geräte können ihre USART(s) neu konfigurieren, um als SPI-Master zu fungieren. Schließen Sie einfach eines der Geräte an eines dieser neu konfigurierten Peripheriegeräte an. Suchen Sie im Datenblatt nach „USART im SPI-Modus“ oder „MSPIM“.

Aufgrund dieses Kommentars bin ich auf die Produktsuche-Seite von Atmel gestoßen. Ich hatte gerade digikey benutzt. Es scheint, dass ATMega328s 2 SPI-Ports haben, also kann ich einfach damit gehen. Ich habe ATtiny85 und ATMega88A zur Hand, also werde ich sehen, ob ich ihren UART als SPI konfigurieren kann, bevor ich einen 328 kaufe.
Der '88A ist im Wesentlichen identisch mit dem '328, abgesehen von der Menge an Flash und RAM. Der zweite SPI-Port ist der neu konfigurierte USART.
Außerdem hat ATtinyX5 nur die einzige USI, also würde ich mir diese dafür nicht ansehen.
Ah! So ist es! Es ist vielleicht schneller, 2K auf einmal mit dem 328 statt 1K mit dem 88A zu puffern, aber ich werde jetzt sicherlich meinen 88A ausprobieren. Danke!

Probieren Sie ein STM32F4Discovery- Board aus; 15-25 US-Dollar. Die MCU ist ein STM32F407VG: 168 MHz ARM Cortex-M4, 1 MB Flash, 192 kB RAM, 3 SPI-Ports und DMA, mit dem Sie beispielsweise mit minimaler Prozessorbeteiligung von einem SPI-Port zu einem anderen streamen können. Der Discovery verfügt über einen eingebauten SWD-Programmierer/Debugger, sodass keine zusätzliche Hardware erforderlich ist; Probieren Sie CooCox für eine kostenlose und unbegrenzte IDE aus.

Referenzdesigns sind verfügbar, ja? Mit den Referenzdesigns und Schaltplänen können die Leute ganz einfach ihre eigenen STM32F4-basierten Boards herstellen?
Ich habe mehrere gemacht.
Sind sie schön und sauber? Ich habe das Atmel SAM3 Xplained Entwicklungs-/Referenzboard als Beispiel für mein Cortex M3 Board verwendet und es war ein Durcheinander, so viele nutzlose und dumme Extras für ihr Board und der Code ist ähnlich aufgebläht
Danke für den Vorschlag! Das sieht nach einem mächtigen Werkzeug aus. Ich bin mir nicht sicher, ob es zu dem Formfaktor passt, zu dem ich später wechseln möchte, aber es würde sicherlich das Konzept beweisen.
@KyranF Ich verwende keinen Bibliothekscode von ST, es ist imo schändlich schlecht, und ich habe mir die Discovery-Schaltpläne kaum angesehen. Ich habe (selektiv, aber gründlich) die Benutzer- und Referenzhandbücher gelesen, und meine Boards haben jedes Mal funktioniert. Bei Cortex-Ms gibt es nichts zu befürchten, sie sind nur ein weiterer Mikrocontroller - aber vergleichsweise günstig und wahnsinnig leistungsfähig.
@markt ja, der Kosten- und Leistungsunterschied zwischen beispielsweise einem Cortex M3 oder sogar M0 mit einem 8-Bit-AVR ist lächerlich - gleicher Preis, 1000-mal besser in Geschwindigkeit, Peripherie und Energieeffizienz. Ich liebe es!

Der meiste externe RAM ist SPI, der unter dem gleichen Dual-Bus-Problem leidet, das Sie bereits haben. Das heißt nicht, dass es unmöglich ist, es zu verwenden.

Ein cleverer Weg wäre, den Datenausgang der Kamera mit dem Dateneingang eines SPI-SRAM-Chips zu verbinden und den SRAM-Chip zur direkten Erfassung der Bilddaten zu verwenden. Sie können dann nach Belieben auf jeden Teil des zuletzt empfangenen Frames zugreifen. Es würde jedoch eine gewisse Menge an schlauen externen Schaltungen erfordern, um den Dateneingang zwischen der Kamera und Ihrer MCU zu teilen, da sie nicht beide gleichzeitig verbunden werden können und Sie möglicherweise auch direkt von der Kamera empfangen müssen einrichten und Status prüfen usw. (abhängig von der Kamera natürlich).

Eine einfachere Methode wäre, einfach eine größere MCU zu verwenden.

PIC32-basierte Boards wären in dieser Situation eine gute Alternative für die Arduino-Boards. So etwas wie ein ChipKIT uC32 würde Ihnen 32 KB RAM und mehrere SPI-Ports geben, sodass Sie sowohl einen ganzen Frame puffern als auch separate SPI-Ports verwenden können. Außerdem sind es 32 Bit und 80 MHz, sodass Sie Ihre Daten viel schneller verarbeiten können.

Es gibt auch PIC32-Boards, die 28-Pin-DIP-Chips verwenden (z. B. das DP32, das einen PIC32MX150-Chip verwendet), was besser für das Prototyping geeignet ist.

Die IDE (MPIDE) und die Sprache sind fast identisch mit Arduino, nein, nichts (viel) Neues zu lernen.

Danke dafür. Ich nahm an, dass externes RAM auf SPI sein würde und daher ein strittiger Punkt wäre; danke für diese bestätigung. Ihr PIC32-Vorschlag scheint die Aufgabe zu erfüllen, aber nicht in meinem Zielformfaktor. (Ich wurde kürzlich vom Minimalismus von 8-DIP-ATTinys verführt!) Wie ich in einem anderen Kommentar sagte, sieht es so aus, als hätte ATMega328 2 SPI-Ports in einem DIP-Paket, also werde ich das wahrscheinlich versuchen.