Forum: Compiler & IDEs Probleme beim Umstieg von AVR Mega103 auf Mega128


von Christoph Munkelt (Gast)


Lesenswert?

Hallo,

momentan verzweifle ich an folgendem Problem:

nach der Umstellung von Mega103 auf 128 läuft mein
Xilinx-FPGA-Design-Loader nicht mehr (im 103 Kompatibilitätsmodus
läufts prima :-). Kurz umrissen:

3.68 MHz AVR-Taktfrequenz, USART0, bei 115200 Baud, AVR empfängt Daten
vom PC und programmiert FPGA damit, Checksumme der übertragenen
seriellen Daten ist ok, es werden auch alle übertragen... ABER: FPGA
"bootet" nach Übertragung des Designs nicht mehr!

Die eigentliche Programmier-Sequenz ist nicht geändert worden. Ich
nutze ein paar Pins von Port E als Steuerleitungen zum AVR und 8 Bit
auf Port D als Dateneingang zum FPGA. Ich vermute nun, das hier
eventuell eine Kollision mit dem im AVR128 Modus vorhandenem JTAG
Interface auftreten...

Oder hat jemand eine bessere Idee oder eine Vermutung, wo ich noch
suchen könnte???

Vielen Dank,

Christoph Munkelt

PS: relevente Code Snippets (ich bin mir bewußt, daß inp und outp
mitlerweile veraltet sind, Code ist aber schon älter und läuft auf
AVR103 wunderbar, deshalb wollte ich erstmal so wenig wie möglich
ändern...)

//
// Port E, Pinbelegung
//
#define CCLK  0x80    // (7:output) Clock-Signal
#define PROG  0x40    // (6:output) Program-Signal
#define  WRITE  0x20    // (5:output) Write-Signal
#define  CS  0x10    // (4:output) Chip-Select-Signal

#define  INIT  0x08    // (3:input) Init-Signal
#define DONE  0x04    // (2:input) Done-Signal

// Empfangsroutine:

data  = inp( PORTE );
data &= ~CS;      // CS auf LOW
outp( data, PORTE);

do {
  cbi( PORTE, 7);    // CCLK auf LOW
  uartReceiveByte( 0, &data );  // Byte empfangen

  outp( data, PORTD );    // und zum FPGA schreiben

  sbi( PORTE, 7);    // CCLK auf HIGH
  count ++;      // Zaehler erhoehen...

  // solange noch Daten gepuffert sind...
} while( uartReceiveBufferIsEmpty( 0 ) == FALSE );

data  = inp( PORTE );
data |= CS;      // CS auf HIGH
outp( data, PORTE);

data  = inp( PORTE );
data |= WRITE;      // WRITE auf HIGH
outp( data, PORTE);

von Joerg Wunsch (Gast)


Lesenswert?

Ja, JTAG ist standardmäßig eingeschaltet, den mußt Du komplett außer
Betrieb nehmen (per fuse-bit), wenn Du die entsprechenden Port-Pins
benutzen willst.  Da habe ich auch schon mal 'ne Weile dran gesucht,
warum ein halber Port nicht richtig gehen wollte...  Aber ohne
nachzugucken würde ich jetzt sagen, daß JTAG auf dem Port F sitzt.

-mmcu=atmega128 beim Linken hast Du aber gesetzt?  Der ATmega128 hat
ja seinen RAM weiter oben angesiedelt.  Allerdings sollte der 103er
Adreßbereich eigentlich auch laufen, man verplempert nur paar Byte RAM.

von Christoph Munkelt (Gast)


Lesenswert?

Ahm, richtig, JTAG liegt auf PORT F, sollte also kein Problem sein. Ich
hab' grad nochmal in der Doku nachgeschaut, und gesehen, daß USART1 ja
als "alternate function" auf Port D liegt -- und die AVRLIB-Routinen
zur seriellen Kommunikation (glaube ich) diesen enablen...

Ich check das mal schnell, genauso wie die "USART0 external clock"
auf PIN2 von Port E, man kann nie wissen...

Aber Danke ersteinmal...

Christoph Munkelt

PS: ich denke schon, daß bei den gängigen Makefiles die --mmcu Option
automatisch richtig gesetzt wird, ich schau aber auch da nochmal...

von Christoph Munkelt (Gast)


Lesenswert?

Hallo allezusammen,

also, Problem gelöst: es war der durch die AVRLIB default-mässig
eingeschaltete zweite USART (USART1), der 2 Pins auf meinem Datenport D
"umdefinierte". Und weils den ja in der AVR103 Emulation nicht gibt,
lief dort auch alles wunderbar, nur im 128 Mode plötzlich nicht mehr
;-)

Vielen Dank,
Christoph Munkelt

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.