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


von Andreas (Gast)


Angehängte Dateien:

Lesenswert?

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

von Markus (Gast)


Lesenswert?

Super!!
Das war eine tolle Idee!!
Endlich empfängt der Computer "Test!"

von Michael (Gast)


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.

von Jonas Diemer (Gast)


Lesenswert?

dein terminal programm ist wahrscheinlich falsch eingestellt...

von Aleksej Kiselev (Gast)


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...

von Jens Schiffmann (Gast)


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.

von Søren H. Nielsen (Gast)


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

von Xpand (Gast)


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

von Marc Deem (Gast)


Lesenswert?

stimmt!

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.