Forum: Mikrocontroller und Digitale Elektronik USART Kommunikation mit PC fehlerhaft


von suffix (Gast)


Lesenswert?

Hallo,

ich habe folgenden Aufbau:

-Ein STK500 mit eingesetztem AtMega16, PD0 und PD1 sind mit dem 
RS232-Spare-Anschluss verbunden. Das ganze ist über ein 1:1 Kabel mit 
dem COM-Anschluss des PC's verbunden.

Im Controller sind jetzt folgende Programme:

Die Hauptdatei, sorgt für den korrekten Ablauf:

.INCLUDE "m16def.inc"
.EQU  TAKT = 3686400
.EQU  BAUD = 9600
.DEF  akku = r16
.CSEG
rjmp start
.ORG  $2A
start:   ldi    akku,LOW(RAMEND)  ;Stapel initialisieren
    out    SPL,akku
    ldi    akku,HIGH(RAMEND)
    out   SPH,akku    ;--bis hier
    ser    akku      ;PORTB ist Ausgang
    out    DDRB,akku
    out    PORTB,akku
    clr    akku      ;--bis hier
    rcall   initusart    ;Schnittstelle initialisieren
    ldi    akku,'>'    ;und testen
    rcall   putch      ;Zeichen senden
loop:   rcall   getche      ;Arbeitsschleife, Zeichen
    rjmp   loop      ;aufnehmen und senden
    .INCLUDE "konsole.h"  ;Einbinden der Unterprogramme
    .EXIT




initusart.asm:
initusart: push   r16  ;zuerst Register retten
       ldi     r16,LOW(TAKT/(16*BAUD) -1)  ;dann Teiler+Baudrate 
errechnen
       out     UBRRL,r16  ;High+Low-Teil in die
       ldi     r16,HIGH(TAKT/(16*BAUD) -1)  ;Register schreiben
       andi   r16,0b01111111;
       out    UBRRH,r16  ;--bis hier
       sbi    UCSRB,RXEN  ;Empfänger
       sbi    UCSRB,TXEN  ;und Sender ein
       ldi    r16,(1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0) 
;Einstellungen:
       out  UCSRC,r16  ; Asynchron, 8Bit, ein Stopbit
       in    r16,UDR     ;Empfangsregister leeren
       pop  r16        ;zurückschreiben und Rücksprung
       ret      ;



putch.asm:
putch: sbis    UCSRA,UDRE    ;Daten da?
     rjmp    putch    ;wenn nein, Schleife
     out    UDR,r16  ;wenn ja, senden
     ret        ;Rücksprung


getche.asm:
getche: sbis    UCSRA,RXC  ;zuerst Zeichen lesen
    rjmp    getche
    in      r16,UDR
    out      PORTB,r16   ;und auf PORTB ausgeben
getche1:sbis    UCSRA,UDRE  ;und dann zurückschreiben
    rjmp    getche1
    out      UDR,r16
    ret



Das Programm macht im Prinzip was es soll: Nach dem Einschalten 
erscheint ein Zeichen auf dem Hyperterminal, und bei Tastendruck kommt 
was zurück. Nur: es kommt anstatt > nur LL zurück, und auch sonst kommen 
nur einige wenige Zeichen zurück, die eben nicht dem entsprechen was ich 
geschickt habe, die LEDS am STK blinken dazu hektisch.

Ist das ein Fehler oder normal, dass da eben was nicht richtig kodiert, 
bzw. dekodiert wird? Wie kann ich den ein Bitmuster nach Art 0b11111111, 
bzw 255 oder $ff senden? Habs mit einer Text-Datei versucht aber, bei 
jedem Übertragen steht was anders auf den LEDS, eigentlich auch logisch, 
eine Textdatei besteht nun mal nicht nur aus den ASCII-Zeichen, die ich 
eingegeben habe.

Die Bedingungen sind eigentlich optimal, der Takt auf dem STK beträgt 
ca. 3,69MHZ, was auch im Programm eingestellt ist, ich denke Probleme, 
die daher rühren kann man ausschließen.

Hat das jemand verstanden, was mein Problem ist? Ich kann das auch gerne 
noch genauer erklären.

Vielen Dank schon mal für eure Hilfe

von Karl H. (kbuchegg)


Lesenswert?

Das übliche:
Bist du sicher, dass der AVR mit dem externen Quarz läuft.
Sprich: Hast du die Fuse Bits entsprechend umgestellt?

von suffix (Gast)


Lesenswert?

hast recht, der läuft mit 1MHZ intern, das wäre im Prinzip kein Problem 
den umzuprogrammieren, aber im STK500 gibts jede Menge externe Optionen, 
getrennt nach Frequenzbereichen, Start-Up time und anderem, welche der 
vielen Optionen muss ich denn da nehmen für die 3,69MHZ am XTAL1?

von Florian G. (suffix)


Lesenswert?

danke, hat sich erledigt

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.