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:)
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:)