Hallo Leute,
ich glaube jeder der hier klickt wird denken: "Das hatten wir doch nun
schon tausend mal..."
Ich habe auch schon gesucht und gemacht und alles was mir einfiel
getestet. Jedoch läuft folgendes nicht:
Ich habe für den Mega2560 mit knapp 100 Pins ein kleines Dev-Board
gebaut, was im Augenblick mit 18,432 Mhz läuft. Uart läuft schon prima.
Ich will mal wieder einen SRAM mit 64KB ansteuern, allerdings klappt das
nicht die Bohne.
Mein Ansatz ist folgender:
In der main wird als erstes
1
XMCRA=0x80;// External Memory Control Register A : 1000 0000
2
XMCRB=0x00;// External Memory Control Register B : 0000 0000
aufgerufen. Damit aktiviert sich das Externe Interface, was -oWunder-
auch tatsächlich passiert. Allerdings nur auf dem Oszi, wo ich z.B. ALE
und einige Daten- sowie Adressleitungen flackern sehe.
Zusätzlich habe ich in meinem Makefile folgendes stehen:
Der Mega2560 hat 8KB internen Speicher, weswegen ich meinen Heap
dahinter erst anfangen will. Dadurch liegen alle Variablen extern.
Um nun auf dem Speicher zuzugreifen, mache ich folgendes:
1
u_char*data_buf=malloc(size*sizeof(uint8));
2
interror=0;
3
4
if(!data_buf){
5
printf("Memory size smaller than: %d\r\n",size);
6
error=-1;
7
}
Um jetzt zu testen, wieviel Speicher ich eigentlich habe, vergrößere ich
size interationsweise immer um einen Faktor, bis das
1
if(!data_buf)
fehl schlägt. Dann weiß ich wie viel Speicher ich habe. Natürlich gebe
ich den Speicher immer wieder mit free frei, so dass es keine Probleme
geben sollte.
Laufen tut das allerdings nicht. Ich bekomme die abstrusesten Sachen zu
sehen... Ich habe den Code angehängt, vielleicht könnte da mal jemand
drüber schauen?
Nach ein wenig googlen scheine ich nicht der Einzige zu sein, der mit
dem externen Speicher am Mega2560 Probleme hat. Da sich einige Register
geändert haben, kann man auch nicht das normalerweise verwendete asm
File, meist xram.S oder extram.S genannt, verwenden um die
entsprechenden Register zu setzen.
Ich hatte damals für meinen Mega128 den Inhalt für die asm Datei von
hier bekommen. Damit lief es dann.
Ich vermute, dass man mit einem entsprechend korrigierten asm File das
Problem also beheben können müsste.
Allerdings habe ich ein Problem mit dem File, denn wenn ich es an der
entsprechenden Stelle im Makefile einbinde, meint der Compiler er hätte
keine Regel um sram.o zu bauen. Darum komme ich mit dem Speicher
immernoch nicht weiter. :(
Irgendjemand eine Idee?
Hi, ich hab zwar mangels C Kenntnis keine Idee und unklar bleibt auch
wie Deine Hardwareanbindung konkret ausschaut (mehr als im Mega256
Manual beschrieben ist ja nicht zu tun, zu beachten höchstens ein nicht
zu langsames 573!!!- bei 18MHz wirds wohl ohne besondere Vorkehrungen
sehr schnell kritisch). Ich kann Dir aber versichern dass mein 2560 mit
512KB SRAM im Banking-Betrieb und assemblerangesteuert keine Probleme
macht! Zugegeben aber nur mit 8 MHz. Beim Lesen solcher Beiträge (und
davon gibt es viele) bin ich immer wieder froh, unter Assembler wirklich
alles unter Kontrolle zu haben :-))
Ja, das stimmt.
Allerdings ist der Witz dieser Lösung, die übrigens mehrmals
kontrolliert genau wie im Datenblatt beschrieben aussieht, dass ich den
Speicher mit C genauso ansprechen kann, als wäre es normaler
variablenspeicher. Ich brauche mich also nicht um adressen und um das
Speichermanagement kümmern.
In Asm mit eigener Ansteuerung ist das natürlich klar, dass er läuft.
Ein Sram an zu steuern ist ja glücklicherweise nicht all zu schwer :)
Ich will aber eigentlich nicht mit asm rum matschen, da mir persöhnlich
das deutlich zu unübersichtlich ist. Klar mangels Erfahrung, aber ich
bin erstmal ganz glücklich so :)
Ich werde mich bei meinem Projekt jetzt erstmal auf andere Dinge
konzentrieren, damit ich mal weiter komme hier :)
Gruß
Timo
Hallo,
lasse den uC doch mal langsamer laufen, mit dem internen 1 MHz
RC-Oszillator. Aber sicherheitshalber das Quarz abklemmen, ich hatte
schon mal den Fall dass ein Mega16 mit der Quarzfrequenz lief obwohl die
Fuses für den internen Oszi eingestellt waren. Dann kann man son mal
sehen ob der Latch-Bausteim evtl. ein bisschen zu langsam ist. Die
Betriebsspannungen aller ICs sind mit ca. 100nF Keramik-Kondensatoren
abgeblockt? Und die Masseverdrahtung zwischen den ICs ist ziemlich
direkt, so dass die Schleife zwischen den Datenleitungen und der Masse
(dort fliest der Rückstrom) nicht zu viel Fläche aufspannt? Massefläche
wäre natürlich optimal, ist aber nicht unbedingt erforderlich wenn man
den Rest richtig macht. Hast du ein Oszilloskop mit dem du die Signale
mal ansehen kannst?
HTH
Randy
Wenn ich den Mega auf 18,432 / 8 Mhz laufen lasse, läuft mein
Speichertest nicht mehr... im Augenblick scheint das Ding wirklich zu
machen was es will...
Ich versuche daher derzeit einen Servotreiber zu schreiben, allerdings
resettet die CPU nach einschalten der IRQs sofort und ständig, so, dass
ich auch an der Baustelle nicht weiter komme.
Der Speicher kann laut Datenblatt knapp 35ns, was eine Belastbarkeit von
knapp 28.011.204 hz entspricht. Das liegt noch 10mhz über meiner
Taktfrequenz, sollte also kein allzugroßes Problem sein. Wenn ich die
Timings runter stelle, verändert sich nichts. Selbst die längste
Wartezeit hat gestern keine besseren Ergebnisse zu Tage gefördert. :(
Gruß und danke für die Tipps! Ich würde mich sehr über weitere freuen!
Timo
ps.
1
#include"servo.h"
2
#include<stdlib.h>
3
#include<avr/io.h>
4
#include<stdio.h>
5
6
voidservo_init(void){
7
8
/*
9
Init timer interrupts here. Create servo list and fill it with servos. Servo can be both, engine and effector
10
*/
11
printf("Initiating servo driver...\r\n");
12
13
printf("Setting TCNT0\r\n");
14
TCNT0=0x01;// Set the 8 bit timer to value
15
printf("Setting OCR0A\r\n");
16
OCR0A=0xB4;// Set the Output Compare Register to 180 ticks
17
printf("Setting TIMSK0\r\n");
18
TIMSK0=0x02;// Set the Output Compare Flag enable
19
printf("Setting TIFR0\r\n");
20
TIFR0=0x02;// Set another Output Compare Flag enable
21
printf("Setting TCCR0A\r\n");
22
TCCR0A=0x00;// Set everything to default values
23
printf("Setting TCCR0B\r\n");
24
TCCR0B=0x05;// Set IO-Clock input to a prescaler of 1024. The Counter is now active.
Der Speicher hat 35nS Zugriffszeit, das kannst du nicht mal so einfach
in MHz umrechnen. Lies dir lieber mal das Datenblatt vom Speicher und
vom ATMega zum externen Speicherzugriff durch.
Auch hier gilt der alte Spruch: 1 Chinese braucht eine Stunde, 1 Million
Chinesen brauchen 3,6mS.
Zugegeben, meine Behauptung steht auf wackeligen Beinen :P
Ich habe mal sehr gute Erfahrungen mit einem Cachebaustein gemacht, dass
70ns hatte. Das lief mit 16Mhz und einem Waitstate sehr zuverlässig.
Daher war ich davon ausgegangen, dass das neuere SRAM hier, mit deutlich
geringerer Latenz, auch 18,432Mhz macht. Nun denn... aber recht hast du.