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