PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Pollin Funkmodule mit Assembler



homedom
14.06.2007, 20:44
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.
.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

Spion
14.06.2007, 21:21
Hallo

Schau mal im Microcontroller net (http://www.mikrocontroller.net/) nach, da gibt es einen langen Thread der von diesen Funkmodulen handelt.

mfg Luca

homedom
14.06.2007, 22:00
Jo.. hab schon überall gescuht, aber noch nirgends was über meine Fragen. Außerdem nix mit Assembler. Trotzdem Danke

wkrug
14.06.2007, 23:21
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.

/* 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:

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:

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.

jar
03.07.2007, 13:01
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/remoteCordControl/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....

wkrug
03.07.2007, 20:30
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.