Forum: Mikrocontroller und Digitale Elektronik Mega256 + 64kb SRAM


von Timo Birnschein (Gast)


Angehängte Dateien:

Lesenswert?

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:
1
EXTMEMOPTS = -Wl,--section-start,.data=0x802200,--defsym=__heap_end=0x80ffff

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
  int error = 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?
1
Init Board
2
Checking avilable memory...
3
Memory size smaller than: 22758
4
Testing Memory: 22757
5
Memtest successful.
6
7
8
9
Init Board
10
Checking avilable memory...
11
Memory size smaller than: -24578
12
Testing Memory: -24579
13
Memtest successful.
14
15
Init Board
16
Checking avilable memory...
17
Memory size smaller than: -24594
18
Testing Memory: -24595
19
Memtest successful.

Gruß
Timo

von Timo Birnschein (Gast)


Lesenswert?

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?

von Jens (Gast)


Lesenswert?

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 :-))

von Timo Birnschein (Gast)


Lesenswert?

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

von Randy (Gast)


Lesenswert?

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

von Peter (Gast)


Lesenswert?

Kann es denn sein das dein RAM zu langsam ist? Ändere doch mal die 
Zugriffszeit.
Bei mir läufts auf ATMega2561 ohne Probleme

von Timo Birnschein (Gast)


Lesenswert?

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
void servo_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.
25
26
  printf("Activating IRQ\r\n");
27
  SREG = 0x80;  // Setting the I-Flag
28
  //sei();
29
30
  printf("Initiating servo driver...\t\t\t\t\t\t[ok]");
31
  
32
}
33
34
SIGNAL(SIG_OVERFLOW0) {
35
  printf("I\r\n");
36
  TCNT0 = 0x00;  // Set the 8 bit timer to value
37
38
  printf("R\r\n");
39
  OCR0A = 0xB4;  // Set the Output Compare Register to 180 ticks
40
  printf("Q\r\n");
41
}

führt dazu, dass er bereits bei
1
  printf("Initiating servo driver...\t\t\t\t\t\t[ok]");
abstürzt. Ziel des Counters ist ein aufrufen einer 100hz 
Interruptroutine.

von Peter (Gast)


Lesenswert?

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.

von Timo Birnschein (Gast)


Lesenswert?

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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.