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.
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).
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.
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
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?
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.
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.
:)
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.
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
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;