Forum: Mikrocontroller und Digitale Elektronik M16 Expanded Memory Mode


von Bruno (Gast)


Lesenswert?

Brauche dringend Eure Hilfe, denn ich versuche krampfhaft externe
Hardware mit dem Adressbus anzusteuern. Der M16c62p scheint im Expanded
Memory Mode zu laufen (Mit Logic Analycer aufgezeichnet), das Problem
ist nur, dass die von mir beschriebene Hardwareadresse nicht
angesteuert wird und die CS1-3 immer H-Pegel haben.
Board Glyn EVBM....
RDY,Hold,CS1-3 Pull-up

Initialisierung:

;---------------------------------------------------------------------
; after reset,this program will start
;---------------------------------------------------------------------
  ldc  #istack_top,  isp  ;set istack pointer
  mov.b  #03h,0ah    ;write protect disable PRCR
  mov.b  #05h,04h    ;set processer mode PM0
  mov.b  #00h,05h    ;set processer mode PM1
  mov.b  #ffh,08h    ;CS enable CSR
  mov.b  #55h,1bh    ;2 wait state CSE
  mov.b  #00h,0ah
  ldc  #0080h,  flg
  ldc  #stack_top,  sp  ;set stack pointer
  ldc  #data_SE_top,  sb  ;set sb register
  ldintb  #VECTOR_ADR

;====================================================================

Main:

/*Variabeln*/
#pragma ADDRESS Lcd_Dat 10000H
 volatile unsigned char far Lcd_Dat;

#pragma ADDRESS Lcd_Com  10002H
 volatile unsigned char far Lcd_Com;



char text;

/*Init System*/
lowlevelinit();     /*Init uC*/
//InitLCD();        /*LCD initialisieren*/
InitUART(0,0X2580);    /*Init SIO 0 9600*/
InitUART(1,0X2580);    /*Init SIO 1 9600*/

while (1)
{
Lcd_Com=0x40;
}
}

Ich kapiers nicht mehr. Müsste doch funktionieren

von Benedikt (Gast)


Lesenswert?

Ich habe mal alle Register nachgeprüft, es müsste eigentlich
funktionieren.
Hier mal ein Teil von meinem Code, mit dem ich eine Festplatte
ansteuere:
ncrt0.a30:

    bset  1,0ah
    mov.b  #05h,04h    ;set processer mode to expanded memory mode
    mov.b   #08h,05h        ;set reserved area expansion bit (192 to
384Kbytes Flash
    bclr  1,0ah
    bset    0,0ah

c Programm:
    csr=1+2+4+16+32  ;   //Enable CSs, Wait States: SRAM 0, HDD 1, LCD
1

#pragma ADDRESS IDE_Data  28000H
 volatile unsigned int far IDE_Data;

#pragma ADDRESS IDE_Error  28002H
 volatile unsigned char far IDE_Error;

#pragma ADDRESS IDE_Feature  28002H
 volatile unsigned char far IDE_Feature;

#pragma ADDRESS IDE_Sectorcount  28004H
 volatile unsigned char far IDE_Sectorcount;

#pragma ADDRESS IDE_Sector  28006H
 volatile unsigned char far IDE_Sector;

#pragma ADDRESS IDE_CylinderLow  28008H
 volatile unsigned char far IDE_CylinderLow;

#pragma ADDRESS IDE_CylinderHigh  2800AH
 volatile unsigned char far IDE_CylinderHigh;

#pragma ADDRESS IDE_Device  2800CH
 volatile unsigned char far IDE_Device;

#pragma ADDRESS IDE_Command 2800EH
 volatile unsigned char far IDE_Command;

Allerdings musste ich den uC auf 9MHz runtertakten, da er ansonsten nur
Müll gelesen hat, und das LCD nicht mehr initialisierte. Das Bustiming
ist verdammt schnell...
Das Programm ist für dieses Vektorgrafik Demo mit dem T6963 LCD, oder
?
Das lief bei mir nur, wenn das LCD mit <10cm Kabel angeschlossen war.
Bei >20cm Kabel ging garnichts.

von Bruno (Gast)


Lesenswert?

Danke für deine Antwort Benedikt

Den einzigen Unterschied,den ich gefunden habe, ist ,dass du im main
das csr beschreibst. csr=1+2+4+16+32  <= in welchem Zahlenformat wird
das interpretiert? ( nehme an in dez.).
Auf welche Spannung hast du den Byte Pin gelegt?
Gibt es noch andere Register, die ich beschreiben muss, damit die
aktiviert werden (muss ich ja nicht vor jedem Zugriff selber setzen).

von Benedikt (Gast)


Lesenswert?

Byte liegt auf Masse, Hold, RDY und NMI hängen über einen 10k Pullup an
+5V.

Der M16C verzeiht keine Programmierfehler. Wenn im Datenblatt ein Bit
mit "Set to 0" beschriftet ist, dann muss das auch so sein.
Ich hatte eine Software für den 62p geschrieben, habe danach aber den
62 verwendet, bei dem es ein paar Bits in den Registern nicht gab, die
daher auf 0 gesetzt werden sollten. Sowas übersieht man aber mal
schnell.
Jedenfalls lieferte der ADC nur Müll, wenn das PLL Bit gesetzt war, der
interne RAM ging nicht wenn das Wait State Select Bit gesetzt war usw.

von Bruno (Gast)


Lesenswert?

Habe ich gleich. CS0 wird nun angesteuert aber CS2 nicht. Die Adresse
wird aber auch nie auf den Bus gelegt.
Habe heute schon wieder 3 Stunden geübt.

von Bruno (Gast)


Lesenswert?

CS2 wird nun wie gewünscht angesteuert. CNVSS war auf dem Glyn Board mit
JP5 auf P50/WRL verbunden. Ich glaube, dass ich nun die Stecknadel im
Heuhaufen gefunden habe. Seufz

von Bruno (Gast)


Lesenswert?

Die Probleme finden kein Ende

#pragma ADRESSE LED 30000H
volatile unsigned char far LED;

void main(void)
{while (1)
{
LED=0xAA;
}
}

Es wird die Adresse 10000h mit CS2 ausgegeben. Wieso?
Muss die sect30.inc noch angepasst werden? (HORROR).
Giebt es keine einfach Möglichkeit, einen Pointer auf die Adresse zu
legen?

von Benedikt (Gast)


Lesenswert?

Natürlich kannst du Pointer verwenden:
char far *LED;
LED=(char *) 0x030000;
*LED=0xAA;

Ist das E hinter ADRESS ein Schreibfehler, oder hast du das auch im
Programm so ?

Wenn du die Adressen direkt eingibst, musst du an der sect30.inc und
ncrt.a30 nichts ändern.
Ich verwende 128kB SRAM, und musste den Compiler dazu bringen die
Variablen in den entsprechenden Adressbereich zu legen. Da musste ich
diese Dateien ändern.

von Bruno (Gast)


Lesenswert?

Habe ich im Programm auch so, wobei das hatte keine Auswirkung.
Kannst du mir eventuell erklären, wieso bei
#pragma ADRESS LED 30000H
volatile unsigned char far LED;

void main(void)
{while (1)
{
LED=0xAA;
}
}
10000h ausgegeben wird und bei

#pragma register LED 30000H
volatile unsigned char far LED;

void main(void)
{while (1)
{
LED=0xAA;
}
}
0F000h ?????

bei der sect30.inc verstehe ich nur Bahnhof. Null Durchblick. Ich weis
nur, dass das mit der Adress(Speicher)-Aufteilung zu tun hat.
:)

von Benedikt (Gast)


Lesenswert?

Gute Frage, ich hätte noch vor einem halben Jahre gesagt, das ist
unmöglich, aber der M16C überrascht mich jedes mal aufs neue...

Hast du das mal mit dem Pointer versucht ?

Die sect30.inc ist garnichtmal sooo kompliziert:
Am Anfang sind die Adressbereiche definiert, wo die Variablen hingelegt
werden.
Weiter unten kommen dann die Interrupts
Da muss für jeden Interrupt entweder ein dummy_int oder eine Name
stehen, der dann auch irgendwo im Programm auftaucht.

von Alex (Gast)


Lesenswert?

Bruno! Was hast du mit CNVSS gemacht??
Mein M16c62p will auch nicht in den Memory Mapped Mode!

von Bruno (Gast)


Lesenswert?

Bei der Programmierung auf VCC (CNVSS), danach (Run mode)auf GND.
Bei der Programmierung auf GND (HOLD), danach (Run mode)auf VCC.
/RDY=VCC
BYTE=VCC
/CS1-/CS3 Pull-up 10kE


Gruss Bruno

von Bruno (Gast)


Angehängte Dateien:

Lesenswert?

Hier das Schema des Controllers

Gruss Bruno

von Alex (Gast)


Lesenswert?

Danke Bruno!

Ich habe das Renesas SKP Board SKP16c62p und möchte dort am CS3 einen
CS8900a Ethernbaustein ansprechen!
Die RDY Leitung habe ich an der Ethernetcontroller angeschlossen!
(Will immer sehen wann er fertig ist)

CS3 liegt am AEN des CS8900a und mit 4,7k an VCC;
WRL und WRH gehen auf ein 74HC08(AND) und dann an WR des Cs8900
RD geht direkt an den RD des CS8900;
HOLD liegt mit 4,7k an VCC;
BYTE und CNVss liegen von hause aus mit 10k an GND;
BCLK ist frei;
NMI ist mit 10k an Vcc

Leider kommt nur Schrott aus den Registern des CS8900!!!

Adressbereich 0x6000

hier meine Initialisierung :

        pd8_0 = 1;  //RESET
  /* Enable write to CR and PM */
  prc0 = 1;
  prc1 = 1;
  /* CPU full speed */
  cm1 = V_FAST;
  cm0 = 0x08;
  /* Processor mode */
  pm00 = 1;
  pm02 = 1;
  pm13 = 1;
  /* Chip select for CS8900 */
  cs3 = 1;
  /* Lock that regs again */
  prcr = 0;
  /* Finally hardware reset the CS8900 */
  p8_0 = 1;
  CS89_Delay(100);
  p8_0 = 0;

von Alex (Gast)


Lesenswert?

Keine Idee Bruno!

Schade!

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.