mega64 UART

Gast #430629
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!
Angehängte Dateien:
Gast #430640
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!
Gast #430647
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.)
Gast #431961
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
#431973
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.
Gast #431981
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.
Gast #431990
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.
#432012
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.
Gast #432026
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren