Forum: Mikrocontroller und Digitale Elektronik avr 644p per uart senden


von Jaba (Gast)


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

von Krapao (Gast)


Lesenswert?

>    sbr rxy,1<<TXB81

Du willst wirklich dem PC 9-Datenbits senden? Üblich sind 8-Datenbits. 
Bei 8-Bit solltest dich nicht am Beispiel 16.7.2 orientieren sondern am 
Beispiel 16.7.

von Jaba (Gast)


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

von Krapao (Gast)


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.

von Krapao (Gast)


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

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
Noch kein Account? Hier anmelden.