Forum: HF, Funk und Felder Funkverbindung Atmega128RFa1


von 112 (Gast)


Lesenswert?

1
//einige Prototypen, sowohl in Sende, als auch Empfangsteil verarbeitet:
2
3
4
void PLL_on(void)
5
{
6
TRX_STATE=CMD_PLL_ON;  //enable PLL_ON State , S. 105
7
_delay_us(150);
8
}
9
10
void RX_AACK_on(void)
11
{
12
TRX_STATE=CMD_RX_AACK_ON;  
13
}
14
15
void TX_ARET_on(void)
16
{
17
TRX_STATE=CMD_TX_ARET_ON;
18
}
19
20
21
22
//Programmausschnitte zum Senden
23
24
int main (void)
25
{
26
...
27
28
sei();
29
30
IRQ_MASK |= (1<<AWAKE_EN)
31
   |(1<<TX_END_EN)
32
   |(1<<AMI_EN)
33
   |(CCA_ED_DONE_EN)
34
   |(1<<RX_END_EN)
35
   |(1<<RX_START_EN)
36
   |(1<<PLL_LOCK_EN);
37
38
39
PHY_CC_CCA=0x33;   //wähle Kanal 19 für transmit == 2.445Mhz
40
PHY_TX_PWR =0x00;   //Output Power to max.
41
42
//Einstellungen für ARET-Mode
43
XAH_CTRL_0 = 0xF0;  // 15 Wiederholungen beim Senden
44
XAH_CTRL_0 = 0x05;  // MAX_CSMA_RETRIES festsetzen auf 5 
45
               
46
PRR1 &= ~(1<<PRTRX24);  //Transceiver braucht Power
47
48
PLL_on();
49
50
51
52
volatile char *framelange_ptr;
53
volatile uint16_t *inhalt_ptr;
54
55
56
uint16_t a=1412; //zwei Konstanten, die in den Frame Buffer sollen  
57
uint16_t b=500;        
58
59
*framelange_ptr = NULL;
60
*inhalt_ptr = NULL;
61
62
framelange_ptr = (char*) &TRXFBST; // cast auf Char Zeiger 
63
                                  //framelange_ptr bekommt 
64
                                  //Adresse von TRXFBST 
65
                                  //(hex 0x180 = dez. 384)
66
                                  // Dies ist die erste Adresse des 
67
                                  // 128 Byte Framebuffers  
68
69
inhalt_ptr=(uint16_t*) (&TRXFBST +1);   //cast auf uint16_t Zeiger //inhalt_ptr bekommt Adresse von TRXFBST + 1 Byte weiter
70
71
*ptr=9; // 1. Byte: "9" soll Länge des Frames anzeigen
72
        // 2./3.Byte: "1412", 
73
        // 4./5.Byte: "500", 
74
        // 6./7.Byte: leer 
75
        // 8./9.Byte "FCS"  == Frame Check Sequence
76
77
78
*inhalt_ptr=a;      //Inhalt von Adresse 0x181 beschreiben (mit uint16_t Wert)
79
inhalt_ptr=inhalt_ptr+1;  //Auf Adresse 0x183 weiterschalten
80
*inhalt_ptr=b;      //Inhalt 0x183 beschreiben
81
   
82
    
83
TX_ARET_on();
84
85
...
86
}
87
88
89
///////////////////////////////////////////////////////////////////////////
90
///Empfangsteil:
91
///////////////////////////////////////////////////////////////////////////
92
93
94
//in einem TRX24_RX_END Interrupt. Soll erstmal nur Länge des Empfangenen Frames wiedergeben.
95
96
void Read_received_Framelange(void);   
97
{
98
uint8_t ende=0;
99
ende = TST_RX_LENGTH;  //hier steht Länge des empf. Frames drin
100
lcd_gotoxy(0,1);
101
lcd_puts("TST_RX_Length: ");
102
lcd_puti(ende);
103
}
104
105
106
int main(void)
107
{
108
...
109
sei();  
110
IRQ_MASK |= (1<<AWAKE_EN)
111
   |(1<<TX_END_EN)
112
   |(1<<AMI_EN)
113
   |(CCA_ED_DONE_EN)
114
   |(1<<RX_END_EN)
115
   |(1<<RX_START_EN)
116
   |(1<<PLL_LOCK_EN);
117
   |(1<<PLL_UNLOCK_EN);  //Interrupts aktivieren
118
}
119
120
121
SFD_VALUE=0xA7;    //(Standard-Value)
122
123
PHY_CC_CCA=0x33;   //wähle Kanal 19 für receive
124
125
PLL_on();
126
127
XAH_CTRL_1 = 0x02; //Promiscuous-Mode aktivieren --> sobald PHR detektiert endet der Frame mit RX_End Interrupt. auch wenn FCS failed
128
129
130
while(1)
131
{
132
RX_AACK_on();
133
Read_received_Framelange();
134
135
...Wartezyklen, Restprogramm... etc...
136
137
}

Nun... das Programm läuft nicht ganz wie es soll und mir fehlt der 
Ansatz, wo ich etwas vergessen habe... Das Datenblatt ist gefühlte 100 
mal gelesen und eigentlich kann es nicht so schwer sein mal einen Frame 
hin und her zu schicken...
Hat jemand von euch Ideen, wie man sinnvollerweise hier weiterkommt, 
vielleicht Schon Erfahrungen mit einer ZigBee Übertragung gemacht und 
bereit seinen Code als Beispiel zu posten?

mfg

: Verschoben durch Moderator
von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

112 schrieb:

> IRQ_MASK |= (1<<AWAKE_EN)
>    |(1<<TX_END_EN)
>    |(1<<AMI_EN)
>    |(CCA_ED_DONE_EN)
>    |(1<<RX_END_EN)
>    |(1<<RX_START_EN)
>    |(1<<PLL_LOCK_EN);

Hast du das wirklich so stehen?  Das mit dem CCA_ED_DONE_EN würde
ich mir nochmal angucken. ;-)  Außerdem ist das |= natürlich
Unsinn, wenn du sowieso alle Bits setzen willst...  Kannste auch
gleich 0xFF schreiben, dann sieht man wenigstens, dass alle
gesetzt sind (ich hoffe, du hast auch alle ISRs installiert).

> PHY_CC_CCA=0x33;   //wähle Kanal 19 für transmit == 2.445Mhz

Besser wäre es, Subregister zu benutzen.

> //Einstellungen für ARET-Mode
> XAH_CTRL_0 = 0xF0;  // 15 Wiederholungen beim Senden
> XAH_CTRL_0 = 0x05;  // MAX_CSMA_RETRIES festsetzen auf 5

Diese beiden Schreibzugriffe kollidieren irgendwie.

Ich würde dir empfehlen, derartige Werte grundsätzlich erstmal auf
"default" zu belassen, also so, wie der IC aus dem Reset heraus kommt.

> PRR1 &= ~(1<<PRTRX24);  //Transceiver braucht Power

Überflüssig, die hat er bereits nach dem Reset.

> SFD_VALUE=0xA7;    //(Standard-Value)

Auch sowas bitte auf Reset-Werten stehen lassen.

> XAH_CTRL_1 = 0x02; //Promiscuous-Mode aktivieren --> sobald PHR
> detektiert endet der Frame mit RX_End Interrupt. auch wenn FCS failed

Wenn du alles empfangen willst (auch x-beliebigen Müll), dann nimm
besser den einfach RX-Modus statt des RX_AACK.

> Nun... das Programm läuft nicht ganz wie es soll

Beschreib' doch lieber mal, was es bereits tut.

> Hat jemand von euch Ideen, wie man sinnvollerweise hier weiterkommt,
> vielleicht Schon Erfahrungen mit einer ZigBee Übertragung gemacht und
> bereit seinen Code als Beispiel zu posten?

Ich würde an deiner Stelle mit den Beispielapplikationen von µracoli
anfangen.  Wenn du diese am Laufen hast, weißt du, dass die Hardware
OK ist, dann kannst du anfangen, einen der beiden Knoten mit komplett
eigener Firmware zu füllen (so das dein Ehrgeiz ist, du kannst
natürlich auch einfach auf der Basis von µracoli weiterentwickeln).

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
Noch kein Account? Hier anmelden.