-         

Ergebnis 1 bis 6 von 6

Thema: Pollin Funkmodule mit Assembler

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    25.05.2006
    Ort
    Rheinzabern
    Alter
    26
    Beiträge
    200

    Pollin Funkmodule mit Assembler

    Anzeige

    Hi,
    Ich hab vor für mein RC Car n kleines Kontrollsystem zu basteln und die Daten direkt per Funk an einen Laptop zu senden. Ich hab die Pollin RFM02 und RFM01 Module. Nun hab ich das Problem, dass ich nich ganz weiß wie man die anschließt/anspricht. Ich versteh nicht ganz was der FSK Pin is und ob man den CLK Pin braucht, wenn man n externen Quarz am Atmega8 hat? Und was ist der nIRQ? Was genau macht der? Ich hab auch in der SuFu einen interessanten Thread gefunden, aber leider nix mit Assembler. Den Großteil des Programms hab ich schon fertig. Am INT0 hab ich einen Magnetfeldsensor, an ADC0 einen Akku und an ADC1 einen Tempsensor. Also hier mal meinen Code, die Senderoutine is nur mal provisorisch und mein Code könnte nich ganz soo perfekt sein.
    Code:
    .include "m8def.inc"
    
    .def temp = r16
    .def temp1 = r17
    .def akkulo = r18
    .def akkuhi = r19
    .def templo = r20
    .def temphi = r21
    .def adclo = r22
    .def adchi = r23
    .def upms = r24
    .def timereg = r25
    .def adccount = r26
    .def adcreg = r27
    .equ CLOCK = 16000000
    .equ BAUD = 9600
    .equ UBRRVAL = CLOCK/(BAUD*16)-1#
    
    .org 0x000
    	rjmp main
    .org INT0addr
    	rjmp upmplus
    .org OC1Aaddr
    	rjmp transmit
    
    main:
    	ldi temp, LOW(RAMEND)
    	out SPL, temp
    	ldi temp, HIGH(RAMEND)
    	out SPH, temp
    
    	ldi temp, LOW(UBRRVAL)
    	out UBRRL, temp
    	ldi temp, HIGH(UBRRVAL)
    	out UBRRH, temp
    
    	ldi temp, LOW(40000-1)
    	out OCR1AL, temp
    	ldi temp, HIGH(40000-1)
    	out OCR1AH, temp
    
    	ldi temp, 0x00
    	out DDRD, temp
    	ldi temp, 0xFF
    	out PORTD, temp
    
    	ldi temp, ( 1 << WGM12 ) | ( 1 << CS00 )
        out TCCR1B, temp
     
        ldi temp, 1 << OCIE1A  ; OCIE1A: Interrupt bei Timer Compare
        out TIMSK, temp	
    
    	ldi temp, (1<<URSEL)|(3<<UCSZ0)
    	out UCSRC, temp
    
    	ldi temp, 0b00001010
    	out MCUCR, temp
    	ldi temp, 0b10000000
    	out GICR, temp
    
    	sbi UCSRB, TXEN
    
    	sei
    
    	ldi temp, (1<<PB4) | (1<<PB5)
    	out DDRB, temp
    	ldi temp, (1<<SPE) | (1<<MSTR) | (1<<SPR0)
    	out SPCR, temp
    
    configadc0:
    	ldi  temp, (1<<REFS0)
        out  ADMUX, temp
        ldi  temp, (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0)
        out  ADCSRA, temp
    
    startadc0:
    	clr adcreg
    	clr temp1
    	clr akkulo
    	clr akkuhi
    	ldi adccount, 0
    	sbi ADCSRA, ADSC
    warteadc0:
    	sbic ADCSRA, ADSC
    	rjmp warteadc0
    
    	in adclo, ADCL
    	in adchi, ADCH
    
    	add temp1, adclo
    	adc akkulo, adchi
    	adc akkuhi, adcreg
    	dec adccount
    	brne startadc0
    
    	ldi  temp, (1<<REFS0 | 1<<MUX0)
        out  ADMUX, temp
        ldi  temp, (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0)
        out  ADCSRA, temp
    
    startadc1:
    	clr adcreg
    	clr temp1
    	clr templo
    	clr temphi
    	ldi adccount, 0
    	sbi ADCSRA, ADSC
    warteadc1:
    	sbic ADCSRA, ADSC
    	rjmp warteadc1
    
    	in adclo, ADCL
    	in adchi, ADCH
    
    	add temp1, adclo
    	adc templo, adchi
    	adc temphi, adcreg
    	dec adccount
    	brne startadc1
    
    	ldi  temp, (1<<REFS0)
        out  ADMUX, temp
        ldi  temp, (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0)
        out  ADCSRA, temp
    
    loop: rjmp loop
    
    upmplus:
    	inc upms
    	reti
    
    transmit:
    	out SPDR, upms
    	sbis SPSR, SPIF
    	rjmp transmit
    transbreak:
    	ldi temp, '|'
    	out SPDR, temp
    	sbis SPSR, SPIF
    	rjmp transbreak
    transakku:
    	out SPDR, akkulo
    	sbis SPSR, SPIF
    	rjmp transmit
    transbreak1:
    	ldi temp, '|'
    	out SPDR, temp
    	sbis SPSR, SPIF
    	rjmp transbreak1
    	reti
    transakku1:
    	out SPDR, akkuhi
    	sbis SPSR, SPIF
    	rjmp transmit
    transbreak2:
    	ldi temp, '|'
    	out SPDR, temp
    	sbis SPSR, SPIF
    	rjmp transbreak2
    	reti
    transtemp:
    	out SPDR, templo
    	sbis SPSR, SPIF
    	rjmp transmit
    transbreak3:
    	ldi temp, '|'
    	out SPDR, temp
    	sbis SPSR, SPIF
    	rjmp transbreak1
    	reti
    transtemp1:
    	out SPDR, temphi
    	sbis SPSR, SPIF
    	rjmp transmit
    transbreak4:
    	ldi temp, '|'
    	out SPDR, temp
    	sbis SPSR, SPIF
    	rjmp transbreak2
    	reti
    Das Konfigurieren des Sendemoduls fehlt hier noch, da ich darüber nich viel weiß. Die Empfangseinheit ist NOCH nicht in arbeit.
    Ich hoff mir kann jemand helfen.

    gruß homedom

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    09.07.2005
    Ort
    127.0.0.1
    Alter
    26
    Beiträge
    824
    Hallo

    Schau mal im Microcontroller net nach, da gibt es einen langen Thread der von diesen Funkmodulen handelt.

    mfg Luca
    Sollte ein Bild von mir nicht angezeigt werden, einfach eine PM schicken!

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    25.05.2006
    Ort
    Rheinzabern
    Alter
    26
    Beiträge
    200
    Jo.. hab schon überall gescuht, aber noch nirgends was über meine Fragen. Außerdem nix mit Assembler. Trotzdem Danke

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    1.892
    Hi,
    Ich versteh nicht ganz was der FSK Pin is und ob man den CLK Pin braucht, Und was ist der nIRQ?
    Die Module können sehr unterschiedlich konfiguriert werden und somit werden auch verschiedene Anschlüsse nötig.

    Im RFM 02 können Daten per Kommando über die Datenleitung SDI (Kommando 0xC6) als auch über die Direkte Modulationsleitung FSK gesendet werden.

    Die Geschwindigkeit mit der das geschieht, also die Bitrate kannst Du mit dem µC vorgeben, oder der RFM 02 aktiviert den Ausgang NIRQ nach jedem Bit!!.

    Ich hab mich für die NIRQ Variante über SDI die auf einen Interrupt wirkt entschieden, weil die Von Takt des µC unabhängig ist.

    Der CLK Pin wäre zur Versorgung des µC mit Takt gedacht, da Du ja dafür einen Quarz hast brauchst Du ihn nicht. Wenn doch gebraucht Pullup Widerstand einbauen. Ursprünglich wollte ich den Takt verwenden, allerdings schmiert mir mein ATMEGA8 bei der Umschaltung der Taktrate von 1MHz auf 5MHz ab.

    Im Empfänger muss die DATA/NFFS Leitung in meinem Mode mit einem 10k Pull Up Widerstand auf +5V gebracht werden.
    Der Rest sollte klar sein.

    Beim Empfänger hab ich den FIFO Puffer aktiviert und auf 8 Bit eingestellt.
    Wenn jetzt 8 Bit im FiFo Puffer sind wird ein nIRQ ausgelöst.
    Ich spring auch hier wieder in einen Interrupt und les die 8Bit aus.
    Der FiFo Puffer braucht als Startsequenz Hex 0xAA 0xAA 0xAA 0x2D 0xD4
    Diese Sequenz muss gesendet werden, der Fifo Puffer "verschluckt" sie aber.
    Wenn eine kompletter Datensatz übertragen Wurde muss der Fifo zurückgesetzt werden. Nur so wartet er in der Snedepause wieder auf eine Startsequenz und gibt keine wirren Zeichen aus.
    Code:
    /* FIFO Command: Enable FIFO, IT level=8, Sync. Patt + VDI, stop FIFO  */
        #asm ("cbi portb,nsel");
        sendbyte(0b11001110);
        sendbyte(0b10001001);
        #asm ("sbi portb,nsel");
        #asm ("nop");
        
        /* FIFO Command: Enable FIFO, IT level=8, Sync. Patt + VDI, start FIFO  */
        #asm ("cbi portb,nsel");
        sendbyte(0b11001110);
        sendbyte(0b10001011);
        #asm ("sbi portb,nsel");
        #asm ("nop");
        uc_receivebyte=0;
    Ich häng die mal meine Konfigurationseinstellungen mit ran.
    Ist zwar in "C" die benötigten Bits kann man aber gut erkennen.

    zuerst der Sender:
    Code:
    volatile unsigned char uc_frequ[2]; /* Frequenz tuningword */
        uc_frequ[1]=ui_frequ[uc_kanal]/256;
        uc_frequ[1]|=0b10100000;
        uc_frequ[0]=ui_frequ[uc_kanal]%256;
        /* Configuration Setting: 433MHz, CLK 5MHz, 11,5pf Kapaz., +/-60kHz */
        #asm ("cbi portb,nsel");
        sendbyte(0b10001110);
        sendbyte(0b01100000); 
        #asm ("sbi portb,nsel");
        #asm ("nop");
        
        /* Frequency Setting: eingestellter Kanal*/
        #asm ("cbi portb,nsel");
        sendbyte(uc_frequ[1]);
        sendbyte(uc_frequ[0]); 
        #asm ("sbi portb,nsel");
        #asm ("nop");
        
        /* Output Power Command: Max Power */
        #asm ("cbi portb,nsel");
        sendbyte(0b10110000);
        #asm ("sbi portb,nsel");
        #asm ("nop");
           
        /* Data Rate Command: 2400 bit/s */
        #asm ("cbi portb,nsel");
        sendbyte(0b11001000);
        sendbyte(0b10001111); 
        #asm ("sbi portb,nsel");
        #asm ("nop");
        
        /* Low Batt + Sync Command: enable Sync Circuit */
        #asm ("cbi portb,nsel");
        sendbyte(0b11000010);
        sendbyte(0b00100000); 
        #asm ("sbi portb,nsel");
        #asm ("nop");
        
        /* PLL Setting Command: 0xD240 up to 19,2kbit/s*/
        #asm ("cbi portb,nsel");
        sendbyte(0b11010010);
        sendbyte(0b01000000); 
        #asm ("sbi portb,nsel");
        #asm ("nop");
            
        /* Power Managment Command= Enable Clock; disable Synthesizer; disable pow. Ampl. */
        #asm ("cbi portb,nsel");
        sendbyte(0b11000000);
        sendbyte(0b00100000); 
        #asm ("sbi portb,nsel");
    Nun der Empfänger:
    Code:
    volatile unsigned char uc_frequ[2]; /* Frequenz tuningword */
        /* Frequenzwortermittlung aus der Kanalangabe */
        uc_frequ[1]=ui_frequ[uc_kanal]/256;
        uc_frequ[1]|=0b10100000;
        uc_frequ[0]=ui_frequ[uc_kanal]%256;
        
        /* Configuration Setting: 433MHz, CLK on, 11,5pf Kapaz., 67kHz */
        #asm ("cbi portb,nsel");
        sendbyte(0b10001001);
        sendbyte(0b01101100); 
        #asm ("sbi portb,nsel");
        #asm ("nop");
        
        /* Low Batt Clock Divider Command: clock 5MHz */
        #asm ("cbi portb,nsel");
        sendbyte(0b11000010);
        sendbyte(0b11000000); 
        #asm ("sbi portb,nsel");
        #asm ("nop");
        
        /* Frequency Setting: 434MHz (je nach Kanal) */
        #asm ("cbi portb,nsel");
        sendbyte(uc_frequ[1]);
        sendbyte(uc_frequ[0]); 
        #asm ("sbi portb,nsel");
        #asm ("nop");
        
        /* Receiver Setting Command: VDI= Digital RSSI Out, -103dB, receiver disabled */
        #asm ("cbi portb,nsel");
        sendbyte(0b11000000);
        sendbyte(0b10000000);
        #asm ("sbi portb,nsel");
        #asm ("nop");
        
        /* Receiver Setting Command: VDI= Digital RSSI Out, -103dB receiver enabled */
        #asm ("cbi portb,nsel");
        sendbyte(0b11000000);
        sendbyte(0b10000001);
        #asm ("sbi portb,nsel");
        #asm ("nop");
           
        /* FIFO Command: Enable FIFO, IT level=8, Sync. Patt + VDI, stop FIFO  */
        #asm ("cbi portb,nsel");
        sendbyte(0b11001110);
        sendbyte(0b10001001);
        #asm ("sbi portb,nsel");
        #asm ("nop");
        
        /* FIFO Command: Enable FIFO, IT level=8, Sync. Patt + VDI, start FIFO  */
        #asm ("cbi portb,nsel");
        sendbyte(0b11001110);
        sendbyte(0b10001011);
        #asm ("sbi portb,nsel");
        #asm ("nop");
        
        
        /* Data Filter Command:  */
        #asm ("cbi portb,nsel");
        sendbyte(0b11000100);
        sendbyte(0b10101100); 
        #asm ("sbi portb,nsel");
        #asm ("nop");
        
        
        /* Data Rate Command: 2400 bit/s */
        #asm ("cbi portb,nsel");
        sendbyte(0b11001000);
        sendbyte(0b10010001);
        #asm ("sbi portb,nsel");
        #asm ("nop");
        
        
        /* AFC Command: Enable AFC, +3/-4, offset at VDI high */
        #asm ("cbi portb,nsel");
        sendbyte(0b11000110);
        sendbyte(0b10111111); 
        #asm ("sbi portb,nsel");
        #asm ("nop");
    Die Daten müssen mit dem MSB Bit voran übertragen werden !
    Also Schieben der Daten nach links.

    Hier gibts die Original Datenblätter
    http://www.hoperf.com/doce/
    , schau auf jeden Fall auch die RF01 und RF02 an.

    Zieh Dir auf jeden Fall auch diese Datenblätter rein:
    http://www.integration.com/resources.shtml
    Speziell IA4220 und IA4320 die haben den gleichen Kommadosatz wie die Pollin Teile.

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    06.03.2007
    Beiträge
    176
    Zitat Zitat von wkrug
    Hi,
    Ich versteh nicht ganz was der FSK Pin is und ob man den CLK Pin braucht, Und was ist der nIRQ?
    Die Module können sehr unterschiedlich konfiguriert werden und somit werden auch verschiedene Anschlüsse nötig.
    hey ein Spezialist, so einen Suche ich

    ich wollte dem Atmel mit dem RFM01 433MHz beibringen, aber es kümmt nix raus,

    Problem wird der Sender sein,
    Handauslöser Cam,
    http://www.linkdelight.com/photo/rem...ontrol/R7C.jpg
    der pulst mit 2kHz, wie von 433 MHz Sendern gewohnt, vermutlich kommt nix aus dem FiFo (SDO) weil da bei analog nix kommt, muss ich vielleicht doch den analog Ausgang DCLK/CFIL/FFIT nehmen , Pin 4 ?

    diese Hopf Module müssten doch auch klassisch laufen als 2 kHz Transmitter, so wie ich das verstanden habe, statt FSK Demodulator könnte auch der Atmel dienen...

    wenn keiner einen Tipp hat muss ich halt weiter probieren....

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    1.892
    der pulst mit 2kHz, wie von 433 MHz Sendern gewohnt, vermutlich kommt nix aus dem FiFo (SDO) weil da bei analog nix kommt, muss ich vielleicht doch den analog Ausgang DCLK/CFIL/FFIT nehmen , Pin 4 ?
    Wenn da nur 2kHz Rechteckimpulse rauskommen, kannst Du den FiFo vergessen.
    Ich denk aber, das der FSK Pin beim Sender, sowie der Data Pin beim Empfänger, nach der richtigen Konfiguration, das machen was Du da vorhast.
    Ich hab aber sowas noch nicht versucht, ich bin froh das mein Zeug soweit läuft.
    Den VDI solltest Du mal vorerst auf immer gut konfigurieren, kannst das ja später wieder zurücknehmen auf Digital RSSI.
    Ob das auch Auswirkung auf den DATA Pin bei schlechten Empfangsverhältnissen hat kann ich nicht sagen. Notfalls musst Du halt das Statusregister im Empfänger auslesen und da die Information holen.

    Ich muss nach wie vor sagen, die Dokumentation der Chips ist besch....eiden.

Berechtigungen

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