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.
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.