Hallo, ich bin neu hier und moechte mich erstmal kurz vorstellen: Ich heisse Thomas und habe zuletzt vor ueber 15 Jahren 8085er in der Lehre programmiert. Nun beschaeftige ich mich wieder mit der Programmierung und arbeite an einem Gemeinschaftsprojekt mit. Hier geht es prinzipiell darum, Daten von einer Schnittstelle einzulesen, diese aufarbeiten und auf der anderen Schnittstelle auszugeben. Leider scheitere ich da heftig, vielleicht kann mir jemand einen goldenen Tipp geben. Zum Testen habe ich mal ein Programm aus dem AVR-Tutorial genommen. Auf dem Mega8 funktioniert dies einwandfrei. Dann habe ich es fuer den Mega162 umgeschrieben und heraus kommt Schrott. Hier der Code, wie ich ihn umgeschrieben habe: .include "m162def.inc" .def temp = r16 ; Register für kleinere Arbeiten .def zeichen = r17 ; in diesem Register wird das Zeichen an die ; Ausgabefunktion übergeben .equ F_CPU = 8000000 ; Systemtakt in Hz .equ BAUD = 4800 ; Baudrate ; Berechnungen .equ UBRR_VAL = ((F_CPU+BAUD*8)/(BAUD*16)-1) ; clever runden .equ BAUD_REAL = (F_CPU/(16*(UBRR_VAL+1))) ; Reale Baudrate .equ BAUD_ERROR = ((BAUD_REAL*1000)/BAUD-1000) ; Fehler in Promille .if ((BAUD_ERROR>10) || (BAUD_ERROR<-10)) ; max. +/-10 Promille Fehler .error "Systematischer Fehler der Baudrate grösser 1 Prozent und damit zu hoch!" .endif ; Stackpointer initialisieren ldi temp, LOW(RAMEND) out SPL, temp ldi temp, HIGH(RAMEND) out SPH, temp ;ldi temp, 0xAA ;out OSCCAL, temp ; Baudrate einstellen ldi temp, HIGH(UBRR_VAL) out UBRR0H, temp ldi temp, LOW(UBRR_VAL) out UBRR0L, temp ; Frame-Format: 8 Bit ldi temp, (1<<URSEL0)|(3<<UCSZ00) out UCSR0C, temp sbi UCSR0B,TXEN ; TX aktivieren ldi r16, 0x00 out DDRD, r16 loop: ldi zeichen, 0xFF rcall serout ldi zeichen, 13 rcall serout rcall sync rjmp loop serout: sbis UCSR0A,UDRE ; Warten bis UDR für das nächste ; Byte bereit ist rjmp serout out UDR0, zeichen ret ; zurück zum Hauptprogramm ; kleine Pause zum Synchronisieren des Empfängers, falls zwischenzeitlich ; das Kabel getrennt wurde sync: ldi r16,0 sync_1: ldi r17,0 sync_loop: dec r17 brne sync_loop dec r16 brne sync_1 ret Es soll eigentlich nur der Wert FF mit einem anschliessenden CR ausgegeben werden. Dies funktioniert jedoch nur, wenn ich an HTerm eine Baudrate von 600 einstelle. OSCCAL kann ich nicht beschreiben (da mault der Assembler) und Quarz ist keiner vorhanden (bei der Mega8-Schaltung funktioniert das einwandfrei so) Vielleicht habe ich ein Register oder eine Einstellung, speziell fuer den Mega162 uebersehen, fuer sachdienliche Hinweise bedanke ich mich im Voraus. Viele Gruesse, Thomas
spess53 schrieb: > Hi > > CKDIV8 Fuse löschen. > > MfG Spess WOW!!! Das scheint es gewesen zu sein, zumindest fruchtet schonmal mein Testcode :o)) Schonmal herzlichen Dank dafuer.
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.