mikrocontroller.net

Forum: Compiler & IDEs ATMega128 und UART1 Problem


Autor: Bernd E. (edi)
Datum:
Angehängte Dateien:

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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

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

Autor: Bernd E. (edi)
Datum:

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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

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

Autor: Bernd E. (edi)
Datum:

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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

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

Autor: Bernd E. (edi)
Datum:

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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

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

Autor: Bernd E. (edi)
Datum:

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

Autor: Bernd E. (edi)
Datum:
Angehängte Dateien:

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

Autor: Magnus Müller (Gast)
Datum:

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

Autor: Magnus Müller (Gast)
Datum:

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

Autor: Magnus Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
   if (PINA != 0xFF && !bit_is_set(UCSR1B,UDRIE1))

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

ersetzen.

Autor: Magnus Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
int main(void)
{
  int baud;
  
  head=-1;
    
  DDRA = 0x00;
  DDRB = 0xFF;
  
  baud=cpuclock/((baudrate*16UL)-1);  
  init_usart1(baud);
  sei();
   (...)
}

// Init USART1
void init_usart1( unsigned int baud )
{
  cli();
   (...)
  sei();
}

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

Autor: Walter (Gast)
Datum:

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

Autor: Bernd E. (edi)
Datum:

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

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.