Gerko
10.01.2008, 18: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
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