mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik M16 Expanded Memory Mode


Autor: Bruno (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Bruno (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Bruno (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Bruno (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Bruno (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Bruno (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
:)

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Alex (Gast)
Datum:

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

Autor: Bruno (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Bruno (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier das Schema des Controllers

Gruss Bruno

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Keine Idee Bruno!

Schade!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.