Sendet "Test!" und einen Zeilenwechsel über das UART eines AT90S44433/2333.
Super!! Das war eine tolle Idee!! Endlich empfängt der Computer "Test!"
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.
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...
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.
--------------------------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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.