www.mikrocontroller.net

Forum: Compiler & IDEs atmega16 serielle Kommunikation


Autor: Thomas Peter (Gast)
Datum:
Angehängte Dateien:

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

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

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

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

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

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

Bewertung
0 lesenswert
nicht lesenswert
> ist dies

>   toggle = 1 - toggle;

> viel kürzer

Oder

toggle ^= 1;

Autor: Thomas Peter (Gast)
Datum:

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

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

Bewertung
0 lesenswert
nicht lesenswert
Hab das mal ausprobiert. Funktioniert bei mir klaglos.

Autor: Thomas Peter (Gast)
Datum:

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

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.