Forum: Compiler & IDEs ATMega128 und UART1 Problem


von Bernd E. (edi)


Angehängte Dateien:

Lesenswert?

Hallo,
versuche heute schon den ganzen Tag ein Programm zum laufen zu bringen,
welches vom Mega128 Daten an den PC sendet, aber leider empfange ich im
Hyperterminal gar nichts! Verwende dafür STK500 + STK501, dabei wird der
RS232 Spare2 am STK501 verwendet, habe daher folgende zwei Brücken
gemacht:

STK501 RXD -> STK500 PortD2 (müßte der UART1 RXD Ausgang vom Mega128
sein)
STK501 TXD -> STK500 PortD3 (müßte der UART1 TXD Ausgang vom Mega128
sein)


Code hab ich euch online gestellt, müßte eigentlich passen. Hab ich
irgendwas zum überbrücken vergessen, oder falsch gemacht? Kabel nehm ich
das selbe wie beim Programmieren, wird nur umgesteckt. Mega103 Komp.
habe ich ausgeschaltet, ebenso JTAG.


Es erlischt und leuchtet wenigstens mal die LED0 am Board, wenn ich
irgendwelche Buchstaben im Hyperterminal eintippe (komisch zwar, dass
sich nur bei einer LED was tut), also ganz tot scheint die Leitung nicht
zu sein.


Bin echt verzweifelt, bitte um Hilfe!

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Läuft denn der ATmega128 auch wirklich mit 3.686 MHz oder vielmehr
mit den 1 MHz des internen RC-Oszillators?

von Bernd E. (edi)


Lesenswert?

Hi,
ich habs auf jeden Fall beim AVR Studio zum downloaden des Programmes 
eingestellt, falls man es sonst nirgens ändern kann sollte es passen!

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Du musst den ATmega128 mit der Fuse auf externen Takt stellen, sonst
läufst du auf dem internen Oszillator.

Steht übrigens auch in der avr-libc-FAQ. ;-)

von Bernd E. (edi)


Lesenswert?

Hi,
habe ich auch schon gemacht, aber geholfen hat es eigentlich nichts, da 
ich nicht genau weiß, welches ich auswählen soll!

Ich habe es mal mit folgendem probiert:
Ext. RC 0sc. 3 - 8 Mhz 6CK + 4ms

Soll ich einen anderen verwenden und wenn ja, welchen?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Keinen externen *RC*-Oszillator, sondern eine externe Takteinspeisung.
Numerisch ist die low fuse dafür 0xE0, aber mit dem AVR Studio kannst
du es nicht numerisch einstellen.

von Bernd E. (edi)


Lesenswert?

Könntest du mir das etwas genauer erläutern, hab leider jetzt gar keinen 
Durchblick mehr wie ich das hinbekommen soll!

Brauch ich da noch zusätzliche Hardware, oder geht das alles per 
software?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Wenn du einen STK500+501 hast, brauchst du keine zusätzliche
Hardware.

Ich kenn mich mit AVR Studio nicht aus, da ich kein Windows habe.
Aber irgendwie, wenn du im Programmierdialog bist und die Fuses
liest, zeigt es dir doch unten die aktuellen Werte hexadezimal
an.  Dort sollte für die low fuse ein 0xE0 stehen.

von Bernd E. (edi)


Lesenswert?

Hi,
du hast mir das Leben gerettet, habe jetzt Ext. Crystal/Resonator High 
Freq. 1K CK + 0ms eingestellt und es läuft endlich. Bin ich froh, dann 
war der ganze Tag doch nicht für die Katz!

DANKE.

von Bernd E. (edi)


Angehängte Dateien:

Lesenswert?

Hab jetzt immer noch ein kleines Problem und zwar habe ich mein Programm
jetzt so programmiert, dass ich durch drücken einer der Taster am STK500
einen Text zum PC übertrage und zwar mittel Interrupt. Die Übertragung
klappt auch, aber nur beim ersten drücken einer Taste, drücke ich
nachher noch einmal eine Taste, so tut sich nichts mehr. Im Simulator
hat es funktioniert, bin etwas ratlos!

Wäre schön, wenn mir jemand helfen könnte!

von Magnus Müller (Gast)


Lesenswert?

1. Fehler:

   volatile uint8_t head;
   (...)
   head=-1;

Warum deklarierst du "head" als unsigned(!) int und weist ihr dann einen 
signed(!) Wert von -1 zu? Müsste da nicht schon der Compiler meckern?

Gruß,
Magnetus

P.S.: Ich such mal noch ein wenig weiter nach Fehlern... ;)

von Magnus Müller (Gast)


Lesenswert?

Wenn Du PORTA für diesen Zweck mit
1
   DDRA = 0x00;
als Eingang definierst, solltest du auch die PullUps durch
1
   PORTA = 0xFF;
aktivieren.

von Magnus Müller (Gast)


Lesenswert?

1
   if (PINA != 0xFF && !bit_is_set(UCSR1B,UDRIE1))

durch
1
   if ((PINA != 0xFF) && !bit_is_set(UCSR1B,UDRIE1))

ersetzen.

von Magnus Müller (Gast)


Lesenswert?

1
int main(void)
2
{
3
  int baud;
4
  
5
  head=-1;
6
    
7
  DDRA = 0x00;
8
  DDRB = 0xFF;
9
  
10
  baud=cpuclock/((baudrate*16UL)-1);  
11
  init_usart1(baud);
12
  sei();
13
   (...)
14
}

1
// Init USART1
2
void init_usart1( unsigned int baud )
3
{
4
  cli();
5
   (...)
6
  sei();
7
}

cli() und sei() haben in der init_usart1 NICHTS zu suchen!!!

sei() steht ohnehin in der main() unmittelbar nach dem Aufruf der 
init_usart1().

So... das wars vorerst mal von meiner Seite. Übernimm mal die genannten 
Änderungen in dein Programm und gib dann bescheid, wie es gelaufen ist.

Gruß,
Magnetus

von Walter (Gast)


Lesenswert?

ISR(USART1_RX_vect)
{
  head++;

  buffer[head] = UDR1;

  if(head > 15)
    head = 0;
}

Das geht so nicht, damit schreibst du in buffer[16] und das ist 
ausserhalb des arrays

Gruß
Walter

von Bernd E. (edi)


Lesenswert?

@Magnetus:

Hi,
danke für deine Anregungen, bin noch Anfänger, daher tue ich mir bei 
manchen Sachen noch etwas schwer!

Habe deine Änderungen übernommen, aber leider ist das Verhalten immer 
noch wie vorher, die Ausgabe funktioniert nur beim ersten drücken der 
Taste!



@Walter:

Habe den Code jetzt umgeschrieben auf diese Version:

ISR(USART1_RX_vect)
{
  head++;

  if(head >15)
  {
     head = 0;
  }

  buffer[head] = UDR1;
}


Mit dem head nicht mehr als unsigned int, jetzt müßte es passen!

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.