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
Gast
#2519158
Das offensichtliche zuerst... Das ist nix:
1 | |
2 | |
3 | |
4 | |
5 | |
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)