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
Das übliche: Bist du sicher, dass der AVR mit dem externen Quarz läuft. Sprich: Hast du die Fuse Bits entsprechend umgestellt?
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?
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.