-         

Ergebnis 1 bis 2 von 2

Thema: Initialisierung RT868F5

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    19.02.2006
    Alter
    30
    Beiträge
    140

    Initialisierung RT868F5

    Anzeige

    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/...en/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:

    Code:
    ;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

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    19.02.2006
    Alter
    30
    Beiträge
    140
    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

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •