(UART) AVR sendet wirre Zeichen zurück an BTM222

Gast #3325211
Lesenswert?

Hallöchen!
Ich habe hier ein BTM222 Bluetoothmodul an einen ATMEGA16 gehangen und 
die aufgabe des AVR ist es einfach nur die Zeichen wieder 
zurückzusenden.
Ich sende mit einem abgeändertem Android Chatprogramm buchstaben und 
zurück kommen andere zeichen. Das Muster ist dabei aber immer das selbe.

als Beispiel:
sende ich ein "T" kommt ein "T" zurück.
sende ich ein "A" kommt immer ein "}" zürück

Jetzt bin ich ratlos :/
Was mache ich falsch?

mfg Christian
1
.include "m16def.inc"
2

3
.equ F_CPU = 3686400                      ; Systemtakt in Hz
4
.equ BAUD  = 19200                        ; Baudrate
5
 
6
; Berechnungen
7
.equ UBRR_VAL   = ((F_CPU+BAUD*8)/(BAUD*16)-1)  ; clever runden
8
.equ BAUD_REAL  = (F_CPU/(16*(UBRR_VAL+1)))     ; Reale Baudrate
9
.equ BAUD_ERROR = ((BAUD_REAL*1000)/BAUD-1000)  ; Fehler in Promille
10
 
11
.if ((BAUD_ERROR>10) || (BAUD_ERROR<-10))       ; max. +/-10 Promille Fehler
12
  .error "Systematischer Fehler der Baudrate grösser 1 Prozent und damit zu hoch!"
13
.endif
14
 
15

16

17

18

19
.org 0x00
20
        rjmp main
21
 
22
.org URXCaddr                                   ; Interruptvektor für UART-Empfang
23
        rjmp int_rxc
24
 
25
; Hauptprogramm
26
 
27
main:
28
 
29
    ; Stackpointer initialisieren
30
 
31
    ldi     r16, HIGH(RAMEND)
32
    out     SPH, r16
33
    ldi     r16, LOW(RAMEND)
34
    out     SPL, r16
35
 
36
    ; Baudrate einstellen
37
    ldi     r16, HIGH(UBRR_VAL)
38
    out     UBRRH, r16
39
    ldi     r16, LOW(UBRR_VAL)
40
    out     UBRRL, r16
41
 
42
    ; Frame-Format: 8 Bit
43
    ldi     r16, (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0)
44
    out     UCSRC, r16
45
 
46
    sbi     UCSRB, RXCIE                    ; Interrupt bei Empfang
47
    sbi     UCSRB, RXEN                     ; RX (Empfang) aktivieren
48
    sbi     UCSRB,TXEN                      ; TX aktivieren
49
    sei                                     ; Interrupts global aktivieren
50
 
51
 
52

53
loop:
54
nop
55
rjmp loop
56

57

58

59
int_rxc:
60
    in      r20, UDR                       ; empfangenes Byte lesen,
61
serout:
62
    sbis    UCSRA,UDRE                     ; warten bis Redy
63
    rjmp    serout
64
    out     UDR, r20                       ; empfangenes Byte senden,
65
    reti
Angehängte Dateien:
Gast #3325261
Lesenswert?

einfach so in den code mitreinschreiben ?
1
int_rxc:
2
    in      r20, UDR                       ; empfangenes Byte lesen,
3
serout:
4
    sbis    UCSRA,UDRE                     ; warten bis Redy
5
    rjmp    serout
6
    out     UDR+48, r20                       ; empfangenes Byte senden,
7
    reti
Gast #3325338
Lesenswert?

Gaaaaaaanz komisch... liegt irgendwie am quartz Oszillator. Hab aus spaß 
mal den internen RC benutzt und dann ging es. Auf dem Oscillator steht 
3.6864 MHz. Hab ich in dem Programm irgendetwas falsch gemacht ?
oben bei F-CPU ?
Ich hab die fuses beim ATMEGA 16 wie folg eingestellt gehabt:

EXT. RC Osc. 3.0 MHz - 8.0 MHz; Start-up time 18CK + 64ms

Was ist da schiefgelaufen ?

Muss ich
EXT. Clock; start-up time X CK + Y ms
benutzen ?
Gast #3325483
Lesenswert?

>Muss ich
>EXT. Clock; start-up time X CK + Y ms
>benutzen ?
Diese Einstellung ist korrekt, wenn du den mega16 mit einem externen 
Taktsignal über XTAL1 befeuerst. Bei Verwendung eines Oszillators (das 
Ding mit den 4 Anschlüssen) als Taktquelle ist das richtig.

Gruss, Heinz
Gast #3325516
Lesenswert?

>Ein Oszillator mit Quarz ist ein Chrystal Oscillator (oder XTal).
Bitte bei den Bezeichnungen genauer differenzieren:
Quarzoszillator: Das Ding mit den 4 Anschlüssen, schwingt von sich aus, 
Einstellungen in ClockSource "Ext. Clock"
Quarz/Standardquarz: Das Ding mit den 2 Anschlüssen, muß angeregt 
werden, damit er schwingt, Einstellungen in ClockSource "External 
Crystal/Resonator"

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren