www.mikrocontroller.net

Forum: HF, Funk und Felder Funkverbindung Atmega128RFa1


Autor: 112 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
//einige Prototypen, sowohl in Sende, als auch Empfangsteil verarbeitet:


void PLL_on(void)
{
TRX_STATE=CMD_PLL_ON;  //enable PLL_ON State , S. 105
_delay_us(150);
}

void RX_AACK_on(void)
{
TRX_STATE=CMD_RX_AACK_ON;  
}

void TX_ARET_on(void)
{
TRX_STATE=CMD_TX_ARET_ON;
}



//Programmausschnitte zum Senden

int main (void)
{
...

sei();

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);


PHY_CC_CCA=0x33;   //wähle Kanal 19 für transmit == 2.445Mhz
PHY_TX_PWR =0x00;   //Output Power to max.

//Einstellungen für ARET-Mode
XAH_CTRL_0 = 0xF0;  // 15 Wiederholungen beim Senden
XAH_CTRL_0 = 0x05;  // MAX_CSMA_RETRIES festsetzen auf 5 
               
PRR1 &= ~(1<<PRTRX24);  //Transceiver braucht Power

PLL_on();



volatile char *framelange_ptr;
volatile uint16_t *inhalt_ptr;


uint16_t a=1412; //zwei Konstanten, die in den Frame Buffer sollen  
uint16_t b=500;        

*framelange_ptr = NULL;
*inhalt_ptr = NULL;

framelange_ptr = (char*) &TRXFBST; // cast auf Char Zeiger 
                                  //framelange_ptr bekommt 
                                  //Adresse von TRXFBST 
                                  //(hex 0x180 = dez. 384)
                                  // Dies ist die erste Adresse des 
                                  // 128 Byte Framebuffers  

inhalt_ptr=(uint16_t*) (&TRXFBST +1);   //cast auf uint16_t Zeiger //inhalt_ptr bekommt Adresse von TRXFBST + 1 Byte weiter

*ptr=9; // 1. Byte: "9" soll Länge des Frames anzeigen
        // 2./3.Byte: "1412", 
        // 4./5.Byte: "500", 
        // 6./7.Byte: leer 
        // 8./9.Byte "FCS"  == Frame Check Sequence


*inhalt_ptr=a;      //Inhalt von Adresse 0x181 beschreiben (mit uint16_t Wert)
inhalt_ptr=inhalt_ptr+1;  //Auf Adresse 0x183 weiterschalten
*inhalt_ptr=b;      //Inhalt 0x183 beschreiben
   
    
TX_ARET_on();

...
}


///////////////////////////////////////////////////////////////////////////
///Empfangsteil:
///////////////////////////////////////////////////////////////////////////


//in einem TRX24_RX_END Interrupt. Soll erstmal nur Länge des Empfangenen Frames wiedergeben.

void Read_received_Framelange(void);   
{
uint8_t ende=0;
ende = TST_RX_LENGTH;  //hier steht Länge des empf. Frames drin
lcd_gotoxy(0,1);
lcd_puts("TST_RX_Length: ");
lcd_puti(ende);
}


int main(void)
{
...
sei();  
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);
   |(1<<PLL_UNLOCK_EN);  //Interrupts aktivieren
}


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

PHY_CC_CCA=0x33;   //wähle Kanal 19 für receive

PLL_on();

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


while(1)
{
RX_AACK_on();
Read_received_Framelange();

...Wartezyklen, Restprogramm... etc...

}

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
Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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).

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.