Hallo, ich beschäftige mich von der Uni aus schon seit 3Monaten mit dem Development Kit von Deresden Elektronik. deRFdevelopmentKit mega128 siehe: http://www.dresden-elektronik.de/shop/prod64.html Es soll am Ende daraus eine kleine Projektarbeit werden. Mit Sensoren die Daten zum Koordinator senden. Da ich davor nur 1Semester lang Mikrocontroller Erfahrung im Digitaltechnik Labor sammeln konnte, würde ich mich jetzt nicht unbedingt als Mikrocontroller-Spezialist ansehen. Also habt bitte gedult mit mir ;) Zu meinem Problem: Ich habe einen Sender(ATmega128RFA1) der nicht schlafen will. Ich versuche alle 5sekunden einen Temperaturwert auszulesen,zu senden und dann in den Save-Sleep-Mode für die weiteren 5sekunden zu wechseln. usw... (Save-Sleep-Mode deshalb, da ich noch den Timer am laufen habe) Um es mir etwas leichter zu machen, habe ich ein schon bestehendes Beispiel Program(Wireless_UART) genommen und etwas umgeschrieben, damit das tut was ich schon oben beschrieben habe. Was ich bisher geschaft habe: -Temperatur Werte Senden und am Koordinator Empfangen. -Timer hinzugefügt und das Senden auf alle 5sekunden beschränkt, anstatt dauer senden. Funktioniert alles wunderbar. Jedoch in Sleep-Mode komme ich nicht. In meinem Programm ausschnitt habe ich ein Test PORTB, das ständig 1,0,1,0,1,0... ausgibt eingefügt. Wenn Sleep-Mode aktiv, bleibt der Test PORTB auf 0 und wartet bis der Timer wieder abläuft. (Das hat glaube ich unter den Mikrocontroller-Spezialisten einen bestimmten Namen und scheint ein sehr häufig verwendeter Indikator zu sein) So ist nach ablauf des Timers ein kurzer Impuls des PORTB auf dem Oszi zu sehen, wo das Programm seine Temperatur rechnung durchführt. Theoretisch und laut meinem Oszi(Tektronix TDS 5034), scheint mein Sender in den Sleep-Mode zu gehen. !!!ABER!!! Leider sagt der Multimeter(FLUKE 8846A) etwas anderes. Mein Sender soll im Sleep-Mode angeblich zwischen 16 und 19mA verbrauchen. Im Datenblatt steht aber was von 2uA. Von einem Bekannten hab ich ein Tip bekommen, das es am JTAG liegen würde und ich es mal ausschalten sollte. Nachdem ging der Sleep-Mode leider immernoch nicht, ausserdem war damit mein Funkmodul auch nicht mehr ansteuerbar geworden. (Was mein zweites Problemm noch anspricht) Über STK500 am ISP Anschluss hab ich es dann versucht das JTAG wieder einzuschalten, aber irgendwie geht das ISP auch nicht. Auch bei den Funkmodulen, wo der JTAG noch an ist. Das war eine neue Entdeckung für mich, da ich bisher nur mit dem AVR JTAGICE mkII programmiert habe. Also... wie lege jetzt ich meinen ATmega128RFA1 am besten schlafen? Und ganz nebenbei, wie bekomme ich das JTAG wieder an? :D Und wozu die ISP schnittstelle da, wenn es garnicht geht? ********************************************************** Ausschnitt aus meinem Programm: int main(void) { ... DDRB |= 0x01; //Test PORTB (als Ausgang setzen) ... /* Endless while loop */ while ( 1 ) { ... pal_timer_start(TIMER_TEMP, 5000000, TIMEOUT_RELATIVE, (FUNC_PTR)app_task, NULL); PORTB = 0x01; //Test PORTB Ein EICRB = 0x00; //LOW LEVEL set_sleep_mode(SLEEP_MODE_PWR_SAVE); sleep_mode(); PORTB = 0x00; //Test PORTB Aus } } ********************************************************** Nach meiner einschätzung glaube ich etwas von dem "Wireless_UART" Beispiel Program übernommen zu haben, dass das schlafen unmöglich macht. Leider habe ich keine ahnung was und wo es im Programm sein könnte. Über andere Lösungswege und Erfahrungen mit dem Development Kit würde ich mich freuen. Wünsche allen noch eine schöne vor Weihnachtszeit Adam
:
Verschoben durch Moderator
Adam D. schrieb: > Leider sagt der Multimeter(FLUKE 8846A) etwas anderes. Mein Sender > soll im Sleep-Mode angeblich zwischen 16 und 19mA verbrauchen. Im > Datenblatt steht aber was von 2uA. Du hast zwei verschiedene Baugruppen, die du (weitestgehend voneinander unabhängig) schlafen legen musst. Das ist einerseits der Transceiver (wobei dessen Ruhestromverbrauch, solange er nicht im PLL_ON oder RX_ON ist, nur bei ca. 400 µA für den 16-MHz- Quarzoszillator beträgt), andererseits die CPU selbst. Außerdem musst du natürlich drauf achten, dass nichts, was an den Pins außen angeschlossen ist, während der Schlafphase Strom zieht, denn die behalten natürlich das Potenzial, das sie vor dem Schlaf hatten. > Von einem Bekannten hab ich ein Tip bekommen, das es am JTAG liegen > würde und ich es mal ausschalten sollte. Es genügt, wenn du die OCDEN-Fuse deaktivierst. Dies sollte man allerdings in der Tat tun, denn andernfalls geht der Hauptoszillator des Controllers nicht aus. > Nachdem ging der Sleep-Mode > leider immernoch nicht, ausserdem war damit mein Funkmodul auch nicht > mehr ansteuerbar geworden. Aua. JTAG deaktiviert man möglichst nicht via Fuse, sondern via JTD-Bit im MCUCSR ... > Über STK500 am ISP Anschluss hab ich es dann versucht das JTAG > wieder einzuschalten, aber irgendwie geht das ISP auch nicht. Die ISP-Pins am ATmega128RFA1 unterscheiden sich von denen des ATmega1281, daher musst du dort ggf. mal mit der Hand die entsprechenden Pins am Port B (für MOSI und MISO) verdrahten. Danach sollte dein ISP funktionieren, und du kannst dir die JTAG-Fuse wieder einschalten damit. (Das Sensor-Terminal-Board, auf dem deine Module sind, war ursprünglich für RCBs gebaut worden, auf denen ein ATmega1281 werkelte. Dummerweise ist wohl der Unterschied in den ISP-Leitungen dann bei Bau des RCBs mit dem ATmega128RFA1 nicht bemerkt worden.) > wie lege jetzt ich meinen ATmega128RFA1 am besten schlafen? Indem du Stück für Stück mit Testcode arbeitest. ;-) Ich fürchte, das mit dem ganzen dicken MAC auf einmal zu erschlagen, ist nicht ganz unaufwändig. Ich würde an deiner Stelle (vorsicht, Eigenwerbung) mit µracoli ins Rennen gehen. Vorher jedoch teste erstmal, dass du mit einer minimalen Firmware überhaupt beide Baugruppen in den Schlaf bekommst. Beim Transceiver musst du dazu nur im TRXPR das Bit SLP_TR setzen (der Transceiver befindet sich ja initial im TRX_OFF, aus dem er in den Schlaf gehen kann), bei der CPU musst du den power-save Sleepmode setzen und dann einen SLEEP-Befehl absetzen. Beachte auch, dass offene Eingänge Gift sind, wenn man Strom sparen will: ganz schnell koppeln diese irgendwelche Störungen von der Außenwelt ein, und dann "klappert" die Pin-Eingangs-Logik hin und her, wobei sie Strom zieht. Alle unbenutzten Pins sollte man daher auf low ziehen oder die Pullups einschalten.
Vielen Dank Jörg, für die schnelle und ausführliche antwort, ich gehe sie grade Punkt für Punkt durch. Das ich bei einem Singel-Chip sowohl Mikrocontroller, als auch Transceiver schlafen legen muss, hätte ich auch selber besser wissen müssen. Nochmals vielen dank
Adam D. schrieb: > Das ich bei einem Singel-Chip sowohl Mikrocontroller, als auch > Transceiver schlafen legen muss, hätte ich auch selber besser wissen > müssen. Ja, man muss halt dran denken, das da letztlich zwei getrennte ICs miteinander verheiratet worden sind.
Super er schläft!!! und das viel einfacher als ich gedacht habe. So hab ich´s gemacht: -Alle unbenutzten Pins auf low (so wie du schon gesagt hast) -um auf nummer sicher zu gehen hab ich auch noch meinen "Test Port" ausgeschaltet -und dann noch das hinzugefügt ***************************************** ... tal_trx_sleep(SLEEP_MODE_1); // ***NEU*** set_sleep_mode(SLEEP_MODE_PWR_SAVE); sleep_mode(); ... ***************************************** Jetzt verbraucht er nur noch zwischen 1,6µA und 2µA Und nochmals vielen Dank :-)
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.