PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Frage zum Powerdown Modus



Kampi
05.03.2012, 17:39
Hallo Forum,

ich bastel gerade an dem Quellcode für meine Röhrenuhr.
Dieser sieht vor, dass der Prozessor sich nach dem abarbeiten des Hauptprogrammes schlafen legt.
Ich nutze bisher diesen Code:



'Mikrocontroller
$regfile = "m32def.dat"
$crystal = 16000000

'Stackgröße festlegen
$hwstack = 200
$swstack = 200

'UART konfigurieren
$baud = 19200

'TWI konfigurieren
Config Sda = Portc.1
Config Scl = Portc.0
Config Twi = 100000 'TWI Frequenz

'Interrups konfigurieren
Config Int0 = Falling

'DCF Modul konfigurieren
Config Dcf77 = Pind.2 , Timer = 1 , Timer1sec = 1 , Debug = 1

'Unterprogramme
Declare Sub Uhrzeit
Declare Sub Read_dcf

'Ports konfigurieren
Config Portb = Output

Portb = 0

'Variablen

'RTC
Dim Sekunde As Byte
Dim Minute As Byte
Dim Stunde As Byte
Dim Wochentag As Byte
Dim Tag As Byte
Dim Monat As Byte
Dim Jahr As Integer
Dim Ds1307w As Byte
Dim Ds1307r As Byte

'Interrupt
Dim Interruptflag As Byte

'Adresse der DS1307
Ds1307w = &HD0 'Schreibadresse der RTC
Ds1307r = &HD1 'Leseadresse der RTC

'Interrups aktivieren
Enable Interrupts
Enable Int0

On Int0 Read_rtc


Do

If Interruptflag = 1 Then
Uhrzeit
Portb = Sekunde
Interruptflag = 0
End If

Config Powermode = Powerdown

Loop
End

'------------------------------------------------------------------------------

Sub Uhrzeit
I2cstart 'TWI Start
I2cwbyte Ds1307w 'Übergabe der Slaveadresse
I2cwbyte 0 'Registerzähler wird auf null gesetzt

I2cstart 'Zweite Startkondition
I2cwbyte Ds1307r 'Übergabe der Leseadresse
I2crbyte Sekunde , Ack 'Auslesen des Sekundenregisters
I2crbyte Minute , Ack 'Auslesen des Minutenregisters
I2crbyte Stunde , Ack 'Auslesen des Stundenregisters
I2crbyte Wochentag , Ack
I2crbyte Tag , Ack 'Auslesen des Tagesregisters
I2crbyte Monat , Ack 'Auslesen des Monatsregisters
I2crbyte Jahr , Nack 'Auslesen des Jahresregisters
I2cstop 'TWI Stoppkondition


End Sub

'------------------------------------------------------------------------------

Sub Read_dcf

End Sub

'------------------------------------------------------------------------------

Read_rtc:
Interruptflag = 1
Return

'------------------------------------------------------------------------------


Wenn ich diese Zeile hier verwende:

Config Powermode = Idle

dann funktioniert das Programm einwandfrei. Der Controller legt sich schlafen und bei einer fallende Flanke am INT0 wird der Controller geweckt und ließt die RTC aus und gibt die Anzahl der Sekunden auf zwei Röhren wieder.
Wenn ich nun aber die Zeile auf

Config Powermode = Powerdown

umändere passiert gar nichts mehr. Die beiden Röhren zeigen 00 an. Laut Beschreibung in der Bascomhilfe soll ein externer Interrupt an INT0 oder INT1 den Controller wieder wecken. Mit dem Oszi hab ich schon geguckt. Der SQW-Pin von der RTC ändert weiterhin seinen Pegel, aber die Röhren zeigen nichts an.
Oder löscht dieser Powerdown-Modus auch das Bitmuster an den verschiedenen Ports, sodass an den Ports immer 0x00 steht?
Als Mikrocontrollerboard nutze ich das RN-Control.

Carry
05.03.2012, 18:44
Hallo,

im Powerdown (und allen Sleepmodi ausser Idle) funktionieren einige Interrupts nur als Levelinterrupt. Die Steuerung über Flanken geht dann nicht.


Carsten

Kampi
05.03.2012, 18:47
Hi,

danke für die Info. Ich teste es gleich mal.

Besserwessi
05.03.2012, 18:48
Zum Aufwachen aus dem Power down Modus geht Int0 nur in der Version die einen Interrupt bei low Level auslöst, nicht die Version mit CONFIG int0 = Falling. Alternativ geht auch int2.

Die Port Register bleiben im Powerdown Modus erhalten.

Kampi
05.03.2012, 18:59
Danke euch beiden. Hab es gerade getestet und Low-Level Interrupt funktioniert.
Naja gut dann muss ich halt den Idle Mode verwenden, da der Controller sonst ne halbe Sekunde lang die ISR abarbeitet und er das eigentlich nur 1x pro Interrupt machen soll (also quasi bei einer Flankenänderung).

oberallgeier
05.03.2012, 19:09
... Als Mikrocontrollerboard nutze ich das RN-Control ...Ich vermute jetzt mal, dass Du mit einem mega32 fährst. Vielleicht hilft der folgende Hinweis?


... Only an ... an External level interrupt on INT0 or INT1, or ... can wake up the MCU...
Note that if a level triggered interrupt is used ... the changed level must be held for some time to wake up the MCU. Refer to “External Interrupts” on page 66 for details...
When waking up from Power-down mode, there is a delay ... as described in “Clock Sources” on page 25 ...Irgendwie sind Datenblätter doch informativ.

Und ich spar mir jetzt meinen Standardsatz mit dem letzten Abenteuer unserer Zeit ...

Kampi
05.03.2012, 19:16
Ja stimmt schon ;) hätte da mal nachgucken sollen ^.^
Schade eigentlich...hätte eine andere Antwort lieber gehört :(
Muss der Controller halt im Idle Mode gesetzt werden statt im Power-Down :(

oberallgeier
05.03.2012, 19:39
... Muss der Controller halt im Idle Mode gesetzt werden statt im Power-Down ...Vielleicht tuts die knappst mögliche Start up time ? Wär ja nen Versuch wert ! ?
Ext. Crystal/Resonator Low Freq.; Start-up time: 1K CK + 0 ms

Immerhin ist der controller ja schon "warm" - könnte halt beim Kaltstart Probleme geben. Aber Versuch macht ... genau!

Kampi
05.03.2012, 19:46
Vielleicht tuts die knappst mögliche Start up time ?
Ext. Crystal/Resonator High Freq.; Start-up time: 16K CK + 0 ms
Wär ja nen Versuch wert ! ?

Ne funktioniert nicht.
Hab das Fusebit nun auf EXTHIFXTALRES_16KCK + 0ms gesetzt und den Sleepmode auf Power-down aber klappt nicht.
Was bedeutet es den wenn ich dieses Fusebit setze: EXTHIFXTALRES_1KCK + 0ms?
Was sagt das 1KCK bzw. 16KCK aus?

oberallgeier
05.03.2012, 20:23
... Was bedeutet ... Fusebit ... Was sagt das 1KCK bzw. 16KCK aus?Ext. Crystal/Resonator Low Freq.; Start-up time: 1K CK + 0 ms ist ja klar: Externer Quarz/Resonator niedriger Frequenz, Startzeit 1 K CK (K=Kilo/tausend, CK = ClocKs)

......21769

Das ist die ganze Tabelle. Die Zeit wird genommen, weil (vermutet oder durch Controller-tests nachgewiesen wird, dass) die ersten paar Takte noch nicht alle controllerinternen und anwenderspezifischen Baugruppen sauber laufen.

for_ro
05.03.2012, 21:07
... da der Controller sonst ne halbe Sekunde lang die ISR abarbeitet und er das eigentlich nur 1x pro Interrupt machen soll (also quasi bei einer Flankenänderung).
Wieso das?
Ich würde den Interrupt erst direkt vor dem PowerDown enablen oder auf low-level umschalten.
Beim Aufwachen dann direkt im ersten Interupt wieder disablen oder auf Falling setzen.

Kampi
05.03.2012, 21:20
Stimmt so würde das gehen. Ich probier das gleich mal.
Danke für den Hinweis :)

Kampi
05.03.2012, 22:00
Hab es probiert. Funktioniert nicht so. Oder ich hab nen Denkfehler gemacht...

for_ro
06.03.2012, 08:38
Hallo Daniel,
hast du daran gedacht, anstehende Interrupts erst einmal zu löschen, bevor du sie wieder enablest?
Vom letzten Aufwachen bleibt sonst sicher noch ein Flag stehen.

oberallgeier
06.03.2012, 09:08
... Controller ... schlafen und bei einer fallende Flanke am INT0 ... Controller geweckt ...
... anstehende Interrupts ... löschen...Vom letzten Aufwachen bleibt ... sicher noch ein Flag stehen.Hmmm, grübel. Ist mein Englisch jetzt so schlecht, dass ich wesentliche Passagen in der Dokumentation nicht verstehe?
... When an edge or logic change on the INT0 pin triggers an interrupt request ... flag is cleared when the interrupt routine is executed. Alternatively, the flag can be cleared ...

Kampi
06.03.2012, 09:11
Also ich hab die jetzt nicht nochmal händlich gelöscht, da es im Normalfall gemacht wird (sorgt der Bascom Compiler ja schon für).
Aber ich werd mich da nochmal morgen in aller Ruhe mit beschäftigen, da ich heute den ganzen Tag auf Achse bin und erst spät Abends wieder Zuhause ankomme.
Falls es trotzdem nicht funktionieren sollte ist auch nicht ganz so schlimm ;)
Aber btw eine Frage hab ich noch....
Man schreibt im Programm ja

Config Powermode = Powerdown

Dann läuft das Programm ja bis zum Powermode Befehl durch und danach wechselt der Controller in den Sleepmodus.
Wenn er wieder aufwacht, ab wo startet das Programm dann wieder? Ab der nächsten Zeile direkt unter dem "Config Powerdown" oder startet das Programm ganz neu oder wird nur die Do-Loop Schleife neu gestartet?
Ich bin nämlich davon ausgegangen das nur die Schleife neu gestartet wird.

Besserwessi
06.03.2012, 21:20
Nach dem Aufwachen fängt der Controller wie beim Idel mode mit dem Interrupt an und macht dann nach dem Config Powermode = Powerdown weiter.

Kampi
06.03.2012, 23:30
Gut. Dank dir für deine Antwort. Ich teste es dann morgen nochmal ;)

for_ro
07.03.2012, 18:03
Hmmm, grübel. Ist mein Englisch jetzt so schlecht, dass ich wesentliche Passagen in der Dokumentation nicht verstehe?
Hast du beachtet, dass es um LOW LEVEL Detection geht? Der Zustand besteht sicherlich noch, wenn die ISR beendet wird.
Und was wird dann passieren, wenn der Interrupt wieder freigegeben wird?

oberallgeier
07.03.2012, 18:55
Hast du beachtet, dass es um LOW LEVEL Detection geht ...Nee, warum?


... Controller legt sich schlafen und bei einer fallende Flanke am INT0 wird der Controller geweckt ...

Kampi
07.03.2012, 19:16
Also ich habs nun nochmal probiert und es will nicht funktionieren :/
Aber ist auch nicht ganz so wichtig :)
Der Idle Mode tut es auch.....geht ja nur darum das der Controller die meiste Zeit weniger Strom verbraucht während er auf den Impuls der RTC wartet.

Edit: Hab eh gesehen das ich noch einen Festspannungsregler verwende.....das ist natürlich super sinnfrei, wenn man bischen Energie sparen will und dann extra den Controller dafür schlafen legt und dann noch so was "schlechtes" wie einen Festspannungsregler verwendet.....

for_ro
07.03.2012, 20:16
Nee, warum?
Du hast sein Zitat von der Beschreibung des IDLE Modus genommen. Da kann er mit Flanke wecken.
Beim PowerDown geht nur Level Interrupt. Ich dachte das wäre klar.
Und da die RTC sicherlich nicht einen µs Low-Level ausgibt, steht der Low-Level nach dem Beenden der Aufweck ISR immer noch an. Dadurch wird das Interrupt Flag wieder gesetzt. Da er vorher aber Disable INT0 gemacht hat, passiert zunächst mal nichts, sondern der Controller arbeitet die Hauptschleife ab. Dann kommt der Enable INT0 und bevor der Powerdown Befehl ausgeführt wird, springt das Programm wieder in die ISR. Dies solange, wie der Low_level von der RTC kommt.