PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mega 8 - RAM-Erweiterung



Monday
22.08.2007, 01:29
Hallo an alle,
Ich habe vor eine Gameboykamera an einen ATMega 8 anzuschließen (Verbindungen stehen auch schon) und zunächst einmal die Bilder der Cam auszulesen um sie anschließend per RS232 an den PC zu schicken.
Das ganze möchte ich mit Bascom realisieren. Nun aber zu dem Problem:

Aus Geschwindigkeitsgründen kann ich die einzelnen Pixelwerte nicht direkt per RS232 senden, sondern muss erst alle Werte zwischenspeichern. Bei einer Auflösung von 128x128 Pixel ist das jedoch eine große Menge an Daten, die nicht in den internen sram des Mega8 passen.
Ich habe gelesen, dass man "den" Ram per XRAM ansprechen kann. Aber welcher RAM ist "dieser" RAM (intern/extern)
Des weiteren würde ich gerne wissen, welchen RAM ich am besten dazu benutzen kann (oft beschreibbar, schnell), wie ich diesen snschließe und natürlich anspreche.

Schonmal vielen Dank im Vorraus!

Gruß
Monday

Reeper
22.08.2007, 02:07
Hallo Monday :D ,

bei kreative-chaos:
http://www.kreatives-chaos.com/artikel/gameboykamera-modul
S-RAM:
http://www.reichelt.de/?SID=26JMbrSKwQARoAAAHfuHA5d45661489fb94ea2076224c 39d1201e;ACTION=3;LA=4;GROUP=A34;GROUPID=2954;ARTI CLE=2673;START=0;SORT=preis;OFFSET=1000

Werde es ja bald mal probieren ...

Gruß
Stefan

linux_80
22.08.2007, 02:48
Hallo,

beim Mega8 wirds etwas knapp werden mit externem RAM.

Das was Bascom bei XRAM meint, geht nicht mit dem Mega8,
es gibt da extra AVRen die das beherrschen, siehe Link von Reeper.
Der Mega8515 wäre auch so einer.

Monday
22.08.2007, 04:18
Hmmmm....
Also wenn es gar nicht anders geht, dann werde ich wohl einen anderen Controller benutzen müssen...
Geplant ist ist ja, dass der Controller nur den Teil des Bilder auslesens und vllt auch verarbeitens übernimmt und den Rest übernimmt dann ein Hauptcontroller, der die wichtigsten Daten per RS232 oder I2C bekommen soll. Dem zu Folge wäre der Mega8515/162 von den Ports gesehen überdimensioniert.
Werde jetzt aber erstmal schlafen gehen und morgen nach µC's suchen ;)

@ Stefan: So schnell sieht man sich wieder ;)

roboterheld
22.08.2007, 21:35
...Aus Geschwindigkeitsgründen kann ich die einzelnen Pixelwerte nicht direkt per RS232 senden.....


warum das denn nicht? ich schicke immer ein bild mit 19200baud oder 9600baud rüber und es klappt.

Monday
22.08.2007, 23:44
echt? das klappt?
Habe hier im Forum irgendwo gelesen, dass es wohl nicht gehen würde, weil die Kamera ja auch einen mindesttakt hat. Weiter habe ich von verschiedenen leuten gelesen, dass sie ihre Bilder in 4 sek oder schneller machen.
Da habe ich mir gedacht, muss du das mal ausprobieren:
Werte simulieren und per RS232 an den Rechner schicken.... dauert ein par min bis die über 16k Werte übertragen sind...
Dann werde ich das morgen dirakt mal ausprobieren ;)

Monday
23.08.2007, 01:57
Ok, es ist ein kurzer Nachtrag erforderlich.
Habe die baud jetzt auf 115200 gestellt (endlich extrenen 16MHz Quarz angeschlossen!!!) und nun wird die gleiche Menge an Daten in 8 Sek übertragen... ich denke mit ein bisschen Codeoptimierung sind vllt auch unter 4 sek drin ;)

Vitis
23.08.2007, 02:16
mit dem Mega8 wird das etwas knifflig, aber nicht unmöglich.
Die eine Möglichkeit währe über zwei 8574 Portexpander extern S-RAM
anzuhängen. Die Geschwindigkeit der Datenspeicherung ist halt so ne Sache.
Prinzipiell währs über EEPROM beispielsweise n 24c256 möglich, blöd ist
da halt die 5ms Pause für die Datenpakete, aber könnte gehen mit
n paar kniffen bei der Programmierung. Schöner währ vermutlich
n F-RAM über I2C, weil die die Pausen nicht brauchen und mehr
Schreibzyklen können, dafür sind die aber deutlich teurer FM24Cxxx

Monday
23.08.2007, 20:14
Ok, nochmal Danke für eure schnellen Hilfen :)
Ich werde mir das mal überlegen und noch verschiedene Sachen ausprobieren.

Monday
27.08.2007, 22:54
Das gehört zwar nicht direkt zum Thema RAM-Erweiterung, aber hat auch mit platzmangel zu tun.
Ich möchte zunächst einmal noch ein par Versuche mit der Kamera machen. Dazu muss ich ein Bild speichern. Damit der Speicher des Mega 8 ausreicht möchte ich nur 32x32 Pixel mit einer Farbtiefe von 3 Bit speichern (ergibt dann 384Byte pro Bild).
Aber wie stelle ich die Auslösung des ADC auf 3 Bit um?

radbruch
28.08.2007, 00:35
Hallo Monday

Das mit den 3 Bits geht so nicht, die selbe Frage habe ich mir kürzlich auch gestellt. Es ist aber auch nicht nötig:

https://www.roboternetz.de/phpBB2/viewtopic.php?t=33070

Aber mehr Speicher könnte mein 32er auch gebrauchen.

Gruß

mic

Vitis
28.08.2007, 14:47
Hab mit C-325 gearbeitet, im Prinzip nix anderes als die GBCam von wegen serieller Datenübertragung. die 3 Bit kannste doch prima je 2 in ein Byte schieben.
die ersten drei Bit in Variable legen, dann shift left 4 und dann per oder die
zweiten 4 Bit in das Byte hinein. Mitunter ists schneller die Daten so zu "komprimieren" als diese aus externem Speicher auszulesen.
In meinem Fall hab ich mit 4-Bit Bildern gearbeitet da hat das so supi gepasst, aber bei 32 x 32 sind das dann immernoch 512 Byte. hmmm die sollten dann in deinem Fall ja noch fast ins interne RAM passen ...

Was am 32er gut geht ist extern nen alten Speicherriegel vom PC dran hängen, das geht ziemlich flux vom beschreiben und lesen her. beim 8er reichts da halt von den Pins her nicht ganz hin.

Monday
28.08.2007, 18:23
Einen alten Speicherriegel vom PC?
Das wäre ja perfekt, da ein Freund noch jede menga davon hat und ich hier auch noch einen Mega 32 liegen habe :)
könntest du vieleicht einen Schaltplan dafür zur Verfügung stellen und wie das ganze angesprochen wird?

Nachtrag: Funktioniert das mit jedem älteren RAM oder darf ein Modul eine gewisse Größe nicht übersteigen? (Im Datenblatt wird externer RAM nicht erwähnt, wie z.B. beim Mega 162)

Lenox
29.08.2007, 09:48
Muss man die nicht ständig nachladen?

Vitis
30.08.2007, 02:52
sollte man denken, habs probiert mit EDO RAM, das hält seine Info
bis 20 Sekunden ohne Refresh und ohne Verlust, kein Problem.

Du brauchst nur die RAS CAS WE Adress und Datenleitungen anschließen
und los gehts. Nur die Reihenfolge der jeweiligen Signale an die Pins
hab ich grad nicht parat, kanns aber raussuchen wenn Bedarf besteht.

Monday
30.08.2007, 04:06
Hallo Vitis,
Ich habe mich mal auf die Suche nach Datenblätter begeben und war mehr oder weniger Erfolgreich. Ich habe mal drei verschiedene RAM-Riegel rausgesucht, zwei alte und einen noch älteren ;)
Ich habe die Datenblätter als Anhang beigefügt und würde mich freuen, wenn du mir sagen könntest, welchen ich dafür am besten benutzen kann.
Der kleinste hat die Bezeichnung "1 M ´ 1-Bit Dynamic RAM"
Ist das dann ein Megabyte? Das würde ja schon reichen, vor allem weil das mit dem Anschließen so ne Sache ist, da ich keine SMD-Lötspitze besitzte... Ein weiterer Vorteil ist die Betriebsspannung von 5V.

Wenn du die Reihenfolge der Signale raussuchen könntest, würde ich mich sehr freuen, dann fange ich wenn möglich schon morgen an alles zusammen zu löten und zu programmieren ;)
Also sehe ich das richtig, das ich in Bascom nicht mit dem Befehl XRAM arbeiten kann, sondern alles mit Hand machen muss?

Vitis
30.08.2007, 14:09
nein, mit xram hat das nix zu tun, das musst Du schon selber
ansteuern über Bits schubsen und so, ist aber nicht schwierig.
Das x 1 Bit bedeutet, das der Baustein je Adresse genau 1 Bit
ablegen kann. Da aber n Byte bekanntlich 8 Bit hat musst Du dann
entweder 8 der Bausteine auf einem Adressbus parallel legen,
dies geschieht normalerweise im Riegel, oder halt jedes Bit nach
und nach schreiben und auch wieder zusammensetzen. mit letzterer Methode
wirds aber recht elendig langsam.

Monday
30.08.2007, 15:07
Ok, dann werde ich wohl einen größeren mit x 8 Bit nehmen müssen...
Werde dann die Tage eine neu Lötspitze usw bestellen und dann gehts los.
Gibt es einen Pegelwandler den du mir empfehlen kannst?

Monday
30.08.2007, 21:57
Ich habe mir die Sache noch einmal durch den Kopf gehen lassen... ich denke nicht, dass sich die Arbeit und der Aufwand lohnt, die Speicherbausteine rauszulöten. Deshalb habe ich bei Reichelt nachgeguckt. Das ganze müsste ja auch mit Speichern wie z.B. mit diesem gehen (Die sind wenigstens im DIL-Gehäuse :) ):
http://www.reichelt.de/?SID=26P8Yl8qwQARoAAGveDOY721ae2f934f6065b02cc1fbc 009ee54e;ACTION=3;LA=2;GROUP=A34;GROUPID=2954;ARTI CLE=2677;START=0;SORT=artnr;OFFSET=1000

dann ist mir noch der Statische RAM aufgefallen, der deutlich mehr Speicher hat: (Kann ich diesen auch benutzen? Was ist eig. Statischer RAM? Ist der nur begrenzt beschreibbar?)
http://www.reichelt.de/?SID=26P8Yl8qwQARoAAGveDOY721ae2f934f6065b02cc1fbc 009ee54e;ACTION=3;LA=2;GROUP=A34;GROUPID=2954;ARTI CLE=40088;START=0;SORT=artnr;OFFSET=1000

Phantomix
01.09.2007, 00:19
Statischen ram muss man nicht selbst refreshen, kann ich nur empfehlen :-)
beide sind schon nicht schlecht aber denk dran dass du dann haufenweise leitungen hast: 8 datenleitungen und dann adressleitungen ohne ende
(64 KB = 16 stück; 128 entspricht 17 und 512 wären dann 19!)


Edit: Dann außerdem noch die chip enable, read / write, ...

vielleicht ginge sowas ja über einen/mehrere Bustreiber-ICs kennt sich jemand damit aus?

also dass man die ram pins gleichzeitig noch für was anderes verwenden kann

radbruch
01.09.2007, 00:25
Wenig Pins wäre klasse, ich würde allerdings gerne ohne FAT und Sektoren darauf zugreifen können:
http://www.ulrichradig.de/home/index.php/avr/mmc-sd
Ob nicht ein größerer AVR mit mehr Speicher einfacher wäre? (Nur so ein paar Gedanken, ich habe mich noch nicht eingelesen)

Monday
01.09.2007, 03:03
Ja, ein AVR mit mehr Speicher wäre schon prktisch, jedoch hat der größte, den ich bisher gefunde habe "nur" 4kb, ich benötige jedoch etwas mehr als 16 kb pro Bild, und mindestens 2 muss ich speichern können. Das mit den vielen Daten- und Steuerleitungen stört mich auch ein bisschen, aber ich denke daran lässt sich nicht so viel ändern (außer über andere Bausteine vllt!? Wie wäre es denn mit einem Schieberegister, oder ist das dann zu langsam?). Eine weitere Idee wäre ein µC nur für den Speicher per I2C anzusprechen. Das würde dann die Ports an dem µC der Camera sparen und ebenfalls dessen Rechenleistung freigeben. Ist der I2C Bus eigentlich schnell genug dafür (also um die ca. 16 kb innerhalb weniger ms zu speichern?

Dnerb
01.09.2007, 11:35
Hi,

wenn Du keinen Bock auf SMD hast und Statischen Speicher verwenden willst, dann kann ich Dir helfen. Im DIL 28 Gehäuse habe ich welche rumliegen (nagelneu) 70ns schnell, 32Kb pro Chip. Organisiert in 32kx8. Falls es Platzprobleme gibt, habe ich die auch in SMD. Kann man mit 1,27mm Pinraster auch noch sehr gut löten ohne der SMD-Profi zu sein.

Gegen Portokosten + 20ct pro Chip. Wer interesse hat -> PN mit Adresse an mich.

Gruß Dnerb

Monday
01.09.2007, 12:43
Hi Dnerb,
Habe die Bestellung schon gestern abend abgeschickt....
Aber trozdem vielen Dank für das Angebot :)

Gruß Monday

Monday
04.09.2007, 19:48
So, die Sachen sind heute angekommen.
Ich werde jetzt mal die datenblätter studieren und anschließend eine schaltung aufbauen. Melde mich dann wieder

Gruß
Monday

Monday
06.11.2007, 21:57
...
Ich melde mich nach etwas längerer Zeit wieder.
Mitlerweile habe ich so einiges ausprobiert, was das Thema RAM angeht.
Als erstes habe ich mich dazu entschlossen einen alten RAM-Riegel (1M x1) zu zerlegen. Nachdem ich einen Adapter für den smd-Speicher gebaut habe und ich an den Mega8 ageschlossen habe, ging es auch schon mit dem Programmieren los (Ports konfigurieren und zuordnen).
Nach nicht all zu langer zeit war das Programm fertig und der Ram wurde eingesteckt. Eine LED zeigte mir an, ob ein bit gelesen wurde oder nicht. Das hat auch soweit funktioniert, bis ich mehr als ein Bit schreiben wollte. Da ich ab hier nur noch seltsammes blinken der LED bemerkte, habe ich das alte Programm etwas verändert:
1 Bit schreiben und einige male auslesen (über RS232). Hier habe ich festgestellt, dass das Bit nie gleich war (also mal 1, mal 0).

Also habe ich das ganze Programm erneut geschrieben, wieder ohne Erfolg.... :-(
Aber aufgeben wollte ich noch nicht: Einen anderen Ram genommen und wieder einige Male neu Programmiert. Irgendwie haut das mit den ganzen timings nicht hin.

Deshalb möchte ich mal nachfragen, ob jemand einen Beispielcode dafür hat und wie man das am besten programmiert? (Mit Timer oder ohne?)

Hier ist noch der letzte Code, den ich geschrieben habe (da ich mit dem Timings wie gesagt so meine Probleme habe ist es auch recht simle...)

'***** ############################################# *****
'***** ############################################# *****
'***** Grundcode zum beschreiben und Lesen von *****
'***** DRAM-Modul TMS4164-12NL *****
'***** ############################################# *****
'***** ############################################# *****

$regfile = "m8def.dat"
$crystal = 16000000
$hwstack = 32
$swstack = 10
$framesize = 40


'***** ############################################# *****
'***** Adress- und Datenleitungen konfigurieren *****
'***** ############################################# *****
Config Portd = Output
Config Portc = Output

W Alias Portc.2
Ras Alias Portc.3
Cas Alias Portc.4
D_i Alias Portc.1
D_o Alias Portc.5
Adr Alias Portd

Dim Adresse As Byte 'adressse die gesetzt werden soll
Dim Ras_adr As Byte 'raw adress
Dim Cas_adr As Byte 'Column adress
Dim Set_bit As Byte 'Bit setzen (1/0)
Dim Get_bit As Byte 'gelesenes Bit
'***** ############################################# *****



'***** ############################################# *****
'***** Sonstiges *****
'***** ############################################# *****
Dim I As Byte
'***** ############################################# *****



'***** ############################################# *****
'***** Gruene LED konfigurieren *****
'***** ############################################# *****
Config Portb.0 = Output ' gruene LED
Led_gruen Alias Portb.0
'***** ############################################# *****



'***** ############################################# *****
'***** Programmstart durch blinken signalisieren *****
'***** ############################################# *****
For I = 0 To 5
Led_gruen = 1
Waitms 50
Led_gruen = 0
Waitms 10
Next
Led_gruen = 0
Waitms 500
'***** ############################################# *****



'***** ############################################# *****
'***** Hauptprogramm *****
'***** ############################################# *****
Wait 1
Led_gruen = 1
Waitms 5
Led_gruen = 0
Set_bit = 1
Gosub Write_bit
Do
Waitms 50
Gosub Read_byte
Led_gruen = Get_bit
Waitms 5
Led_gruen = 0
Loop
End
'***** ############################################# *****



'***** ############################################# *****
'***** GOSUBs *****
'***** ############################################# *****



'***** ############################################# *****
'***** Bit in RAM schreiben (write_bit)
'***** ############################################# *****
Write_bit:
Ras = 1
Cas = 1
'---------------------------------------------------
'ROW-Adresse setzen
Adr = 255
Ras = 0
nop
'---------------------------------------------------
'COLUMN-Adresse setzen
Adr = 255
Cas = 0
'---------------------------------------------------
D_i = Set_bit
W = 0
D_i = 0
W = 1
'---------------------------------------------------
Cas = 1
Ras = 1
Ras = 0
Cas = 0
Return
'***** ############################################# *****



'***** ############################################# *****
'***** Bit aus RAM lesen *****
'***** ############################################# *****
Read_byte:
Ras = 1
Cas = 1
'---------------------------------------------------
'ROW-Adresse setzen
Adr = 255
Ras = 0
nop
'---------------------------------------------------
'COLUMN-Adresse setzen
W = 1
Adr = 255
Cas = 0
nop
'---------------------------------------------------
Cas = 1
Get_bit = D_o
Ras = 1
W = 0
Ras = 0
Cas = 0
Return
'***** ############################################# *****
Achso... theoretisch gesehen sollte die LED kurz aufleuchten, wenn das gelesene Bit = 1 ist

Vitis
06.11.2007, 23:54
hmmm ... was ich nicht verstehe, du schreibst ein Bit über C.1 und Du liest ein Bit über C.5 ? Ich glaub das passt so nicht.
In meiner Anwendung war Data in = Data out vom RAM und so stehts auch im Datenblatt von dem Baustein.
Dann hast Du nochmal n Problem, Du hast die Datenrichtung der Pins nicht festgelegt.

also
config w=output
config ras=output
config cas= output etc.

Dann kommt noch, das man Portzustände von anliegenden Spannungen
nicht über xy=portz.0 einlesen kann, sondern dafür das Pin abfragen
muss, also:
input = pinc.1

Da Ein und Ausgänge ja auf dem gleichen Pin liegen musst Du vor dem
Ein bzw. Auslesen die Datenrichtung ändern von input zu output und umgekehrt.
also
Datenrichtung = output
Adresse setzen
Daten schreiben
Datenrichtung = input
Adresse setzen
Daten lesen.

Monday
07.11.2007, 20:27
Hi Vitis,

Stimmt, jetzt wo du es sagst fällt mir das mit der Konfiguration der Pin auch auf... 8-[ (war zum glück bei den anderen Programmen nicht ;) )
Soweit ich mich erinnere habe ich das mit dem Einlesen der Pins immer so gemacht und es hat auch funktioniert (Beispiel):

config portc.1 as input
taster alias portc.1
if taster = 1 then print "Taster gedrückt!"

Habe die Pin jetzt richtig konfiguriert, es tut sich jedoch immer noch nichts.
Laut Datenblatt gibt es an dem RAM die Anschlüsse "D" und "Q" wobei D für Dateneingang und Q für Datenausgeang steht.
Bei dem alten Arbeitspeicher war es genau so.

mfg
Monday

Vitis
07.11.2007, 23:38
nochmal, du kannst das port-register zwar auslesen,
da steht aber nur das drin, was du aktiv dort reinschreibst.
willst du den zustand des pins einlesen musst du das
pin (!) - Register auslesen.

in deinem beispiel:
taster alias pinc.1

Monday
08.11.2007, 17:31
oh, sry... war gestern abend schon müde :-#
meinte es natürlich so wie du es berichtigt hast.

Du hast das mit dem RAM doch schon erfolgreich gemacht, oder?
kannst du mir eventuell die routine fürs lesen und schreiben mal schicken/posten?

mfg
Monday

Vitis
08.11.2007, 22:27
Ja, ich hab allerdings mit EDORAM gearbeitet.
Läuft sehr gut und supergünstig.
Hab damals bei eBucht 30 Riegel für 5 Euro ersteigert.

Monday
08.11.2007, 23:47
Hey =P~
Ich sag mal vorsichtig, dass ich es jetzt geschafft habe!!!! (nicht das ich wieder so nen blöden Fehler drin habe, wie schonmal....)

Ich setzte die Variable Set_bit auf 1 bzw 0 und lasse den ram anschließend in einer schleife Dauerhaft auslesen. Der Ausgang für die LED wird dem gelesenem Bit gleichgesetzt.

Ich glaube ich hatte einen Dreher in der Abfolge der Befehle.
Hier nochmal der Quellcode für...
...schreiben


W = 1
Ras = 1
Cas = 1
Adr = 255 'row
Ras = 0
W = 0
D_i = Set_bit
Adr = 255 'cas
Cas = 0
nop
Ras = 1
Cas = 1
W = 1

... lesen

Adr = 255 'row
Ras = 0

Adr = 255
Cas = 0

Get_bit = D_o

Cas = 1
Ras = 1

Die Abfolge der Befehle habe ich aus einem Assambler-Code übernommen.

Morgen werde ich dann einige Bits schreiben, lesen und das Ergebnis per RS232 ausgeben.

Bis dahin,
gute Nacht \:D/

Vitis
09.11.2007, 14:10
Na da wünsch ich doch mal viel Erfolg, bin schon gespannt auf
Deine Ergebnisse. :)

Monday
09.11.2007, 16:29
Jippi *freu*...es funktioniert!!! :cheesy:

Da ich den D-Port meines Mega8 für die Adressleitungen benutze, habe ich Probleme, wenn ich die RS232 aktiviere.
Um nicht schon wieder alles umlöten zu müssen oder eine Software RS232 zu erstellen (geht das überhaupt mit dem Mega8?), habe ich einfach mihilfe einer FOR-Schleife 100 Bits geschrieben (immer 1, 0, 1, 0, ...). Diese Bits habe ich ausgelesen und mit einer LED ausgegeben: Sie blinkt \:D/

Als nächstet werde ich die 16384 Byte schreiben und gucken wie lange das dauert. Wenn es schnell genug ist (was ich bisher noch bezweifel), dann werde ich einen Mega 162 benutzten und die Gameboy-Kamera anschließen.
Wenn nicht werde ich wohl einen ?x8 Speicher anschließen müssen.

Monday
09.11.2007, 16:54
Ok, habe den Code nun fertig.
Aber mir kommt das sehr extrem schnell vor:
1 Takt = 1/16^6 Hz = 62,5ns

Und alleine für das Schreiben sind es 12 Befehle + die Adressauflösung für ROW und Column.

Das sind doch dann bestimmt schon mindestens 20 Takte, oder?
Daraus würde sich eine Zeit von
20 Takte * 16384 Byte * 8 Bit = 0,163s
ergeben.

D.h. wenn ich einen ?x8 Speicher verwende, kann ich so schnell schreiben, dass die Cam gar nicht hinterher kommt. Also wenn man sich mit solchen Sachen auseinandersetzt, sieht man wie schnell so ein Controller überhaupt ist :shock:

Und wo wir schon bei Geschwindigkeit sind: gibt es eine Tabelle aus der man entnehmen kann, wieviel Takte ein bestimmter Befehl braucht?