mikrocontroller.net

Forum: Projekte & Code UART senden (AVR, Assembler)


Autor: Andreas (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Sendet "Test!"  und einen Zeilenwechsel über das UART eines 
AT90S44433/2333.

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Super!!
Das war eine tolle Idee!!
Endlich empfängt der Computer "Test!"

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist eigentlich ganz einfach, aber funktioniert komischer Weise nicht! 
(bei mir)
Er gibt andere Ascii - Zeichen aus. Bei mehreren Test kam folgendes 
heraus:
Ascii - Zeichen Nr. 51 ergibt f, 52 ergibt (garnichts), 53 ergibt e, 54 
- 2,55 - d, 56 (garnichts), 57 - c, 58 - 1, 59 - b, 60 (garnichts), 61 - 
a, 62 - 0. . .
Hat jemand eine Idee warum, hab doch nichts geändert,habe einen 4433.

Autor: Jonas Diemer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
dein terminal programm ist wahrscheinlich falsch eingestellt...

Autor: Aleksej Kiselev (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du deine Oscillator-Eistellungen schon mal geprüft? Wenn du eine 
andere Taktfrequenz hast, dann sollst du den Wert im UBRR noch mal 
ausrechnen...

Autor: Jens Schiffmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sieht so aus als verursacht dieses Problem dein Pegelwandler!
Wenn Du z.B.einen MAX232 von Texas Instruments benutzt ist die 
Pinbelegung anders als in dem Tutorial, welches man sich hier ansehen 
kann. Hol dir mal das passende Datenblatt.

Autor: Søren H. Nielsen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
--------------------------start.------------------------------------

.nolist
.include "8515def.inc"
.list

; define constants
.equ    CR          =13
.equ    LF          =10

.equ  BAUD_RATE    =19200
.equ  CPU_CLOCK    =3686400
.equ  UART_BAUD_DIV  =(CPU_CLOCK/(16*BAUD_RATE))-1

; define register aliases
.def  ARG0    =r0
.def  ARG1    =r1
.def  RETURN0    =r2
.def  RETURN1    =r3
.def  TEMP0    =r16
.def  TEMP1    =r17
.def  data    =r18
.def  data2    =r19
.def  data3    =r20
.def  delay    =r21
.def  delay2    =r22

; and as a reminder
;.def  XL  =r26
;.def  XH  =r27
;.def  YL  =r28
;.def  YH  =r29
;.def  ZL  =r30
;.def  ZH  =r31


; begin code
  .org    $000
  rjmp    reset

reset:
  ldi   TEMP0, low(RAMEND)    ; initialize stack pointer
  out    SPL, TEMP0
  ldi   TEMP0, high(RAMEND)
  out   SPH, TEMP0
  ldi    TEMP0, $FF        ; port B all outputs so we can use LEDs
  out    DDRB, TEMP0
  out    PORTB, TEMP0      ; initially all LEDs off
  ldi    TEMP0, UART_BAUD_DIV  ; set baud rate
  out    UBRR, TEMP0
  sbi     UCR, TXEN        ; enable serial transmitter
  sbi     UCR, RXEN        ; enable serial receiver



loop:
  rcall  getchar                 ; read serial input
  mov    TEMP0, RETURN0
  com    TEMP0
  out    PORTB, TEMP0      ; output received data to LEDs
  mov    ARG0, RETURN0      ; move the RETURN0 value from getchar to 
ARG0
  rcall  putchar          ; write data to serial port
  mov    TEMP0, RETURN0
  cpi    TEMP0, CR        ; check for carriage return
  brne  loop
  ldi    TEMP0, LF
  mov    ARG0, TEMP0
  rcall  putchar                 ; output linefeed after CR
  rjmp  loop

; subroutines and functions

; function getchar
; wait until a character is recevied via the UART
; then return the character in RETURN0
getchar:
  sbis  PINA,0x00
  ret                     ; loop until USR:RXC is 1
  in    RETURN0, UDR
  rjmp  getchar      ; return receive data in RETURN0
  ret

; function putchar
; wait until UART transmitter is ready
; then send the character in ARG0



putchar:
  sbis  USR, UDRE               ; loop until USR:UDRE is 1
  rjmp  putchar
  ldi    data,$41
  out    UDR, data
dly:
  dec    Delay
  brne  DLY
  dec    Delay2
  brne    DLY

  ldi    data2,$54
  out    UDR, data2
dly2:
  dec    Delay
  brne  DLY2
  dec    Delay2
  brne    DLY2

  ldi    data,$44
  out    UDR, data
dly3:
  dec    Delay
  brne  DLY3
  dec    Delay2
  brne    DLY3

  ldi    data2,$37
  out    UDR, data2
dly4:
  dec    Delay
  brne  DLY4
  dec    Delay2
  brne    DLY4

  ldi    data,$35
  out    UDR, data

dly5:
  dec    Delay
  brne  DLY5
  dec    Delay2
  brne    DLY5

  ldi    data,$3B
  out    UDR, data
dly6:
  dec    Delay
  brne  DLY6
  dec    Delay2
  brne    DLY6

  ldi    data,$00D
  out    UDR, data

dly7:
  dec    Delay
  brne  DLY7
  dec    Delay2
  brne    DLY7

  ldi    data,$00A
  out    UDR, data
  ret

----------------------------stop-----------------------------

baud 19200 @ 3,6864 MhZ

test with hyperterminal

Autor: Xpand (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ist vielleicht schonmal jemand auf die idee gekommen, daß man einen
interrupt dafür hernehmen kann - und einen FIFO nutzt... ehrlich mal -
so macht der Prozessor doch permanent pause

Autor: Marc Deem (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
stimmt!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.