Hallo. Ich hoffe den Thread gibts nicht schon irgendwo anders schon. Hab auf jeden Fall gesucht =) Also mein Problem sollte nicht zu schwierig sein. Ich Möchte einen Zahlenwert mittels RS232 von meinem µC (Atmega8535) an einen empfänger schicken. Hab mich schon ein bißchen durch das Datasheet durchgehangelt, bin aber nicht ganz schlüssig. Ich weiß, das ich das irgendwie mit UART machen muß, aber wie das genau aussehen soll (zB in C) kann ich mir nicht vorstellen. Speziel die Bautrate macht mir zu schaffen. Kennt ihr ein paar gute Tutorials dazu? MfG
Wow. Das ist mal ein richtig gutes Tutorial. Ich weiß ich greife mit dem Thema Schnittstelle in Bezug zu meinem µC Wissen schon weit vor, aber ich möchte gerne die Realisierbarkeit einer Idee testen. Unter "Senden einzelner Zeichen" in dem Tutorial hab ich noch ne Frage. UDR = 'x'; /* schreibt das Zeichen x auf die Schnittstelle */ Dabei kann 'x' nur ein Integer Wert sein, oder? Vielen Dank schon mal im Vorraus.
Hab das Tutorial gerade nicht ganz im Kopf (und bin zu faul zum nachlesen :-)) aber eigentlich müßtest du über die Schnittstelle nur 8Bit Werte übertragen können. Was du dann danach damit machst bzw. was du damit codiert hast, bleibt dir überlassen.
Ja, nur Byte-Werte kannste übertragen, ist aber kein Problem, zerlegste den Integer Wert in Bytes, schickste zum Empfänger, der sie wieder zusammensetzt
hier ein program für atmega8515,müsste gehen:
Im Hyper terminal wird "TEST" angezeigt, für andere sachen zu
übertragen genau so
.include "m8515def.inc"
.def temp = R16
.equ CLOCK = 8000000
.equ BAUD = 9600
.equ UBRRVAL = CLOCK/(BAUD*16)-1
.cseg
.org 0x000
rjmp main
.org 0x009 ; Interruptvektor for
UART-Receive
rjmp int_rxc
main: ldi r16, LOW(RAMEND) ;Stack Pointer to top of RAM
out SPL, r16
ldi r16, HIGH(RAMEND)
out SPH, r16
; Baudrate setup
ldi temp, LOW(UBRRVAL)
out UBRRL, temp
ldi temp, HIGH(UBRRVAL)
out UBRRH, temp
; Frame-Format: 8 Bit
ldi temp, (1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0)
out UCSRC, temp
sbi UCSRB, RXCIE ; Interrupt by Receive
sbi UCSRB, RXEN ; RX (Receive) activate
sbi UCSRB,TXEN ; TX (Transmit) activate
sei ; Interrupts global activate
ldi r20,0x00
program:
clr r21 ; gleich nachdem Einshalten "ATMEL UHF Demo Rader"
anzeigen
ldi ZL,LOW(2*lable)
ldi Zh,HIGH(2*lable)
ldi r17,0x04
ldi temp, 10
rcall serout
ok: lpm r16,z
adiw ZL,1
rcall serout
dec r17
cpse r17,r20
rjmp ok
ldi temp, 10
rcall serout
ldi temp, 13
rcall serout
serout: sbis UCSRA,UDRE ;Warten bis UDR für das nächste Byte
bereit ist
rjmp serout
out UDR, temp
ret
; Interruptroutine: wird ausgeführt sobald ein Byte über das UART
empfangen wurde
int_rxc:
in r21, UDR
;rcall loop
reti ;Interrupt beenden
lable:
.db"TEST",0
Ich weiß, schön langsam werd ich frech, aber hast das auch in ner Hochsprach wie c oder c++? =) Sry. Kenn mich mit Assembler leider noch nicht so gut aus. In C hab ich wenigstens schon mal ein paar einfach Programme für meinen µC geschrieben. Aber danke für die schnelle Antwort
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.