Forum: Mikrocontroller und Digitale Elektronik mega64 UART


von Captain Chaos (Gast)


Angehängte Dateien:

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!

von inoffizieller WM-Rahul (Gast)


Lesenswert?

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

von Captain Chaos (Gast)


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!

von inoffizieller WM-Rahul (Gast)


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.)

von Karl H. (kbuchegg)


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.

von Captain Chaos (Gast)


Angehängte Dateien:

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)

von Metaller (Gast)


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

von Captain Chaos (Gast)


Lesenswert?

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

von Karl heinz B. (kbucheg)


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.

von Captain Chaos (Gast)


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.

von Metaller (Gast)


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.

von Karl heinz B. (kbucheg)


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.

von Captain Chaos (Gast)


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!

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.