Forum: Compiler & IDEs UART Empfang mit Atmega168 funktioniert nicht


von Manuel (Gast)


Lesenswert?

Hi,

Ich versuche gerade verzweifelt mit meinem Atmega168 etwas zu empfangen. 
Hatte damals mein MyAVR Board mit einem Atmega8 und da ich mich vor 
kurzem aus meinem Atmega8 ausgesperrt habe durch falsche FuseBits hab 
ich mir den 168er gekauft.

Das versenden vom µc an den PC funktioniert ohne Probleme...
Hier mal der Code:

<code>
#define F_CPU 3686400
#define USART_BAUD_RATE 9600
#define USART_BAUD_SELECT (F_CPU/(USART_BAUD_RATE*16L)-1)

#include <avr/io.h>
#include <avr/interrupt.h>

void sendUart(char* cmd)
{
  do
  {
    while (!(UCSR0A & (1<<UDRE0)))  {}              // Warten bis man 
senden kann
    UDR0 = *cmd++;                                  // senden und zum 
nächsten zeichen wechseln
  }
  while(*cmd);                                      // so lange bis das 
ende erreicht ist
}

unsigned char USART_Receive( void )
{
  /* Wait for data to be received */
  while ( !(UCSR0A & (1<<RXC0)) )
    ;
  /* Get and return received data from buffer */
  return UDR0;
}

void USART_Init( unsigned int baud )
{
  /* Set baud rate */
  UBRR0H = (unsigned char)(baud>>8);
  UBRR0L = (unsigned char)baud;
  /* Enable receiver and transmitter */
  UCSR0B = (1<<RXEN0)|(1<<TXEN0) | (1<<RXCIE0);
  /* Set frame format: 8data, 2stop bit */
  UCSR0C = (1<<USBS0)|(3<<UCSZ00);
}

ISR(USART_RX_vect)
{
  PORTC = 0xFF;
}

int main(void)
{
  USART_Init(USART_BAUD_SELECT);
  sei();
  DDRC = 0xFF;
  sendUart("Programm gestartet\n");
  PORTC = 0x00;
  //USART_Receive();
  //PORTC = 0xFF;
  for(;;){}
}
</code>

USART_Init() und USART_Receive() hab ich aus dem Datenblatt übernommen.
Die Baudrate und das initialisieren müsste korrekt sein, da das Senden 
ja funktioniert.
Nur egal ob ich die USART_Recieve(); verwende, oder die 
Interrupt-methode, es passiert beidesmal nichts!! Das Kabel hab ich auch 
schon durchgemessen, das müsste funktionieren. Ich verstehe das nicht. 
Mit dem Atmega8 hat damals der Empfang auch funktioniert ( ist aber 
schon 1 1/2 Jahre her)

Der Code müsste doch richtig sein oder nicht?

Was mache ich falsch?

von O. D. (odbs)


Lesenswert?

Hardware-Probleme ausgeschlossen?

D.h., die RXD-Leitung liegt auf 5V und das Multimeter "zuckt", wenn 
Daten vom PC ankommen?

von Karl heinz B. (kbucheg)


Lesenswert?

> Das versenden vom µc an den PC funktioniert ohne Probleme...

Am PC eventuell noch das Handshaking aktiv?

> Hatte damals mein MyAVR Board mit einem Atmega8 und da ich mich
> vor kurzem aus meinem Atmega8 ausgesperrt habe durch falsche
> FuseBits hab ich mir den 168er gekauft.

Du weist wie du den Mega8 wieder öffnen kannst?

von Manuel B. (man)


Lesenswert?

Oliver Döring wrote:
> Hardware-Probleme ausgeschlossen?
>
> D.h., die RXD-Leitung liegt auf 5V und das Multimeter "zuckt", wenn
> Daten vom PC ankommen?


Also die RXD und TXD Leitungen sind am µc gemessen beide auf 5v (PD0 und 
PD1)

Wenn etwas ankommt müsste, zuckt aber nichts. Es bleibt ganz ruhig auf 
der gleichen Spannung.


Karl heinz Buchegger wrote:
>> Das versenden vom µc an den PC funktioniert ohne Probleme...
>
> Am PC eventuell noch das Handshaking aktiv?

Keine Ahnung... ich benutze KontrollerLab und da war das einzigste was 
ich eingegeben hab die Baud rate und das Device ansonsten nichts.
Später hab ichs mal mit
echo "test" > /dev/ttyS0
nach dem ich mit
setserial /dev/ttyS0 uart 16550A
den comport für uart eingestellt habe.


> Du weist wie du den Mega8 wieder öffnen kannst?

So viel ich weis hab ich den µc wohl auf externe Clocksource 
eingestellt. Also müsste ich halt irgendwie nen Takt erzeugen eventuell 
mit nem anderen µc. Oder gibts noch was besseres?

von Manuel B. (man)


Lesenswert?

Ich habe gerade festgestellt, dass mit dem myAvr Controlcenter (hab das 
myAvr board) die UART Kommunikation in beide Richtungen funktioniert!! 
Und sogar mit hyperterm funktioniert es plötzlich. Ich hatte einfach 
vergessen Flusssteuerung auf keine einzustellen. mit echo "test" > 
/dev/ttyS0 gehts jetzt auch. Jetzt würde mich nur noch sehr 
interessieren wieso es nicht mit Kontrollerlab funktioniert.

von cadManiac (Gast)


Lesenswert?

Hi!

Ich bin einer der Entwickler von KontrollerLab. Es geht deshalb nicht, 
weil wir beim KontrollerLab standardmäßig (und ohne groß darüber 
nachzudenken, aber so entstehen ja die meisten Bugs :-) ) die 
Flußkontrolle per RTS/CTS eingeschaltet hatten. Das ist mittlerweile 
gefixt, man kann das jetzt einstellen wie man will (RTS/CTS, XON/XOFF 
oder keine Flusskontrolle). Das ist dann in der 0.7.1er Version drin, 
die in ca. 3 Tagen erscheinen wird.

Für eilige: Man kann sich das ganze natürlich auch aus den Sourcen 
selber bauen und das ganze aus dem SVN repository ziehen. Bitte seid 
nicht irritiert, dass da bereits die Toolbar für den Debugger drin ist, 
die aber noch nicht funktioniert. Ignoriert sie einfach :-) Das kommt 
dann alles noch in einem guten Monat oder so.

viele Grüße,
Martin

von Manuel B. (man)


Lesenswert?

Das freut mich! wird es auch gleich ein (K)ubuntu-deb geben?

Gruß
Manuel

von cadManiac (Gast)


Lesenswert?

Sorry, war länger nicht mehr hier. Nur der Vollständigkeit halber: Ja, 
den gibts. Das hast Du aber wahrscheinlich längst bemerkt ;-)

Viele Grüße,
Martin

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.