avr 644p per uart senden

Gast #2369163
Lesenswert?
• ▲
▼
Hallo!

ich habe einen avr 644p und möchte so wie es im "AVR-Tutorial: UART"
mit dem mega8 beschrieben ist zeichen an meinen Rechner per rs232 
senden.

- Hardware Max 232 & Co ist aufgebaut und funktioniert
- Hterm installiert
- ich benutze AVR Studio
- habe versucht den Quelltext aus dem "AVR-Tutorial: UART" auf meinen 
644p anzupassen.

Was habe ich vergessen anzupassen oder falsch gemacht?
Gibt es eine Diagnose-Möglichkeit um festzustellen, wo der 644p hängen 
bleibt und kann man die Speicher auslesen?

Besten Dank im Voraus!!!


 .include "m644pdef.inc"

.def temp    = r16
.def zeichen = r17
.def rxy = r19

.equ F_CPU = 2000000                         ; 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

    ldi     temp, HIGH(RAMEND)
    out     SPH, temp
    ldi     temp, LOW(RAMEND)
    out     SPL, temp

    ; Baudrate einstellen

    ldi     temp, HIGH(UBRR_VAL)
    sts     UBRR0H, temp
    ldi     temp, LOW(UBRR_VAL)
    sts     UBRR0L, temp

    ; Frame-Format: 8 Bit

    ldi     temp, (1<<USBS0)|(3<<UCSZ00)
    sts     UCSR0C, temp

   lds rxy,UCSR0B
   sbr rxy,1<<TXB81
   sts UCSR0B,rxy

loop:
    ldi     zeichen, 'T'
    rcall   serout                      ; Unterprogramm aufrufen
    ldi     zeichen, 'e'
    rcall   serout                      ; Unterprogramm aufrufen
    ldi     zeichen, 's'
    rcall   serout                      ; ...
    ldi     zeichen, 't'
    rcall   serout
    ldi     zeichen, '!'
    rcall   serout
    ldi     zeichen, 10
    rcall   serout
    ldi     zeichen, 13
    rcall   serout
    rcall   sync
    rjmp    loop

serout:

   lds rxy,UCSR0A
   sbrs rxy,UDRE0

    rjmp    serout
    sts     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
Gast #2369414
Lesenswert?
• ▲
▼
Hi, ich kann

sbrs UCSR0A,UDRE0

nicht verwenden da ich mit sbrs auf diese Register keinen Zugriff habe.

Ich habe versucht das damit zu umgehen.

lds rxy,UCSR0B     den Wert in rxy zwischenspeichern


sbr rxy,1<<TXB81   ; UCSR1B - USART Control and Status Register B
                  ;  .equ  TXB81  = 0  ; Transmit Data Bit 8


sts UCSR0B,rxy    und wieder zurückschreiben
Gast #2369420
Lesenswert?
• ▲
▼
Warum "Transmit Data Bit 8", d.h. 9 Datenbits (Bits 0..8), wo doch ein 
PC üblicherweise nur mit 8 Datenbits (0..7) arbeitet. Mir ist so ein 
Exoten-PC noch nie begegnet.

Ich würde den Teil in der Initialisierung komplett weg lassen und die 
UART so initialisieren, dass die UART mit 8 Datenbits arbeitet.
Gast #2369540
Lesenswert?
• ▲
▼
So jetzt mit etwas mehr Zeit...

In 
http://www.mikrocontroller.net/articles/AVR-Tutorial:_UART#UART_konfigurieren
ist folgende Zeile für den Atmega8

1
    sbi     UCSRB,TXEN                  ; TX aktivieren

Beachte das TXEN, d.h. Sender (TX) einschalten (ENablen). Das ist ein 
anderes Bit in UCSRB mit anderer Funktion anderes als dein TXB81.

Die Anpassung von IO-mapped Register beim Atmega8 auf Memory-mapped 
Register beim Atmega644p sieht also so aus:

1
    lds rxy, UCSR0B
2
    sbr rxy, (1<<TXEN0)
3
    sts UCSR0B, rxy

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.