PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Initialisierung RT868F5



Gerko
10.01.2008, 17:35
Hallo Leute!

Ich kämpfe gerade mit meinem Funkmodul, vielleicht könnt ihr mir weiterhelfen. Ich versuche eine Baudrate von 57600 einzustellen, dazu muss man bei diesem speziellen Modul ein internes Register (S5=1) auf "1" setzen.

Das Datenblatt zu dem Modul ist hier: http://www.funkmodul.com/funkmodule/transceiver_daten/RT868F5.pdf

Auf Seite 7 wird genau beschrieben wie so etwas geht, nur eben nicht in Assembler. Ich habe versucht das zu übersetzen, und für einen ATmega8 im AVR Studio 4 folgendes Programm dafür geschrieben:


;Abrufmöglichkeiten:
; Initialisieren: RT868F5_initialisieren
; Senden: RT868F5_Senden
; empfangen: RT868F5_empfangen ... Je nach Verwendung abzuändern

;Benötigte Deklarationen:
; Arbeitsregister: temp
; Register zum Senden: Senden
; Register zum Empfangen: Empfangen
; Korrekte Taktrate eingeben (derzeit 8000000)


;Pinbelegung:
; ______
; PC6 1 | O |28 PC5
; RXD PD0 2 | |27 PC4
; TXD PD1 3 | |26 PC3
; PD2 4 | |25 PC2
; SP2 PD3 5 | |24 PC1
; SP1 PD4 6 | |23 PC0
; VCC 7 | |22 GND
; GND 8 | AT |21 AREF
; PB6 9 | mega |20 AVCC
; PB7 10| 8 |19 PB5
; PD5 11| |18 PB4
; PD6 12| |17 PB3
; PD7 13| |16 PB2
; PB0 14|______|15 PB1

;..................................
;... RT868F5 Initialisieren ...
;..................................

RT868F5_initialisieren:
;Einstellen der Baudrate
;UBRR = Taktfrequenz / (16 * Baudrate) - 1
.equ Takt = 8000000
.equ Baud = 57600
.equ UBRRL_H = Takt/(Baud*16)-1

ldi temp, LOW(UBRRL_H)
out UBRRL, temp
ldi temp, HIGH(UBRRL_H)
out UBRRH, temp
;Senden und Empfangen aktivieren
ldi temp, (1<<RXEN) | (1<<TXEN) | (1<<RXCIE)
out UCSRB, temp
;Einstellen des Formats (1Start, 8Data, 1 Stop)
ldi temp, (1<<URSEL) | (1<<UCSZ1) | (1<<UCSZ0)
out UCSRC, temp
;Einstellen des Funkmoduls:
;57600 Baud
; SP1 Auf 3V
; SP2 Auf 0V (Hardwareseitig)

; S5 auf 1 setzen:
ldi Senden, '+' ; Sendet +++
rcall RT868F5_Senden
ldi Senden, '+'
rcall RT868F5_Senden
ldi Senden, '+'
rcall RT868F5_Senden

rcall Empfangen_OK

ldi Senden, 'A' ; Sendet ATS5=1<CRLF>
rcall RT868F5_Senden
rcall Wait_5ms
ldi Senden, 'T'
rcall RT868F5_Senden
rcall Wait_5ms
ldi Senden, 'S'
rcall RT868F5_Senden
rcall Wait_5ms
ldi Senden, 5
rcall RT868F5_Senden
rcall Wait_5ms
ldi Senden, '='
rcall RT868F5_Senden
rcall Wait_5ms
ldi Senden, 1
rcall RT868F5_Senden
rcall Wait_5ms
ldi Senden, 13
rcall RT868F5_Senden
rcall Wait_5ms
ldi Senden, 10
rcall RT868F5_Senden

rcall Empfangen_OK

ldi Senden, 'A' ; Sendet ATCC<CRLF>
rcall RT868F5_Senden
rcall Wait_5ms
ldi Senden, 'T'
rcall RT868F5_Senden
rcall Wait_5ms
ldi Senden, 'C'
rcall RT868F5_Senden
rcall Wait_5ms
ldi Senden, 'C'
rcall RT868F5_Senden
rcall Wait_5ms
ldi Senden, 13
rcall RT868F5_Senden
rcall Wait_5ms
ldi Senden, 10
rcall RT868F5_Senden

rcall Empfangen_OK

ret

Empfangen_OK:
Receive_Warten1:
sbis UCSRA, RXC
rjmp Receive_Warten1
in temp, UDR
cpi temp, 'O'
brne FEHLER_RT868F5_INT
Receive_Warten2:
sbis UCSRA, RXC
rjmp Receive_Warten2
in temp, UDR
cpi temp, 'K'
brne FEHLER_RT868F5_INT
Receive_Warten3:
sbis UCSRA, RXC
rjmp Receive_Warten3
in temp, UDR
cpi temp, 13
brne FEHLER_RT868F5_INT
Receive_Warten4:
sbis UCSRA, RXC
rjmp Receive_Warten4
in temp, UDR
cpi temp, 10
brne FEHLER_RT868F5_INT
ret

FEHLER_RT868F5_INT:
sbi BGL, BGL_
rjmp Ende

;..........................
;... RT868F5 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, Senden ; Nachricht absenden
ret

;.............................
;... RT868F5 empfangen ...
;.............................

RT868F5_Empfangen:
in empfangen, UDR

reti

Das Problem dabei ist, das es nicht funktioniert, da das Funkmodul nicht antwortet, Das Programm bleibt immer in der ersten Warteschleife wo erwaret wird das ein 'O' empfangen wird, hängen.

Hoffentlich kann mir da wer weiterhelfen!

Danke im Voraus, Gerko

Gerko
11.01.2008, 15:14
Ein erster Erfolg! Ich gelange mitlerweile in den Programiermodus, allerdings wars das schon wieder.

Ich hab jetzt ein Delay eingebaut, bevor ich das Funkmodul anspreche, anscheinend braucht das auch eine gewisse Zeit zum "Hochfahren"

Jetzt happerts aber bei schritt 2, im PDF steht:

Um ein Register zu beschreiben, ist folgender Befehl erforderlich:
ATSx=y<CRLF> (ASCII String entspricht der dezimalen Zahlenfolge: 65 84 83 xx 61 yy 13 10)
x kann den Zahlenwert 1 bis 16 annehmen (die Registernummer)
xx entspricht dem ASCII Code (1 oder 2 Byte) des Registers x
y ist der Wert, welcher dem Register x zugewiesen werden soll
yy entspricht dem ASCII Code (1 oder 2 Byte) des Wertes y

Jetzt weiß ich allerdings nicht, soll ich hier zwischen den einzelnen Byts warten, oder nicht? Ich habe schon beides Probiert, und beidemale funktioiert es nicht (mit 5ms, 1ms und ohne) wie ist das nun gemeint?


Bitte um baldige Hilfe

EDIT: Was ich vergessen habe zu erwähen, die Baudrate habe ich auf 38400 zurückgestellt, da ich das bit für die 57600 ja erst setzen muss