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!
Ich hab zwar (fats) keine Ahnung von Assembler, aber was steht in UBRR0L drin? Kann es sein, dass da auch 0x00 drin steht?
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
ja gut is ne andere Variante, die die USART Receive routine verkürzt. An der Baudrate ändert das trotzdem nichts!
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!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.