Hallo zusammen,
ich versuche gerade den Atmel IEEE 802.15.4 MAC Stack 2.7.1 an einem
USB-Dongle (RT232RL) mit ZigBit 900 über UART1 zum laufen zu bekommen,
insbesondere das MAC Beispiel Promiscious Mode. Soweit habe ich eine
eigene PAL Konfigration erstellt. Jetzt bleibt aber die
Beispielapplikation hängen und zwar in der Funktion set_trx_state() in
der Datei MAC_v_2_7_1\TAL\AT86RF212\Src\tal.c. (Siehe angehängtes Bild)
Hier wird
ENTER_CRITICAL_REGION();
ENABLE_GLOBAL_IRQ();
...
while (!tal_awake_end_flag);
auf gerufen, wobei mit ENTER_CRITICAL_REGION(); der Zustand aller
Interrupts gespeichert und angehalten werden (define
ENTER_CRITICAL_REGION() {uint8_t sreg = SREG; cli()). Mit
ENABLE_GLOBAL_IRQ() wird einfach ein sei() ausgeführt, damit die
Interrupts wieder weiterlaufen. Das klappt aber nur wenn ich hier eine
Pause von 6 ms reinbaue
ENTER_CRITICAL_REGION();
sleep_ms(6);
ENABLE_GLOBAL_IRQ();
...
while (!tal_awake_end_flag);
Sonst hängt das ganze, weil die Interruptroutine das tal_awake_end_flag
nicht setzt, also läuft wohl der entsprechende ISR nicht.
Das verstehe ich schon nicht, warum das nur funktioniert, wenn ich da 6
ms Wartezeit reinbaue.
Zusätzlich habe ich auch das STK 600 mit einem RZ600 AT86RF232 nach
selbiger Portkonfiguration eingerichtet, womit es ja identisch mit dem
ZigBit Chip sein müsste. Hier hängt es aber überhaupt nicht. Beides
läuft übrigens auf 8Mhz interner Takt ohne DIV/8-Fuse gesetzt.
Bin da wirklich ratlos. Für Ideen und Ratschläge wär ich dankbar.
Jetzt lässt sich der ZigBit Chip nicht mehr vernünftig flashen. Beim verifizieren sagt mir AVR Studio jetzt immer einen Fehler. Ging von ein auf das andere Mal nicht mehr. Keine Kabel umgesteckt oder sonst was gemacht, vielleicht hatte auch der ZigBit900 Chip zusätzlich noch ein Problem. Muss jetzt erstmal ein neues Modul basteln oder den Chip wechseln. Nichtsdestotrotz ist da irgenwo ein Interruptproblem. Wenn ich das wpan sich initialisieren lasse funktioniert auch die Interruptroutine ISR vom UART1_TX nicht mehr, selbst wenn ich noch mal explizit printf("test"); UCSR1B = (1 << TXEN1) | (1 << TXCIE1); sei() while(1){ PORTE^=(1<<PE0); _delay_ms(5); } aufrufe. Die LED an Port PE0 blinkt übrigens, es wird aber nur der erste Buchstabe angezeigt, dann hängt es. Wenn ich davor den wpan_init() Aufruf auskommentiere geht es. Was kann den das für einen Grund haben? Ich vermute mal ein anderer Interrupt mischt sich da ein, sonst könnte ich mir das nicht erklären. Gibt es da eine gute Möglichkeit das rauszukriegen?
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.
