Forum: Compiler & IDEs atmega16 serielle Kommunikation


von Thomas Peter (Gast)


Angehängte Dateien:

Lesenswert?

Hi,
ich bin jetzt schon eine ganze Weile am Probieren eine Möglichkeit zu
finden meinem atmega16 8bit Werte über die serielle Schnittstelle zu
übergeben. Am Ende soll damit eine Software PWM gesteuert werden,
allerdings liegt das Problem schon bei der Kommunikation.
Der Übersicht und Fehlersuche halber habe ich mal die Empfangsroutine
aus meinem anderen Programm übernommen.
Das Programm hängt in einer Endlosschleife und springt
interruptgesteuert in die Empfangsroutine. Der empfangene Wert wird
dann auf PortA ausgegeben PinB0 wird bei jedem Sprung in die Routine
getoggelt.

Soweit dazu was das Programm tun SOLLTE ;). Im Testbetrieb allerdings
zeigt mir mein atmega am PortA absolut nicht das an was ich ihm per
Terminal schicke.
Meine Frage ist nun ob es schon ein Software Problem ist, oder ob ich
den Fehler woanders suchen muss.
Der einzige Punkt der mir kritisch erscheint ist die Zuweisung der
Variablen buffer(unsigned char) zu PortA (bzw. später zu einer int
Variablen). Könnte es sein dass diese Konvertierung Probleme macht?

angefügt ist der Code des Testprogramms mit dem ich im Moment arbeite.
Auf meinem Board ist ein 8,192MHz Kristall(um die Initialisierung zu
erklären)

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


Lesenswert?

> Auf meinem Board ist ein 8,192MHz Kristall

Ich hoffe, es handelt sich dabei um einen Quarzkristall. ;-)

Anyway, hast du den Quarz auch aktiviert?

von Karl H. (kbuchegg)


Lesenswert?

Hmm. Welche Baudrate willst du verwenden?

Wenn ich die übliche Formel anwende

#define UBRR_BAUD  ((F_CPU)/(16*(BAUD))-1)

und für F_CPU 8192000 einsetze, BAUD 9600, dann komme ich
nicht auf deine Werte

  UBRRH  = 0;
  UBRRL  = 64;

auch nicht für eine Baudrate von 4800.

Ich schlage mal vor, du machst sie Initialisierung so:


#define F_CPU    8192000UL
#define BAUD     9600UL             // USART BAUD
#define UBRR_BAUD  ((F_CPU)/(16*(BAUD))-1)


void UARTinit()
{
  UCSRB |= ( 1 << TXEN )|(1 << RXEN)|(1<<RXCIE);
  UCSRC |= ( 1 << URSEL )|( 1<<UCSZ0 )|( 1<<UCSZ1 );
  UBRRH  = (uint8_t) (UBRR_BAUD>>8);  // USART Baud
  UBRRL  = (uint8_t) UBRR_BAUD;
}

dann kümmert sich der Compiler um die Berechnung.

PS:
  toggle = (toggle+1)%2;

Das ist etwas umständlich. Für den Fall das toggle von vorne
herein nur einen Wert von entweder 0 oder 1 hat (durch Initialisierung
sicher gestellt), ist dies

   toggle = 1 - toggle;

viel kürzer und weniger rechenintensiv.

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


Lesenswert?

> ist dies

>   toggle = 1 - toggle;

> viel kürzer

Oder

toggle ^= 1;

von Thomas Peter (Gast)


Lesenswert?

Hi ihr 2,
also als Baudrate hatte ich eigentlich 9600 eingestellt, den Wert hatte
ich aus einer Tabelle. Quarz ist auch soweit eingestellt, bzw die fuses
gesetzt.
Ich werde jetzt dann mal deinen Code versuchen ob ich damit mehr erfolg
habe. Vielen Dank auf jeden Fall schonmal für die Antworten, ich werd
mich wieder melden :).

von Karl H. (kbuchegg)


Lesenswert?

Hab das mal ausprobiert. Funktioniert bei mir klaglos.

von Thomas Peter (Gast)


Lesenswert?

Hallöchen,
scheint alles zu funktionieren, hab eben auch schon mit dem
eigentlichen Programm und der neuen Initialisierung gearbeitet und
gemessen. Es scheint soweit alles zu funktionieren. Hätte ich wohl von
Anfang an wen fragen sollen der sich damit auskennt ;).

Danke nochmal

mfG Thomas

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.