Guten Morgen, Ich arbeite an einem kleinem Projekt mit RFM12 Modulen. Das Transmitt-programm funktioniert bereits, da ich mit dem Spektrumanalyser sehen kann, dass es was sendet. Ich arbeite mit einem Atmega16, die Anschlüsse sind richtig definiert. Hier folgt nun der C-Code, ich hoffe ihr könnt mir dabei helfen, den Fehler zu finden, der mich zum Wahnsinn treibt. / RFM12 // SCK 11 ----------- PB7 // SDO 10 ----------- PB6 // SDI 2 ----------- PB5 // nSEL 3 ----------- PB4 // DATA 9 ----------- PB3 // nIRQ 5 ----------- PD5 // // PD6: LED green // PD7: LED red #include <avr/io.h> #include <AVR/interrupt.h> #include <AVR/signal.h> #define DDR_IN 0 #define DDR_OUT 1 #define PORT_SEL PORTB #define PIN_SEL PINB #define DDR_SEL DDRB #define PORT_SDI PORTB #define PIN_SDI PINB #define DDR_SDI DDRB #define PORT_SCK PORTB #define PIN_SCK PINB #define DDR_SCK DDRB #define PORT_SDO PORTB #define PIN_SDO PINB #define DDR_SDO DDRB #define PORT_IRQ PORTD #define PIN_IRQ PIND #define DDR_IRQ DDRD //#define PORT_DATA PIND //#define PIN_DATA PIND //#define DDR_DATA DDRD #define PORT_DATA PORTB #define PIN_DATA PINB #define DDR_DATA DDRB /*#define PB7 7//--\ #define PB6 6// | #define RFXX_SCK 5// | #define RFXX_SDO 4// |RF_PORT #define RFXX_SDI 3// | #define RFXX_SEL 2// | #define NC 1// | #define PB0 0//--/ */ #define RFXX_SCK 7//-- #define RFXX_SDO 6// | #define RFXX_SDI 5// | #define RFXX_SEL 4// |RF_PORT #define RF12_DATA 3// | #define PB2 2// | #define NC 1// | #define PB0 0//-- #define SEL_OUTPUT() DDR_SEL |= (1<<RFXX_SEL) #define HI_SEL() PORT_SEL |= (1<<RFXX_SEL) #define LOW_SEL() PORT_SEL &=~(1<<RFXX_SEL) #define SDI_OUTPUT() DDR_SDI |= (1<<RFXX_SDI) #define HI_SDI() PORT_SDI |= (1<<RFXX_SDI) #define LOW_SDI() PORT_SDI &=~(1<<RFXX_SDI) #define SDO_INPUT() DDR_SDO&= ~(1<<RFXX_SDO) //#define LOW_SDO() PORT_SDO&= (1<<RFXX_SDO) Low_sdo wird nicht verwendent??!! #define SDO_HI() PORT_SDO |= (1<<RFXX_SDO) #define SCK_OUTPUT() DDR_SCK |= (1<<RFXX_SCK) #define HI_SCK() PORT_SCK |= (1<<RFXX_SCK) #define LOW_SCK() PORT_SCK &=~(1<<RFXX_SCK) #define RF12_IRQ PD5 //von 2 auf 5 geändert, da IRQ bei #define IRQ_IN() DDR_IRQ &=~ (1<<RF12_IRQ) #define WAIT_IRQ_LOW() while (PIND&(1<<RF12_IRQ)) // WELCHER PIN??? //#define RF12_DATA PB3//PD4 auf PB3geändert #define DATA_OUT() DDR_DATA |=(1<<RF12_DATA) #define HI_DATA() PORT_DATA |= (1<<RF12_DATA) //EinserKomplemente herausgenommen, sodass nur die benötigten Leds leuchten //#define LEDG_OUTPUT() DDRC |=~ (1<<6) //#define LEDR_OUTPUT() DDRC |=~ (1<<7) //#define LEDG_ON() PORTC&=(1<<6) //Led 6 auf Megacard //#define LEDG_OFF() PORTC|=(1<<6) //#define LEDR_ON() PORTC&=(1<<7) //Led 7 (links) auf Megacard //#define LEDR_OFF() PORTC|=(1<<7) //Leds 6 und 7 definieren #define LED6_OUTPUT() DDRC |=(1<<6) #define LED7_OUTPUT() DDRC |=(1<<7) #define LED5_OUTPUT() DDRC |=(1<<5) #define LED5_TestON() PORTC |=(1<<5) #define LED6_ON() PORTC |=(1<<6) #define LED7_ON() PORTC |=(1<<7) #define LED5_TestOFF() PORTC &=~(1<<6) #define LED6_OFF() PORTC &=~(1<<6) #define LED7_OFF() PORTC &=~(1<<7) void RFXX_PORT_INIT(void) { //LED5_TestON(); HI_SEL(); HI_SDI(); LOW_SCK(); // SET nFFS pin HI when using FIFO HI_DATA(); SEL_OUTPUT(); SDI_OUTPUT(); SDO_INPUT(); SCK_OUTPUT(); IRQ_IN(); DATA_OUT(); } unsigned int RFXX_WRT_CMD(unsigned int aCmd) { //LED5_TestON(); unsigned char i; unsigned int temp; temp = 0; LOW_SCK(); LOW_SEL(); for (i = 0;i<16;i++) { if(aCmd&0x8000) { //LED5_TestON(); HI_SDI(); } else { //LED5_TestON(); LOW_SDI(); } HI_SCK(); temp<<=1; if (SDO_HI()) { //LED5_TestON(); keine reaktion temp|=0x0001; } //LED5_TestON(); LOW_SCK(); aCmd<<=1; } //LED5_TestON(); HI_SEL(); return temp; } void RF12_INIT(void) { //LED5_TestON(); RFXX_WRT_CMD(0x80E8);//ef ein; b1 ein; x3 ein; 12,5pF; 868MHz RFXX_WRT_CMD(0x82D9);//er ein; ebb ein; es ein; ex ein; RFXX_WRT_CMD(0xA640);//f10 ein; f9 ein, f7 ein; RFXX_WRT_CMD(0xC647);//4.8kbps RFXX_WRT_CMD(0x94A0);//VDI,FAST,134kHz,0dbm,-103dBm RFXX_WRT_CMD(0xC2AC);//al ein, 1 ein, 1 ein; f2 ein; RFXX_WRT_CMD(0xCA81);//FIF08,SYNC,!ff,DR RFXX_WRT_CMD(0xCED4);//SYNC=2DD4 RFXX_WRT_CMD(0xC4F7); //@PWR, NO RSTRIC, !st, !fi, OE, EN RFXX_WRT_CMD(0x9850);//!mp, 9810=30kHz,MAX OUT RFXX_WRT_CMD(0xCC77);//OB1,OB0,! 1px,! ddy, DDIT, BW0 RFXX_WRT_CMD(0xE000);//NOT USE RFXX_WRT_CMD(0xC800);//NOT USE RFXX_WRT_CMD(0xC040);//1,66MHz, 2,2V } unsigned char RF12_RECV(void) { unsigned int FIF0_data; WAIT_IRQ_LOW(); RFXX_WRT_CMD(0x0000); FIF0_data=RFXX_WRT_CMD(0xB000); return(FIF0_data&0x00FF); } void Delay_ms(unsigned char amS) { unsigned char i; unsigned int j; for(i=0;i<amS;i++)for(j=0;j<914;j++); } int main(void) { LED5_TestOFF(); LED5_OUTPUT(); //LED5_TestON(); unsigned char i; unsigned char ChkSum; //Power on indication: both LEDR and LEDG blink 3 times LED6_OFF(); LED7_OFF(); LED6_OUTPUT(); LED7_OUTPUT(); for(i=0;i<3;i++) { Delay_ms(200); LED6_ON(); LED7_ON(); //LED5_TestON(); Delay_ms(200); LED6_OFF(); LED7_OFF(); } LED6_OFF(); LED7_OFF(); //Initialize command Port RFXX_PORT_INIT(); //Initialize RF12 chip RF12_INIT(); //Init FIF0, RFXX_WRT_CMD(0xCA81); //FIFO Reset Mode: f3/FIFO IT level bit 3; dr/disable high sens. reset while(1) { //Enable FIF0 RFXX_WRT_CMD(0xCA83); //FIFO Reset Mode: f3/FIFO IT level bit 3; ff/FIFO fill; dr/disable high sens. reset ChkSum=0; //LED5_TestON(); //Recive payload data for(i=0;i<16;i++) { ChkSum+=RF12_RECV(); //LED5_TestON(); } //Recive Check sum i=RF12_RECV(); //Disable FIF0 RFXX_WRT_CMD(0xCA81); //FIFO Reset Mode: ff/FIFO fill wird ausgeschalten //Package check if(ChkSum==i) { //LED5_TestON(); //Delay_ms(500); //LED5_TestOFF(); LED6_ON(); Delay_ms(500); LED6_OFF(); } } } mit freundlichen Grüßen
Das offensichtliche zuerst... Das ist nix:
1 | void Delay_ms(unsigned char amS) |
2 | {
|
3 | unsigned char i; |
4 | unsigned int j; |
5 | for(i=0;i<amS;i++)for(j=0;j<914;j++); |
6 | }
|
Schau dir _delay_ms() aus der avr-libc an. Ist auch im AVR-GCC-Tutorial beschrieben. Wenn es danach immer noch hakt, wieder melden (und länglichen Code bitte in den Anhang stecken, weil das bequemer zu lesen ist)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.