Forum: HF, Funk und Felder Mit ATmega128RFA1 in Sleep Mode gehen (deRFdevelopmentKit mega128)


von Adam D. (addr)


Lesenswert?

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
von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von Adam D. (addr)


Lesenswert?

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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von Adam D. (addr)


Lesenswert?

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