www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik mega64 UART


Autor: Captain Chaos (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
im anhang steht code, mit dem ich durch einen Interrupt den UART auslese 
und auswerte. wenn ich aber eines der Zeichen zu dem µC sende passiert 
gar nichts. an der hardware kanns nicht liegen, also was habe ich falsch 
gemacht?
Danke für Hilfe!

Autor: inoffizieller WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab zwar (fats) keine Ahnung von Assembler, aber was steht in UBRR0L 
drin?
Kann es sein, dass da auch 0x00 drin steht?

Autor: Captain Chaos (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nein! da steht 12, also 0x0c drin! nur in UBRR0H steht 0x00, da meine 
baud kleiner als 255 ist und ich somit die oberen 8 bits nicht brauche!
wenn du weisst wie man das in c initialisiert, dann würde mir das auch 
helfen!

Autor: inoffizieller WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>wenn du weisst wie man das in c initialisiert, dann würde mir das auch
>helfen!

Was bringt es dir, wenn ich es weiß? ;-)

(Steht übrigens auch im Datenblatt beschrieben...)

#define fosc 20000000
#define baud0 9600
#define UBRR0 fosc / (16L * baud0) - 1

void init_SIO0(void)
// Kommunikation mit der Webbox
{
  UBRR0H = (unsigned char) (UBRR0>>8);
  UBRR0L = (unsigned char) (UBRR0);
  UCSR0B = (1<<RXEN0) | (1<<TXEN0) | (1<<RXCIE0);
  UCSR0C = (1<<UCSZ01) | (1<<UCSZ00);
}

So initialisiere ich das USART für Vollduplex-Betrieb mit 
Empfangs-Interrupt. (UDRIE gebe ich erst im Verlauf des Programms frei, 
weil sonst dauernd der Interrupt ausgelöst würde.)

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

Bewertung
0 lesenswert
nicht lesenswert
> zu dem µC sende passiert gar nichts.

Woher weist du das?
Du schaltest die Relais ein und ein paar NanoSekunden
später schaltest du sie wieder aus. Ich glaube kaum
dass du, oder die Relais diese kurze Zeit mitkriegen.

Autor: Captain Chaos (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
habe meine Baudrate mit dem Oszilloskop nachgemessen. Dabei kam heraus 
dass sie viel zu hoch ist! Ich habe versucht sie zu ändern, aber es 
funktioniert nicht. Warum(Code liegt bei)

Autor: Metaller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Leider habe ich jetzt keine Zeit für Erklärungen, aber versuch den 
nachfolgenden Code mal. Wenn ich Zeit habe werde ich es Dir erklären.


usart_rx:
  push   mp    ;mp Speichern
  in   mp, UDR0  ;USART auslesen
  cpi   mp, 0x31  ;mit 1 vergleiche
  brne   rx_1    ;wenn nicht 1 dann weiter
  sbi   PORTC, 0  ;wenn 1 dann relaise 1 Schalten
  rjmp rx_end
rx_1:
  cpi   mp, 0x32  ;mit 2 vergleiche
  brne   rx_2    ;wenn nicht 2 dann weiter
  sbi   PORTC, 1  ;wenn 2 dann relaise 2 Schalten
  rjmp rx_end
rx_2:
  cpi   mp, 0x33  ;mit 3 vergleiche
  brne   rx_3    ;wenn nicht 3 dann weiter
  sbi   PORTC, 2  ;wenn 3 dann relaise 3 Schalten
  rjmp rx_end
rx_3:
  cpi   mp, 0x34  ;mit 4 vergleiche
  brne   rx_4    ;wenn nicht 4 dann weiter
  sbi   PORTC, 3  ;wenn 4 dann relaise 4 Schalten
  rjmp rx_end
rx_4:
  cpi   mp, 0x35  ;mit 5 vergleiche
  brne   rx_e    ;wenn nicht 5 dann weiter
  sbi   PORTC, 4  ;wenn 5 dann relaise 5 Schalten
  rjmp rx_end
rx_e:
  cpi   mp, 0x65  ;mit e vergleiche
  brne   rx_end    ;wenn nicht e dann ende
  ldi   mp, 0x00  ;wenn e dann alle relaise ausschalten
  out   PORTC, mp
rx_end:
  pop   mp    ;mp Lesen
  reti

Autor: Captain Chaos (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja gut is ne andere Variante, die die USART Receive routine verkürzt. An 
der Baudrate ändert das trotzdem nichts!

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich das richtig sehe, dann beschäftigt sich dein
Pgm erst mal nur damit, eine '1' abzusenden. Aus deiner
Fehlerbeschriebung entnehme ich, dass du diese '1' auf
der Gegenseite nicht richtig empfängst.

Kommt da überhaupt was an?

Wenn nicht, dann könnte das Kabel falsch rum belegt sein.
Wenn beim Empfänger am richtigen Pin zwar was ankommt,
allerdings falsch, dann gibt es eigentlich nur noch
eine Möglichkeit: Die Quarzfreuenz mit der du gerechnet
hast, ist nicht die die der µC benutzt.

Autor: Captain Chaos (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also:
Ich benutze 2MHz internen Takt.
Ich sende nirgendwo hin irgendwas. Ich halte einfach nur das Oszilloskop 
an den TXD-Pin und überprüfe damit meine Baud.
Wenn ich die Baudrate ändere(im Programm, zb aus 12 -> 25), dann 
passiert garnichts, die Daten werden immer noch so schnell wie vorher 
geschrieben. Es liegt nur an der Baud, die sich nicht umstellen lässt.

Autor: Metaller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So da bin ich wieder. Egal was jetzt mit Deiner Übertragungsrate ist, 
aber Du hast in der Interupt Routine "rjmp rx_end" vergessen. Ohne dem 
werden alle Bedingungen durchlaufen, sodass am Ende alle Relais 
ausgeschaltet wieder ausgeschaltet werden, egal ob sie vorher geschaltet 
worden sind. Du wirst nichts vom Schaltvorgang der Relais bzw. der LED's 
mitbekommen, da die Abarbeitung zu schnell ist.

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm
Zumindest im Simulator passieren bei den STS seltsame
Sachen. Könnte aber auch ein Fehler im Simulator sein.

Stelle mal deine Sequenz so um:


  ldi mp, (1<<USBS0)|(3<<UCSZ00); frame format einstellen: 8data, 1stop 
bit
  sts UCSR0C,mp

  ldi mp, 0;
  sts UBRR0H, mp
  ldi mp ,12 ; Baud einstellen 9600
  out UBRR0L, mp

  ldi mp, (1<<RXEN0)|(1<<RXCIE0)|(1<<TXEN0) ; Empfang aktivieren
  out UCSR0B,mp

zumindest im Simulator kommt damit am Ende ein vernünftiges
Ergebnis in den Registern raus.

Autor: Captain Chaos (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Problem gelöst:
statt der out Befehle sts verwenden, oder besser, das hab ich jetzt 
gemacht:
das ganze mit C programmieren, dann braucht man sich über 
alternativ-Befehler nicht den Kopf zu zerbrechen!

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.