mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Switch Anweisung beim ATMEGA32 funktioniert nicht


Autor: Martin (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Moin..
Ich benutze einen ATMega 32. Ich möchte durch eine Eingaba am PC PWM's 
unterschiedlich steuern. Die Baudrate des UARTs habe ich festgelegt,
aber irgendwie springt er immer nur in die default Anweisung. Egal ob
ich "1" bzw. eine andere switch Anweisung probiere, oder ob ich einfach
einen Buchstaben dürcke. Hat jemand eine Ahnung?

Bin dankbar für jede Hilfe.

Danke Gruß Martin

P.s. Quellcode im Anhang.

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
case 1, nicht case '1'

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

Bewertung
0 lesenswert
nicht lesenswert
Michael G. wrote:
> case 1, nicht case '1'

Wieso?  Er gibt den Krempel doch über die UART ein.  Meinst du, er
will ^A drücken statt einer 1?

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Die Baudrate des UARTs habe ich festgelegt

Nein, hast du nicht. Du schreibst nichts in UBRR.

Und wieso machst du einen neuen Thread auf ?

Beitrag "Mega 32 PWM auf UART Befehl mit Switchanweisung"

Autor: Martin Ramm (martinramm)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry...
habe erst gerad gemerkt, das, wenn man was neues schreibt, der wieder 
als aktuell gilt.

jedenfalls habe ich die Funktion, wo der UART initialisiert wird wie 
folgt erweitert..

void Usart_EnableRX(void)
{
    UCSRB |= ( 1 << RXEN );
    UBRRH = UBRR_VAL >> 8;
    UBRRL = UBRR_VAL & 0xFF;
}

aber ich dachte das der UART funktioniert, da ich ja durch drücken einer 
Taste (leider einer beliebigen) eine Rückmeldung bekomme. Er springt in 
den "default" Teil.

Gruß Martin

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

Bewertung
0 lesenswert
nicht lesenswert
> aber ich dachte das der UART funktioniert...
Tut er ja, aber mit der falschen Baudrate.

> drücken einer Taste ... springt in den "default" Teil.
Genau deshalb.
Gib doch das empfangene Zeichen gleich auf der RS232-Schnitte wieder 
aus, dann siehst du, was der uC sieht.
Oder sende zum Test, ob deine Buadrate stimmt, einfach mal ein Zeichen 
vom uC an das Terminal.

Autor: Martin Ramm (martinramm)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich scheine hierfür einfach zu blöd zu sein. Im Datenblatt bin ich auf 
dies gestoßen:

void USART_Init( unsigned int baud )
{
/* Set baud rate */
UBRRH = (unsigned char)(baud>>8);       <------------
UBRRL = (unsigned char)baud;            <------------
/* Enable receiver and transmitter */
UCSRB = (1<<RXEN)|(1<<TXEN);
/* Set frame format: 8data, 2stop bit */
UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
}

wobei die von mir markierten Zeilen die Baudrate festlegen richtig?
was ist mit "unsigned char" gemeint und die variable "baud" wird sicher 
die Baudrate sein oder? jetzt weiß ich aber immernoch nicht welchen Wert 
diese haben sollte. wie müsste ich denn meinen Code modifizieren?:


void Usart_EnableRX(void)
{
    UCSRB |= ( 1 << RXEN );
    UBRRH = UBRR_VAL >> 8;
    UBRRL = UBRR_VAL & 0xFF;
}


Gruß Martin

Autor: Klausy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kuckst Du Datenblatt: UBRR = (fosc/16*Baud)-1.!!!!!!!!!!!!!!!!!!!1

Autor: Tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau dir doch mal im debugger die Werte, die in UBBRH und UBBRL, stehen 
an.

Autor: Guru (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ich scheine hierfür einfach zu blöd zu sein

Der schein kann trügen. Aber scheinbar nicht immer...

Autor: Martin Ramm (martinramm)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klausy wrote:
> kuckst Du Datenblatt: UBRR = (fosc/16*Baud)-1.!!!!!!!!!!!!!!!!!!!1


das habe ich auch gefunden. Die Frage ist jetzt bloß, wie schon zuvor, 
welchen Wert hat "Baud"

Autor: Klausy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Baud hat den wert den du für deine Baudrate einstellen willst zb. 9600, 
19200...

Autor: Martin Ramm (martinramm)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ahh..
ja 9600 möchte ich.
fosc sollte auf 8000000 eingestellt sein (Fusebits).
die einzige Frage die sich mir noch stellt: Beim Mega 32 habe ich ja 
UBRRL und UBRRH im Datenblatt steht, wie du schon richtig sagst:

UBRR = (fosc/16*Baud)-1

wie soll ich das denn nun trennen bzw. wie soll ich das verstehen?

gruß Martin

Autor: Klausy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Menschnskind" UBRR = 51, is bloß das low Byte also schreibst du UBRRL= 
51 und UBRRH = 0!!!!

Autor: Stefan Kleinwort (_sk_)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gib mal ein Zeichen über den UART an den PC aus.
Alternativ kannst Du, falls vorhanden, den RXD-Pin messen, und schauen, 
ob die richtige Baudrate eingestellt ist.

Fehler können sein:
* falsche Baudrate eingestellt
* interner RC statt externer Quarz eingestellt (Fuses).

Welches Equipment hast Du?
* Oszi?
* jtag-Debugger?

Gruß, Stefan

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> fosc sollte auf 8000000 eingestellt sein (Fusebits).

Verwendest du den internen Takt? Der ist für RS232 zu ungenau. Du 
solltest einen externen Taktgeber (Quarz, Quarzoszillator) verwenden.

Autor: Martin Ramm (martinramm)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So habe dank der freundlichen Antwort UBRRH und UBRRL geschrieben und 
habe mir auch etwas ausgeben lassen.

void Usart_EnableRX(void)
{
    UCSRB |= ( 1 << RXEN )|(1<<TXEN);

    UBRRH = 0;
    UBRRL = 51;

  while (!(UCSRA & (1<<UDRE)))
    {
    }
 UDR = 'x';
}

es wird mir zwar ein "ÿ" ausgegeben, aber das würde ich auf den ASCII - 
Code zurückführen. Richtig?
Leider funktioniert meine Switch - Case - Anweisung immer noch nicht.

hab ein dig. Oszi da.

Autor: Guru (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bitte was?!? Nein, der ASCII-Code von 'x' ist nicht 'ÿ'. Ein 'x' ist ein 
'x' ist ein 'x'...

Autor: Klausy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du denn dein Terminal auf 2StopBit's eingestellt?

Autor: Martin Ramm (martinramm)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm... hatte auch nicht weiter geschaut. Grobe Vermutung. ;-) und warum 
bekomme ich ein ÿ ausgegeben?

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

Bewertung
0 lesenswert
nicht lesenswert
Martin Ramm wrote:
> und warum
> bekomme ich ein ÿ ausgegeben?

Weil deine Baudrate kilometerweit daneben liegt.  Das ÿ ist das
Zeichen 255, es werden also alle Bits als 1 detektiert.  Das riecht
verdächtig nach "Sender ist vieeel zu langsam".

Bist du dir sicher, dass du die 8 MHz auch wirklich eingestellt hast
und nicht noch mit den 1 MHz Standardtakt tickst?

Leider ist der ATmega32 schon etwas angeältelt, der hat noch keinen
CKOUT-Ausgang als Option.  Du kannst dir aber fosc/2 an einem OCx-Pin
ausgeben lassen, indem du den Timer ohne Vorteiler konfigurierst,
das zugehörige OCRx auf 0 setzt, die Betriebsart CTC wählst, und
die Funktion des OCx-Pins auf "Toggle on compare match" stellst.
Dann kannst du die halbe Oszillatorfrequenz am entsprechenden Pin
messen und nachsehen, ob es 0,5 MHz oder 4 MHz sind.

Achso: als alternativen Nachweis kannst du ja mal das Terminalprogramm
auf 9600 Bd / 8, also 1200 Bd einstellen.

Autor: Martin Ramm (martinramm)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oh man.. der gehört schon wieder in die Kategorie "Sau dumme Fehler" 
hatt aus vorherigen Tests noch 1200 eingestellt. Jetzt klappt das mit 
dem "x" und die Switch - Anweisung geht auch. Oh man ja vielen Dank für 
die Zahlreiche Hilfe.

Gruß Martin

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.