Hallo,
im Powerdown (und allen Sleepmodi ausser Idle) funktionieren einige Interrupts nur als Levelinterrupt. Die Steuerung über Flanken geht dann nicht.
Carsten
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:
Wenn ich diese Zeile hier verwende: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 '------------------------------------------------------------------------------
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.
Schaut ruhig mal auf meiner Homepage vorbei:
http://kampis-elektroecke.de
Oder folge mir auf Google+:
Daniel Kampert
Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.
Gruß
Daniel
Hallo,
im Powerdown (und allen Sleepmodi ausser Idle) funktionieren einige Interrupts nur als Levelinterrupt. Die Steuerung über Flanken geht dann nicht.
Carsten
Hi,
danke für die Info. Ich teste es gleich mal.
Schaut ruhig mal auf meiner Homepage vorbei:
http://kampis-elektroecke.de
Oder folge mir auf Google+:
Daniel Kampert
Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.
Gruß
Daniel
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.
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).
Schaut ruhig mal auf meiner Homepage vorbei:
http://kampis-elektroecke.de
Oder folge mir auf Google+:
Daniel Kampert
Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.
Gruß
Daniel
Ich vermute jetzt mal, dass Du mit einem mega32 fährst. Vielleicht hilft der folgende Hinweis?... Als Mikrocontrollerboard nutze ich das RN-Control ...
Irgendwie sind Datenblätter doch informativ.Zitat von At mel - doc 2503Q–A V R–02/1, Seite 33, Power-down Mode
Und ich spar mir jetzt meinen Standardsatz mit dem letzten Abenteuer unserer Zeit ...
Ciao sagt der JoeamBerg
Ja stimmt schonhä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![]()
Schaut ruhig mal auf meiner Homepage vorbei:
http://kampis-elektroecke.de
Oder folge mir auf Google+:
Daniel Kampert
Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.
Gruß
Daniel
Ciao sagt der JoeamBerg
Schaut ruhig mal auf meiner Homepage vorbei:
http://kampis-elektroecke.de
Oder folge mir auf Google+:
Daniel Kampert
Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.
Gruß
Daniel
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)
......Anhang 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.
Ciao sagt der JoeamBerg
Lesezeichen