-
        

Ergebnis 1 bis 10 von 10

Thema: einfache Senderoutine

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

    einfache Senderoutine

    Anzeige

    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?

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

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    45
    Beiträge
    2.236
    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
    Code:
    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
    Software is like s e x: its better when its free.
    Linus Torvald

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

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    45
    Beiträge
    2.236
    Mehrere Bytes auf einmal, wird wohl kaum gehen , aber mehrere Bytes nacheinander !
    schau mal Hier nach
    Da wir es schön erklärt

    hey, cooler Controller


    Gruß Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

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

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    45
    Beiträge
    2.236
    Hmmmm,
    wenn ich Dich richtig verstehe, willst Du Bit0 dazu mißbrauchen, Parity, ohne Parity zu machen
    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:
    Code:
    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:
    Code:
    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
    Software is like s e x: its better when its free.
    Linus Torvald

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

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

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

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

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

  10. #10
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    19.02.2006
    Alter
    30
    Beiträge
    140
    Ok, hat sich erledigt, es war ein Kombiniertes Software und Hardware problem

    Ist immer wieder schön selbst auf neue Sachen draufzukommen.

Berechtigungen

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