Hi,
ich habe ein sehr seltsames Problem mit einem ATMEGA8515. Ich habe
folgenden Sourcecode:
.include "C:\m8515def.inc"
.def temp = r16
.equ CLOCK = 7372800
.equ BAUD = 115200
.equ UBRRVAL = CLOCK/(BAUD*16)-1
; Stackpointer initialisieren
ldi temp, LOW(RAMEND)
out SPL, temp
ldi temp, HIGH(RAMEND)
out SPH, temp
; Baudrate einstellen
ldi temp, LOW(UBRRVAL)
out UBRRL, temp
ldi temp, HIGH(UBRRVAL)
out UBRRH, temp
; Frame-Format: 8 Bit
ldi temp, (1<<URSEL)|(3<<UCSZ0)
out UCSRC, temp
sbi UCSRB,TXEN ; TX aktivieren
loop: ldi temp, 1
rcall serout ; Unterprogramm aufrufen
rjmp loop
serout:
sbis UCSRA,UDRE ; Warten bis UDR für das
nächste
; Byte bereit ist
rjmp serout
out UDR, temp
ret ; zurück zum Hauptprogramm
Der größte Teil kommt von dieser Seite. Wenn ich in diese Zeile:
loop: ldi temp, 1
durch diese:
loop: ldi temp, 0
ersetze, dann kommt in meinem Windows Prog. auch 0 als Zahlenwert an.
Wenn ich jetzt aber 1 oder eine belibige andere Zahl bis 255 einsetzte,
dann kommt immer nur ein Muster aus den Werten 192, 128, 63 und 0. Ich
bekomme keine vernünftige Ausgabe. Worann kann das liegen? Ich habe
sogar schon den IC gewechselt, aber das ändert nichts.
Danke für eure Hilfe!
Hi,
das bringt aber nichts. Wenn ich 0 hinschreibe, dann bekomme ich auch 0
als Zahl ausgegeben. Wenn ich 1 hinschreibe, dann bekomme ich nur noch
misst, der sich aus abwechselt 192,128,63,0 zusammensetzt. Das ist
total komisch.
Hallo
Dann setze doch erstmal die BAUDRATE runter auf 9600 und gebe nur
ldi temp, 65
aus.
Welches Programm läuft denn auf dem PC ? Ich nehme immer 'Terminal'
MFG
Dieter
Kann es sein, dass die Polarität deines Signals falschrum ist ?
Wie hast Du den Atmel mit dem PC verbunden ?
Direkt oder über den üblichen Pegelwandler, der das Signal invertiert
?
Hyperterminal wird's wohl nicht sein, das zeigt keine Zahlen an...
Ok, jetzt würde ich zum Oszilloskop greifen und mir mal anschauen, was
aus dem Controller wirklich rauskommt.
Am Programm fällt mir nichts auf und die Schaltung ist wohl auch OK.
Nochwas: läuft der Prozessor wirklich mit dem Quarztakt oder arbeitet
der eventuell mit dem internen RC-Oszillator ?
Das wäre beim neuen Bauteil so eingestellt und muss im LFUSE-Register
geändert werden.
Hallo
Mit dem Takt das hast du aber schon geprüft.
Ansonsten teste den Takt doch mal mit deinem Oszi.
Kleine Schleife mit PORT auf Ausgang und dann am Ozsi mal messen.
do
PORT HIGH
PORT LOW
loop
Was hast du denn jetzt für High/ LOW Zeiten jetzt an dem TX Pin ??
Hier mal ein Testprogramm von einem MEGA16. Sollte aber auch laufen.
9600 BAUD.
MFG
Dieter
Hi,
hatte in den letzten Tagen keine Zeit mich um das Problem zu kümmern.
Jetzt habe ich mal ein Bild von meinem Problem gemacht, vielleicht
könnt ihr mir dann helfen. Auf dem Bild ist oben das Signal zu sehen,
was hinter dem MAX232 heraus kommt. Das Signal unten ist einefach um zu
sehen wann etwas gesendet wird. Wenn das einmal kurz high und dann
wieder low ist, dann wird 0 gesendet (als Zahl, nicht als Buchstabe).
Und dann wieder von vorne. Ich habe keine Ahnung wie dieses Signal zu
stande kommt, aber das Programm im uC sollte richtig sein.
Danke für eure Hilfe.
Danke für den Tipp mit dem internen RC-Oszillator. Der war nämlich der
Grund für die Fehlfunktionen meines ATMEGA 16. Ich bin vom 2313
umgestiegen und hatte natürlich diese wichtige Stelle im Datenblatt
überlesen. Ist es nun besser den internen Oszi zu benutzen oder ist ein
Quarz die bessere Alternative?
mfg
Rob
Hallo,
ich arbeite zwar nicht mit dem 8515, hätte aber
folgende Tips:
1. Stellt Dein Befehl für das Frame-Format auch
Parität und Anzahl der Stoppbits ein? Versuch mal
9600 Baud, 8bit, keine Parität und 1 Stopbit.
Schreibt man in Kurzform meist 9600,8,n,1
2. Stelle Hyperterminal ebenfalls auf dieses Frame-
Format ein!
3. Sende keine niedrigen Zahlen, da diese eher zu
Steuerzwecken gedacht sind. Schau Dir dazu mal eine
ASCII-Tabelle an, darstellbare Zeichen fangen erst
bei größeren Zahlen an.
4. Versuch mal eine kurze Pause nach jedem Zeichen,
z.B. 1ms.
5. Für das Wort "HELLO" müsstest Du also 72,69,76,
76,79 senden.
6. Hast Du tatsächlich einen Quarz mit 7,372800 MHz?
Viel Erfolg
Thomas
danke für die Hilfe
das problem hat sich bereits gelöst. ich hatte übersehen, dass beim
ATMEGA16 der interne rc-oszillator voreingestellt ist (mit 1 MHz).
das war ich vom 2313 nicht gewöhnt und hatte die zeile im datasheet
einfach überlesen. habe jetzt intern 8 MHz eingestellt und alles
funktioniert bestens. jetzt werde ich mal den adc ausprobieren, um
sensormesswerte seriell an mein visuall c++ programm zu übertragen.
mfg
Rob