mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik UART ATMega64L


Autor: Freshman (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Liebe Kollegen!!

Ich schaffe es nicht die UART auf meinem CEREBOT II Board mit einem 
ATMega64L zum laufen zu bringen. Zur Kontrolle ob Daten gesendet werde 
bzw. zum empfangen benutze ich Hypertermina.

Vielleicht ist jemand so lieb und sieht sich mein Programm an und gibt 
mir einen Tip bzw. sagt mir wo der Fehler liegt.
#include <avr/io.h>
#include <avr/interrupt.h>
//#include <avr/signal.h>
#include <inttypes.h>
#include <avr/delay.h>
//#include <avr/iom64.h>

ISR (USART1_RX_vect);

#define F_OSC 8000000               /* oscillator-frequency in Hz */
#define UART_BAUD_RATE 9600
#define UART_BAUD_CALC(UART_BAUD_RATE,F_OSC) ((F_OSC)/((UART_BAUD_RATE)*16l)-1)


void visableDelay(uint8_t cnt)
{
  uint8_t c;

  // avr/delay.h  _dealy_loop_2() which takes a
  // uint16_t as its argument
  // provides a delay determined by the argument, 
  // this delay varies with processor speed
  // the value is fixed at 0x8000 for an the 8 mhz cerebot
  for(c = 0; c < cnt; c++)
  {
    
    _delay_loop_2(0x8000);      
  }
}

void usart_putc(unsigned char c) {
   // wait until UDR ready
  while(!(UCSR1A & (1 << UDRE1)));
  UDR1 = c;    // send character
  return;
}



void init(void) {
  // set baud rate
  
  UBRR1H = (uint8_t)(UART_BAUD_CALC(UART_BAUD_RATE,F_OSC)>>8);
  UBRR1L = (uint8_t)UART_BAUD_CALC(UART_BAUD_RATE,F_OSC);
  UCSR1A = (1 << RXC1);
  // Enable receiver and transmitter; enable RX interrupt
  UCSR1B = (1 << RXEN1) | (1 << TXEN1) | (1 << RXCIE1);

  //asynchronous 8N1
  UCSR1C = (1 << UCSZ10) | (1 << UCSZ11) | (1 << UMSEL1); //| (1 << UCSZ00) | (1 << UCSZ11);
  return;
}

// INTERRUPT can be interrupted
// SIGNAL can't be interrupted
ISR (USART1_RX_vect) { // USART RX interrupt
  unsigned char c;
  PORTE &= ~(1 << PE6);
  c = UDR1;
  usart_putc(c);
  return;
}

int main(void) {
  DDRE = 0xf0;
  //PORTE |= (1 << PE6);
  init(); // init USART
    //PORTE |= (1 << PE6);
  sei();  // enable interrupts
  
  // send initial character
  while(!(UCSR1A & (1 << UDRE1)));
  UDR1 = 0x43; // "C"
  PORTE |= (1 << PE4);
  while(!(UCSR1A & (1 << UDRE1)));
  UDR1 = 0x0d;

  // enable  PD5 as output
  
  while (1) {
    // PIN5 PORTD clear -> LED off
    PORTE &= ~(1 << PE5);
    visableDelay(15);
    // PIN5 PORTD set -> LED on
    
    PORTE |= (1 << PE5);
    visableDelay(15);  
  }
  return 0;
}

DANKE für Eure Hilfe!!!

Freshman

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was ist das Problem?
Kommen keine Zeichen? Falsche Zeichen?

BTW:
das hier
  UDR1 = 0x43; // "C"
könntest du auch so schreiben
  UDR1 = 'C'; // "C"

Autor: Freshman (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, weder am Hyperterminal (9600 Boud, 8 Datenbit, 1 Stopbit, keine 
Parität) noch auf dem Board (Led 6 geht nicht an).

Ich hab schon alles 3 mal kontrolliert aber es tut sich nichts. Ich komm 
einfach nicht auf den Fehler.

Freshman

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Freshman schrieb:

> #define UART_BAUD_RATE 9600

mach daraus mal eine unsigned long..

Autor: Freshman (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich hab das UBRRIH ganz weggelassen und in´s UBRRIL 0x33 (für 51) 
geschrieben. Tut sich auch nichts.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>  //PORTE |= (1 << PE6);
> (Led 6 geht nicht an).
Eigentlich klar, oder?

>>     PORTE |= (1 << PE5);
Blinkt wenigstens die LED 5?

Autor: Freshman (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
die Led 6 verwende ich in der ISR.

Ja, die Led 5 Blinkt und die 4er leuchtet.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du die Hardware (MAX232, Kabel) schon kontrolliert?

Prozessor aus dem Sockel nehmen. Den Tx Pin mit dem Rx Pin DIREKT IM 
SOCKEL mit einem Stückchen Draht brücken und nachsehen ob sich 
Hyperterminal selbst Zeichen schicken kann. Wenn nicht ist höchst 
wahrscheinlich das Kabel nicht richtig gekreuzt. Du kannst zb mit einer 
Led (+Vorwiderstand) auf die Suche gehen, wo die PC-Signale 
verschwwinden.

Autor: Freshman (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, ich habe ein Zwischenstück reingegeben, mit dem ich die Leitungen 
kreuzen kann. Tut sich immer noch nichts. Auch nicht wenn ich per Matlab 
an das Board sende oder empfangen will.

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hyperterm hab ich auch mel probiert und hatte anfangs probleme

it hterm http://www.der-hammer.info/terminal/  war es besser für mich 
als anfänger

Autor: Freshman (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab schon mit dem Hyperterminal gearbeitet (hab einen FPGA 
angehängt), ich finde ihn nicht so schlecht.

Das Programm schau ich mir aber auf jeden Fall an, DANKE.

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.