Forum: Mikrocontroller und Digitale Elektronik Interrupts und IEEE 802.15.4 MAC mit ZigBit900 bzw. STK600 + Atmega1281+RZ600 AT86RF212


von Markus K. (winny)


Angehängte Dateien:

Lesenswert?

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.
von Markus K. (winny)


Lesenswert?

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