Forum: Mikrocontroller und Digitale Elektronik (UART) AVR sendet wirre Zeichen zurück an BTM222


von Christian (Gast)


Angehängte Dateien:

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

von L. P. (lpg)


Lesenswert?

Christian schrieb:
> UDR, r20

Hi, versuch mal UDR+48
;)

Stichwort ASCII...

lg.

von Christian (Gast)


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

von Christian (Gast)


Lesenswert?

so sendet er garnichts mehr :/

von Christian (Gast)


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 ?

von katastrophenheinz (Gast)


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

von Stefan (Gast)


Lesenswert?

> EXT. RC Osc.

Heisst: Du erzeugst den Takt mit einem Widerstand+Kondensator.

Ein Oszillator mit Quarz ist ein Chrystal Oscillator (oder XTal).

von katastrophenheinz (Gast)


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"

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.