Archiv verlassen und diese Seite im Standarddesign anzeigen : einfache Senderoutine
Hi!
Ich will in eine kurze Routine für das senden von Daten schreiben.
Im Datenblatt des RT868F5 steht, man braucht 1 Start-, 8 Daten- und 1 Stoppbit.
Wie kann ich das alles nun an das Funkmodul senden?
RT868F5_Senden:
sbis UCSRA,UDRE ; Warten bis UDR für das nächste Byte bereit ist
rjmp RT868F5_Senden: ; Ruft Senderoutine auf
out UDR, r16 ; Nachricht absenden
ret
Dieser Programmtext sendet doch nur die 8 Datenbit, aber wie kann ich nun hinten und vorne noch ein Bit anhängen?
Dieser Programmtext sendet doch nur die 8 Datenbit, aber wie kann ich nun hinten und vorne noch ein Bit anhängen?
Garnicht, sowas macht der µC für Dich, Du mußt es ihm nur sagen
ldi R16,(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0)
out UCSRC,R16
stellt 1/8/1 bei einem M8 ein...
Schau mal ins Dattenblatt, da steht es geschrieben
Gruß Sebastian
hey, cooler Controller :)
Danke, gibts da auch eine möglichkeit mehrere Bytes auf einmal zu senden, oder werde ich da nichts im Datenblatt finden?
Ich frage deswegen weil ich noch nicht ganz weiß wie ich das Funkmodul konfigurieren soll, im Datenblatt steht man soll ohne Verzögerung hintereinander +++ (Dezimal 43 43 43) senden um in den Modus zu wechseln.
Ich denke mal da muss ich einfach 3 mal hintereinander die Senderoutine aufrufen, aber das "ohne Verzögerung" irritiert, mich, heißt das jetzt auch ohne start und Stopbits, die kann ich nämlich mit dem ATmega32 nicht ausschalten oder?
andersrumm, wie kann ich mehrere Byts hintereinander empfangen, wenn das Funkmodul nach dem wechsel in den Konfigurationsmodus mit OK<CRLF> antwortet (dezimal 79 75 13 10), dazu müsste ich doch 4 register aneinander reihen. Oder kann ich die bytes einzeln auslesen und nach einer kurzen zeit steht das nächst im UDR Register?
Mehrere Bytes auf einmal, wird wohl kaum gehen , aber mehrere Bytes nacheinander !
schau mal Hier nach (http://www.mikrocontroller.net/articles/AVR-Tutorial:_UART#Senden)
Da wir es schön erklärt :-)
hey, cooler Controller
:-k
Gruß Sebastian
Danke für die Hilfe,
Ich bin jetzt mit meiner Programmierung schon beinahe fertig.
Das einzige was mich noch fehlt is das Parity bit. Der RT868F5 kann nämlich nur 1start, 8data, 1stop aber no Parity übertragen, so stehts zumindest im Datenbatt.
Also hab ich mir gedacht, da ich eigentlich nur 7 bit brauche für meine Daten, kann ich im 8ten, also bit7 das Parity selbst erzeugen.
Nach ein bischen Datenblatt lesen habe ich herausgefunden das der Controller das Parity bit normalerweise durch ein EXOR erzeugt, in dem er alle bits in einem register "exoriert" (weiß nicht wie man das nennen soll)
Kann ich das nicht irgendwie einfacher machen?
Hmmmm,
wenn ich Dich richtig verstehe, willst Du Bit0 dazu mißbrauchen, Parity, ohne Parity zu machen :-k
An sich weniger das Problem, hmm dazu mußt Du wisssen, ob in Deinen 7 Bits eine gerade, ohne ungerade Anzahl der '1' vorliegt, nur wie rauskriegen?
Eine Möglichkeit wäre zuerst Deine Ausgangszahl(die versendet werden soll) 7 mal nach links über Carry schieben und zählen, wie oft Carry gesetzt ist:
push ausgangszahl ;Daten retten
ldi bitzaehler,6
clr zaehler ;zaehler loeschen
einserzaehlen:
rol ausgangszahl ;links ueber Carry schieben
brcc einserzaehlen1
inc zaehler
einserzaehlen1:
dec bitzaehler
brne einserzaehlen
pop ausgangszahl
Jetzt müsste in zaehler die einser Anzahl gespeichert sein...
weiter muß man prüfen ob zaehler gerade, oder ungerade ist und entsprechend Bit 0 in ausgangszahl setzen, oder auch nicht:
sbrc zaehler,0
ori ausgangszahl,1
rcall senden
wobei senden ist Deine Routine, die die Zahl über UART verschickt.
Naja, vielleicht gibt es einfachere Lösungen ?
Ich bin gespannt, ob noch jemand was dazu beiträgt
P.S.
Kann man die Übertragung nicht auf 1/7/1 mit Parity einstellen ?
Gruß Sebastian
Ich hab das ganze jetzt so gelöst, vielleicht mach ich das später noch mal schön, und schau mir das mit dem 1/7/1 mit Parity einstellungen an.
check_Parity:
mov temp2, empfangen
andi temp2, 0b10000000
rol temp2
rol temp2
ldi temp, 0b00000000
rol empfangen ;bit 7 in Carry
rol empfangen ;bit 6 in Carry
brcs Check_Parity_1_plus
rol empfangen ;bit 5 in Carry
brcs Check_Parity_1_plus
rol empfangen ;bit 4 in Carry
brcs Check_Parity_1_plus
rol empfangen ;bit 3 in Carry
brcs Check_Parity_1_plus
rol empfangen ;bit 2 in Carry
brcs Check_Parity_1_plus
rol empfangen ;bit 1 in Carry
brcs Check_Parity_1_plus
rol empfangen ;bit 0 in Carry
brcs Check_Parity_1_plus
rol empfangen ;bit Carry in Carry (Ausgangszustand)
andi temp, 0b00000001
cp temp, temp2
brne PC+4
mov temp, empfangen
andi temp, 0b01110001
ret
ldi Senden, 0b01000011
call RT868F5_senden
ldi temp, 0b00000000
ret
Check_Parity_1_plus:
inc temp
ret
war glaub ich eine super idee mit dem verschieben aufs carry. Danke für die schnelle Hilfe
So, nun habe ich alles was ich brauche ersteinmal hardewaremäßig aufgebaut, ich glaube da dürften nun keine fehler mehr vorhanden sein, allerdings funktioniert die funkübertragung nicht.
; ldi senden, '+' ;Konfigurationsmodus starten
; rcall RT868F5_Senden
; rcall RT868F5_Senden
; rcall RT868F5_Senden
;
; sbi PortD,6
;
; rcall RT868F5_Antwort_OK
;
; ldi senden, 'A' ;Register 5 = 0 (19200 Baud), EEPROM abspeichern, beenden
; rcall RT868F5_Senden
; ldi senden, 'T'
; rcall RT868F5_Senden
; ldi senden, 'S'
; rcall RT868F5_Senden
; ldi senden, '5'
; rcall RT868F5_Senden
; ldi senden, '='
; rcall RT868F5_Senden
; ldi senden, '0'
; rcall RT868F5_Senden
; ldi senden, ','
; rcall RT868F5_Senden
; ldi senden, 'W'
; rcall RT868F5_Senden
; ldi senden, 'R'
; rcall RT868F5_Senden
; ldi senden, ','
; rcall RT868F5_Senden
; ldi senden, 'C'
; rcall RT868F5_Senden
; ldi senden, 'C'
; rcall RT868F5_Senden
; rcall RT868F5_Antwort_OK
cbi PortD, 6
ret
;..............................
;... RT868F5 Antwort OK ...
;..............................
RT868F5_Antwort_OK:
empfangen_OK1: ;Antwort OK<CRLF>
sbis UCSRA, RXC
rjmp empfangen_OK1
in temp, UDR
cpi temp, 'O'
brne Fehler_RT868F5
empfangen_OK2:
sbis UCSRA, RXC
rjmp empfangen_OK2
in temp, UDR
cpi temp, 'K'
brne Fehler_RT868F5
empfangen_OK3:
sbis UCSRA, RXC
rjmp empfangen_OK3
in temp, UDR
cpi temp, 13
brne Fehler_RT868F5
empfangen_OK4:
sbis UCSRA, RXC
rjmp empfangen_OK4
in temp, UDR
cpi temp, 10
brne Fehler_RT868F5
ret
;..........................
;... RT868F5 Fehler ...
;..........................
Fehler_RT868F5:
sbi PortD, 6
rjmp Ende
;..........................
;... RT868F5 Senden ...
;..........................
RT868F5_Senden:
sbi PortD,6
sbis UCSRA,UDRE ; Warten bis UDR für das nächste Byte bereit ist
rjmp RT868F5_Senden ; Ruft Senderoutine auf
out UDR, Senden ; Nachricht absenden
cbi PortD,6
ret
Kurze erklärung was gemacht werden soll bei der initialisierung des funkmoduls:
Senden von "+++" ... wechselt in den Konfigurationsmodus
funkmodul antwortet mit "OK<CRLF>"
Senden von "ATS5=0,WR,CC" ... stellt alles ein
funkmodul antwortet mit "OK<CRLF>" und verlässt den konfigurationsmodus.
Weil der Controller allerdings nicht OK empfängt, sondern in dieser schleife immer hängen bleibt, weil er einfach nichts erhält, dachte ich mir ich wechsle auf 9600 baud, denn bei dieser baudrate muss ich nicht in den konfigurationsmodus. Allerdings funktioniert der Funk trotzdem nicht.
Weiß irgendjemand noch einen trick wie man feststellen kann was jetzt nicht funktioniert?
Bitte helft mir,
Kann sich irgendjemand wenigsten einmal den Programmtext ansehn und mir sagen ob hier ein Fehler vorhanden ist. Wenn da keiner ist, kann ich mir einmal sicher sein das irgendwas mit der Hardware nicht passt.
Ich hatte vorher RX mit TX verbunden, jetzt hab ich das Datenblatt noch einmal genau angesehn, und bemerkt das RX beim Funkmodul kein Eingang sondern ein Ausgang ist, mittlerweile hab ich RX mit RX und TX mit TX verbunden, also nicht ausgekreuzt. Kann man das Funkmodul durch falsches Anschließen zerstören?
Danke schon mal im Voraus
Ok, hat sich erledigt, es war ein Kombiniertes Software und Hardware problem :)
Ist immer wieder schön selbst auf neue Sachen draufzukommen.
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.