PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Serielle Schnittstelle



pacer_one
07.01.2008, 23:13
Hallo Leute,

Ich versuche seit heut Morgen eine Verbindung zwischen meinem PC und meinem RNMega8 via serieller Schnittstelle aufzubauen, leider bisher ohne Erfolg.

Mein Quarz schwingt mit 7,2738MHz. An meinem Programmierkabel sind die Pins 2 und 3 mit RX und TX verbunden, Die Masseleitung geht an das Gehäuse des 9poligen Steckers.

Die Einstellung meiner Fusebits habe ich mittels Ponyprog ausgelesen und in den Anhang gepackt.

Am Hyperterminal sind 9600baud eingestellt, Flussteuerung: keine, der Rest wie voreingestellt.

Folgendes Programm verwende ich:


.NOLIST
.INCLUDE <m8def.inc>
.def temp = R16
.def zeichen = R17

;------------------------------------------------------
; Peripherie initialisieren
;------------------------------------------------------
.equ F_CPU = 4000000 ; Systemtakt in Hz
.equ BAUD = 9600 ; 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

.LIST
.CSEG
;------------------------------------------------------
; Start Adresse 0000 /Interruptvektoren
;------------------------------------------------------
.org 0x000
rjmp Init ; Interruptvektoren überspringen

;------------------------------------------------------
; INITIALIZE
;------------------------------------------------------
INIT:
;Stack Pointer setzen
ldi temp,high(RAMEND)
out SPH,temp
ldi temp,low(RAMEND)
out SPL,temp

; Baudrate einstellen
ldi temp, HIGH(UBRR_VAL)
out UBRRH, temp
ldi temp, LOW(UBRR_VAL)
out UBRRL, temp

; Frame-Format: 8 Bit
ldi temp, (1<<URSEL)|(3<<UCSZ0)
out UCSRC, temp
sbi UCSRB,TXEN ; TX aktivieren

;------------------------------------------------------
; HAUPTSCHLEIFE
;------------------------------------------------------
Hauptschleife:

ldi zeichen, 'T'
rcall serout
ldi zeichen, 'e'
rcall serout
ldi zeichen, 's'
rcall serout
ldi zeichen, 't'
rcall serout
ldi zeichen, '!'
rcall serout
ldi zeichen, 10
rcall serout
ldi zeichen, 13
rcall serout


rjmp Hauptschleife


;------------------------------------------------------
; Subroutinen / ISRs
;------------------------------------------------------
serout:
sbis UCSRA,UDRE ; Warten bis UDR für das nächste
; Byte bereit ist
rjmp serout
out UDR, zeichen
ret

;------------------------------------------------------
; Datenbereich
;------------------------------------------------------
Daten:
.db 0x00, 0x00
.db 0x00, 0x00


;------------------------------------------------------
; ENDE
;------------------------------------------------------
Ende:
rjmp Ende


Meine Frage wäre nun, ob das Programmierkabel richtig ist, der Quarz geeignet ist und die richtige Baudrate verwendet wird. Vielleicht kann ja auch jemand mal das Programm testen.

Was mir aufgefallen ist, dass beim resetten meines Boards, komische Zeichen an das Terminalprogramm übermittelt werden.

Danke schon mal für euer Kopfzerbrechen.. O:)

Zapo.
07.01.2008, 23:35
meines wissens nach bekommst du keine datenübertragung mit 9600Baud bei einem Quarz von 4 Mhz hin.... vor allem nicht wenn du den internen oszi verwendest!!

(steht jedenfalls so in deiner Software!) - (dein Quarz ist wahrscheinlich garnicht aktiv...!)


intern musst du auf 8 Mhz erhöhen um 9600 zu realisieren.
mit Quarz kannst du z.B. 3,686 Mhz nehmen... dann funktioniert es auch mit 115kBaud!


prüf das mal...
Zapo.

bluelight_electronic
07.01.2008, 23:44
hmm grad nur überflogen aber was mir auffällt,

du hast
.equ F_CPU = 4000000 ; Systemtakt in Hz
schreibst aber oben das nen
7,2738MHz
drin hast,

hab ich grad was über sehen?
ich mein aber es sollte

.equ F_CPU = 7273800 ; Systemtakt in Hz für den Quarz

sein.

dann dein "da kommen zeichen beim Ein oder Ausschalten..." mag gut sein ;) problem ist halt das dir das nur sagt dass du am richtigen Comport bist ;) nicht mehr und nicht weniger.


könntest an deinem Terminal mal probieren auf 19k2 einstellen da könnte ein Teil richtig ankommen (da du ca die halbe Quarz Freq zum berechnen nimmst)

machs aber auf jeden fall richtig ;)



hast beim Terminal am pc auch 9k6 eingestellt ?

bluelight_electronic
07.01.2008, 23:50
mit 9600 kannst fast jeden Quarz nehmen und es geht.


ich würd erst mal gucken ob da nicth der fehler liegt mit den 4mhz.. und dem ext quarz von 7,xxx mhz

Hubert.G
08.01.2008, 12:20
Der GND gehört an den Pin5 des 9pol Stecker, über das Gehäuse ist die Masseverbindung nicht sicher.

pacer_one
08.01.2008, 17:11
Danke für die Hilfe...

Problem war die falsche MHz-Zahl im Programm, hab ich wohl einfach vergessen zu ändern. Da hätte ich wohl noch lange suchen können.

Stecker werde ich noch ändern und irgendwann auch noch die Tabelle verstehen
Aber nun kanns ja mit dem experimentieren weitergehen \:D/

Warum kann man eigentlich keine Punkte für hilfreiche Antworten vergeben?!

bluelight_electronic
08.01.2008, 18:33
Weil wir alle gern Helfen *gg*

geht mir auch oft so wenn nen Programm schreibst es 2873987 male liest aber sowas übersiehst :) ist ganz normal *g*

viel Spass beim Weiterbasteln =) und wenns probleme gibt einfach im Forum posten .)