7 segment Anzeigen Uhr mit DS1307 und Bascom

mnsp2

Neues Mitglied
16. Aug. 2009
33
0
0
Sprachen
Hallo Zusammen
ich haben eine LED 7 Segment Anzeigen Uhr gebaut
ich habe die Uhr vorher mit dem internem RTC des Atmaga8 betrieben
jetzt möchte ich auf ein externen RTC umstellen
ich habe mit dem DS1307 noch wenig Erfahrung und benötige euren Hilfe

Kurz zu meiner Hardware:
Atmega8--> interner 8MHz
'Segment_a --> Portd.0
Segment_b --> Portd.1
Segment_c --> Portd.2
Segment_d --> Portd.3
Segment_e --> Portd.4
Segment_f --> Portd.5
Segment_g --> Portd.6
Segment_dp --> Portd.7
Ziffer_1 --> Portc.0
Ziffer_2 --> Portc.1
Ziffer_3 --> Portb.4
Ziffer_4 --> Portb.3
Ziffer_5 --> Portb.2
Ziffer_6 --> Portb.5
Sda vom DS1307 --> Portc.4
Scl vom DS1307 --> Portc.5

und hier ist Versuch den DS1307 zu intrigieren
Code:
'*******************************************************************************
'                       7 segment anzeigen Uhr mit DS1307
'*******************************************************************************

'**** µC Deklarationen ****
$regfile = "m8def.dat"
$crystal = 8000000

'****Variablen****
Dim Temp_ziffer As Byte                                     'welche ziffer soll bearbeitet werden

Dim Bcd_aus As Byte                                         'enthält den Wert der dez zahl die ausgegeben werden soll

Dim Weekday As Byte

Dim Sek_einer As Byte , Sek_zehner As Byte , Min_einer As Byte , Min_zehner As Byte , Std_einer As Byte , Std_zehner As Byte

Dim Datum_zaehler As Integer , Tag_zehner As Byte , Tag_einer As Byte , Monat_zehner As Byte , Monat_einer As Byte , Jahr_zehner As Byte , Jahr_einer As Byte


'****Ein-/Ausgänge****

Config Portd = Output                                       'Ddrd = &B11111111 -->  1 Ausgang, 0 Eingang
Config Portc = Output

Config Portb.0 = Output
Config Portb.1 = Output
Config Portb.2 = Output
Config Portb.3 = Output
Config Portb.4 = Output
Config Portb.5 = Output
Config Portb.6 = Input
Config Portb.7 = Input

Portb.6 = 1                               '1 = PullUp aktiviert Eingang (Taster gegen Masse)
Portb.7 = 1

Portd = &B00000000

Portc.1 = 0
Portc.0 = 0                                                 'Alle Ziffern AUS
Portb.2 = 0
Portb.3 = 0
Portb.4 = 0
Portb.5 = 0

'****Alias****:
Dezimalpunkt Alias Portc.2

Ziffer_2 Alias Portc.1
Ziffer_1 Alias Portc.0
Ziffer_6 Alias Portb.5
Ziffer_3 Alias Portb.4
Ziffer_4 Alias Portb.3
Ziffer_5 Alias Portb.2

'(Segment_a Alias Portd.0
Segment_b Alias Portd.1
Segment_c Alias Portd.2
Segment_d Alias Portd.3
Segment_e Alias Portd.4
Segment_f Alias Portd.5
Segment_g Alias Portd.6
Segment_dp Alias Portd.7
')
'****SUB****

'Declare Sub Min_stellen
'Declare Sub Std_stellen

'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    'Ds1307
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

' Einstellen der TWI (I2C) Schnittstelle in BASCOM
Config Sda = Portc.4
Config Scl = Portc.5
' Address des DS1307 $D0=schreiben $D1=lesen
Const Ds1307w = &HD0
Const Ds1307r = &HD1

' Einstellen der Datum-/Zeitfunktion in BASCOM dabei werden automatisch
' die Variablen _year,_month,_day,_hour,_min,_sec im BCD Format angelegt
Config Clock = User
' Datumsformat deutsch Tag.Monat.Jahr und als Trennzeichen den Punkt
Config Date = Dmy , Separator = .

'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
' Timer0 für Multiplexausgabe
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

On Timer0 7segment                                          'Interrupt-Routine für Timer0-Overflow
Config Timer0 = Timer , Prescale = 64                       'Takt: Quarz/Prescale  (möglich: 1, 8, 64, 256, 1024)
Enable Timer0                                               'Timer0-Overflow-Interrupt einschalten

'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
' Hauptprogramm
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

' ### Uhren Code ###
Do
                                                       'Start Hauptschleife
Dezimalpunkt = 1
'Debounce Pinb.6 , 0 , Min_stellen , Sub

'Debounce Pinb.7 , 0 , Std_stellen , Sub
Loop                                                        'Ende Hauptschleife


'( ### Uhr stellen ###
Sub Min_stellen
 Incr Min_einer
 Sek_einer = 0
 Sek_zehner = 0
End Sub
Sub Std_stellen
  Incr Std_einer
End Sub
')

'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
' Interrupt-Routine für Ziffer ausgabe im 7 Segmentcode
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

7segment:

 If Temp_ziffer = 6 Then Temp_ziffer = 0                    'bestimmt die auszugebende Ziffer (1 bis 4)
 Incr Temp_ziffer                                           'bei jedem aufruf des Lable wir eine andere Ziffer ausgegeben

 Portc.1 = 0
 Portc.0 = 0                                                'Alle Ziffern aus, ansonsten gibt es "Geister" Anzeigen
 Portb.2 = 0
 Portb.3 = 0
 Portb.4 = 0
 Portb.5 = 0

 Portd = &B00000000

 Select Case Temp_ziffer                                    'welche Ziffer soll angesteuert werden

   Case 1 : Ziffer_1 = 0                                    '6. Ziffer
            Ziffer_2 = 0
            Ziffer_3 = 0
            Ziffer_4 = 0
            Ziffer_5 = 0
            Ziffer_6 = 1

            If Std_zehner = 0 Then
               Bcd_aus = 10
               Ziffer_6 = 0
             Else
               Bcd_aus = Std_zehner
               Ziffer_6 = 1
            End If

   Case 2 : Ziffer_1 = 0                                    '5. Ziffer
            Ziffer_2 = 0
            Ziffer_3 = 0
            Ziffer_4 = 0
            Ziffer_5 = 1
            Ziffer_6 = 0
            Bcd_aus = Std_einer

   Case 3 : Ziffer_1 = 0                                    '4. Ziffer
            Ziffer_2 = 0
            Ziffer_3 = 0
            Ziffer_4 = 1
            Ziffer_5 = 0
            Ziffer_6 = 0
            Bcd_aus = Min_zehner

   Case 4 : Ziffer_1 = 0                                    '3. Ziffer
            Ziffer_2 = 0
            Ziffer_3 = 1
            Ziffer_4 = 0
            Ziffer_5 = 0
            Ziffer_6 = 0
            Bcd_aus = Min_einer

   Case 5 : Ziffer_1 = 0
            Ziffer_2 = 1                                    '2. Ziffer
            Ziffer_3 = 0
            Ziffer_4 = 0
            Ziffer_5 = 0
            Ziffer_6 = 0
            Bcd_aus = Sek_zehner

   Case 6 : Ziffer_1 = 1                                    '1. Ziffer
            Ziffer_2 = 0
            Ziffer_3 = 0
            Ziffer_4 = 0
            Ziffer_5 = 0
            Ziffer_6 = 0
            Bcd_aus = Sek_einer

 End Select

' *********** 7 Segmentcode - Tabelle *****************
' --A--
' |   |
' F   B
' |   |
' --G--
' |   |
' E   C
' |   |
' --D--

 Select Case Bcd_aus
                      'GFEDCBA
    Case 0 : Portd = &B0111111                              '0
    Case 1 : Portd = &B0000110                              '1
    Case 2 : Portd = &B1011011                              '2
    Case 3 : Portd = &B1001111                              '3
    Case 4 : Portd = &B1100110                              '4
    Case 5 : Portd = &B1101101                              '5
    Case 6 : Portd = &B1111101                              '6
    Case 7 : Portd = &B0000111                              '7
    Case 8 : Portd = &B1111111                              '8
    Case 9 : Portd = &B1101111                              '9
    Case 10 : Portd = &B0000000                             'leeres Feld (zur Nullstellenunterdrückung)
 End Select

Return

'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
'Get date time
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Getdatetime:
  I2cstart                                                  ' Start
  I2cwbyte Ds1307w                                          ' DS1307 schreiben
  I2cwbyte 0                                                ' DS1307 Adresszeiger auf 0 stellen

  I2cstart                                                  ' Start
  I2cwbyte Ds1307r                                          ' DS1307 lesen (ab vorher eingestellter Adresse 0)
  I2crbyte _sec , Ack                                       ' Sekunden
  I2crbyte _min , Ack                                       ' Minuten
  I2crbyte _hour , Ack                                      ' Stunden
  I2crbyte Weekday , Ack                                    ' Wochentag (in Dummy gelesen da von date$/time$ nicht genutzt)
  I2crbyte _day , Ack                                       ' Tag
  I2crbyte _month , Ack                                     ' Monat
  I2crbyte _year , Nack                                     ' Jahr
  I2cstop

  Sek_einer = _sec
  Sek_zehner = _sec
  Shift Sek_zehner , Right , 4
  Sek_einer = Sek_einer And &H0F
  Sek_zehner = Sek_zehner And &H0F
  Min_einer = _min
  Min_zehner = _min
  Shift Min_zehner , Right , 4
  Min_einer = Min_einer And &H0F
  Min_zehner = Min_zehner And &H0F
  Std_einer = _hour
  Std_zehner = _hour
  Shift Std_zehner , Right , 4
  Std_einer = Std_einer And &H0F
  Std_zehner = Std_zehner And &H0F
  Tag_zehner = _day
  Tag_einer = _day
  Shift Tag_zehner , Right , 4
  Tag_zehner = Tag_zehner And &H0F
  Tag_einer = Tag_einer And &H0F
  Monat_zehner = _month
  Monat_einer = _month
  Shift Monat_zehner , Right , 4
  Monat_zehner = Monat_zehner And &H0F
  Monat_einer = Monat_einer And &H0F
  Jahr_zehner = _year
  Jahr_einer = _year
  Shift Jahr_zehner , Right , 4
  Jahr_zehner = Jahr_zehner And &H0F
  Jahr_einer = Jahr_einer And &H0F

  _sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
  _day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
Return

Setdate:
  _day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
  I2cstart                                                  ' Start
  I2cwbyte Ds1307w                                          ' DS1307 schreiben
  I2cwbyte 4                                                ' DS1307 Adresszeiger auf 4 (Byte 5) stellen
  I2cwbyte _day                                             ' Tag schreiben
  I2cwbyte _month                                           ' Monat schreiben
  I2cwbyte _year                                            ' Jahr schreiben
  I2cstop
Return

Settime:
  _sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
  I2cstart                                                  ' Start
  I2cwbyte Ds1307w                                          ' DS1307 schreiben
  I2cwbyte 0                                                ' DS1307 Adresszeiger auf 0 stellen
  I2cwbyte _sec                                             ' Sekunden schreiben
  I2cwbyte _min                                             ' Minuten schreiben
  I2cwbyte _hour                                            ' Stunden schreiben
  I2cstop
Return

ich bitte um Hilfe

lg mnsp2
 
Hallo und Willkommen im AVR-Praxis Forum ! :ciao:

Ich habe zwar persönlich noch nicht mit der DS1307 Clock gearbeitet, aber in der BASCOM-Hilfe gibt es folgenden Hinweis:

See the datetime.bas example that shows how you can use a DS1307 clock chip for the date and time generation.


Schau doch mal in das angegebene Beispiel.....
Sollte es nicht vorhanden sein, gibt es im Ordner:
...\Programme\MCS Electronics\BASCOM-AVR\SAMPLES\I2C
sogar extra eine ds1307.bas ! ;)

Anschließend wäre es hilfreich, wenn du dein Problem genauer beschreiben würdest. Danach kann dir auch gezielter geholfen werden. :)


Grüße,
Cassio
 
Hallo Zusammen
danke für die schnelle Antwort

ich habe mir das ds1307.bas an gesehen

Frage zu ds1307.bas
was macht
$lib "mcsbyte.lbx"

Anschließend wäre es hilfreich, wenn du dein Problem genauer beschreiben würdest. Danach kann dir auch gezielter geholfen werden.
ja habe ich ganz vergessen zu schreiben

es mal ist es so das meine 7 Segment Anzeigen mit dem aktuellen Programm nicht anzeigt
aktuellen Programm:
Code:
'*******************************************************************************
'(                       7 segment anzeigen Uhr mit DS1307

Atmega8 - - > Interner 8mhz

Segment_a --> Portd.0           Ziffer_1 --> Portc.0           --A--
Segment_b --> Portd.1           Ziffer_2 --> Portc.1           |   |
Segment_c --> Portd.2           Ziffer_3 --> Portb.4           F   B
Segment_d --> Portd.3           Ziffer_4 --> Portb.3           |   |
Segment_e --> Portd.4           Ziffer_5 --> Portb.2           --G--
Segment_f --> Portd.5           Ziffer_6 --> Portb.5           |   |
Segment_g --> Portd.6           Dezimalpunkt-->Portc.2         E   C
Segment_dp --> Portd.7                                         |   |
                                                               --D-- o  <--DP
Sda vom DS1307 --> Portc.4
Scl vom DS1307 --> Portc.5

' 1111  2222     3333  4444     5555   6666
' 1  1  2  2  D  3  3  4  4  D  5  5   6  6
' 1111  2222     3333  4444     5555   6666
' 1  1  2  2  D  3  3  4  4  D  5  5   6  6
' 1111o 2222o    3333o 4444o    5555o  6666o
')

'*******************************************************************************

'**** µC Deklarationen ****
$regfile = "m8def.dat"
'$lib "mcsbyte.lbx"                                          ' for smaller code
$lib "ds1307clock.lib"
$crystal = 8000000
$framesize = 16
$hwstack = 24
$swstack = 16

'****Variablen****
Dim Temp_ziffer As Byte                                     'welche ziffer soll bearbeitet werden

Dim Bcd_aus As Byte                                         'enthält den Wert der dez zahl die ausgegeben werden soll

Dim Weekday As Byte

Dim Sek_einer As Byte , Sek_zehner As Byte , Min_einer As Byte , Min_zehner As Byte , Std_einer As Byte , Std_zehner As Byte

Dim Datum_zaehler As Integer , Tag_zehner As Byte , Tag_einer As Byte , Monat_zehner As Byte , Monat_einer As Byte , Jahr_zehner As Byte , Jahr_einer As Byte


'****Ein-/Ausgänge****

Config Portd = Output                                       'Ddrd = &B11111111 -->  1 Ausgang, 0 Eingang
Config Portc.0 = Output
Config Portc.1 = Output
Config Portc.2 = Output

Config Portb.0 = Output
Config Portb.1 = Output
Config Portb.2 = Output
Config Portb.3 = Output
Config Portb.4 = Output
Config Portb.5 = Output
Config Portb.6 = Input
Config Portb.7 = Input

Portd = &B00000000

Portc.1 = 0
Portc.0 = 0                                                 'Alle Ziffern AUS
Portb.2 = 0
Portb.3 = 0
Portb.4 = 0
Portb.5 = 0

'****Alias****:
Dezimalpunkt Alias Portc.2

Ziffer_2 Alias Portc.1
Ziffer_1 Alias Portc.0
Ziffer_6 Alias Portb.5
Ziffer_3 Alias Portb.4
Ziffer_4 Alias Portb.3
Ziffer_5 Alias Portb.2

'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    'Ds1307
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

' Einstellen der TWI (I2C) Schnittstelle in BASCOM
Config Sda = Portc.4
Config Scl = Portc.5
' Address des DS1307 $D0=schreiben $D1=lesen
Const Ds1307w = &HD0
Const Ds1307r = &HD1

' Einstellen der Datum-/Zeitfunktion in BASCOM dabei werden automatisch
' die Variablen _year,_month,_day,_hour,_min,_sec im BCD Format angelegt
Config Clock = User
' Datumsformat deutsch Tag.Monat.Jahr und als Trennzeichen den Punkt
Config Date = Dmy , Separator = .

'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
' Timer0 für Multiplexausgabe
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

On Timer0 7segment                                          'Interrupt-Routine für Timer0-Overflow
Config Timer0 = Timer , Prescale = 64                       'Takt: Quarz/Prescale  (möglich: 1, 8, 64, 256, 1024)
Enable Timer0                                               'Timer0-Overflow-Interrupt einschalten

'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
' Hauptprogramm
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

' ### Uhren Code ###
Do
                                                       'Start Hauptschleife
Dezimalpunkt = 1

Loop                                                        'Ende Hauptschleife


'### Uhr stellen ###


'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
' Interrupt-Routine für Ziffer ausgabe im 7 Segmentcode
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

7segment:

 If Temp_ziffer = 6 Then Temp_ziffer = 0                    'bestimmt die auszugebende Ziffer (1 bis 4)
 Incr Temp_ziffer                                           'bei jedem aufruf des Lable wir eine andere Ziffer ausgegeben

 Portc.1 = 0
 Portc.0 = 0                                                'Alle Ziffern aus, ansonsten gibt es "Geister" Anzeigen
 Portb.2 = 0
 Portb.3 = 0
 Portb.4 = 0
 Portb.5 = 0

 Portd = &B00000000

 Select Case Temp_ziffer                                    'welche Ziffer soll angesteuert werden

   Case 1 : Ziffer_1 = 0                                    '6. Ziffer
            Ziffer_2 = 0
            Ziffer_3 = 0
            Ziffer_4 = 0
            Ziffer_5 = 0
            Ziffer_6 = 1

            If Std_zehner = 0 Then
               Bcd_aus = 10
               Ziffer_6 = 0
             Else
               Bcd_aus = Std_zehner
               Ziffer_6 = 1
            End If

   Case 2 : Ziffer_1 = 0                                    '5. Ziffer
            Ziffer_2 = 0
            Ziffer_3 = 0
            Ziffer_4 = 0
            Ziffer_5 = 1
            Ziffer_6 = 0
            Bcd_aus = Std_einer

   Case 3 : Ziffer_1 = 0                                    '4. Ziffer
            Ziffer_2 = 0
            Ziffer_3 = 0
            Ziffer_4 = 1
            Ziffer_5 = 0
            Ziffer_6 = 0
            Bcd_aus = Min_zehner

   Case 4 : Ziffer_1 = 0                                    '3. Ziffer
            Ziffer_2 = 0
            Ziffer_3 = 1
            Ziffer_4 = 0
            Ziffer_5 = 0
            Ziffer_6 = 0
            Bcd_aus = Min_einer

   Case 5 : Ziffer_1 = 0
            Ziffer_2 = 1                                    '2. Ziffer
            Ziffer_3 = 0
            Ziffer_4 = 0
            Ziffer_5 = 0
            Ziffer_6 = 0
            Bcd_aus = Sek_zehner

   Case 6 : Ziffer_1 = 1                                    '1. Ziffer
            Ziffer_2 = 0
            Ziffer_3 = 0
            Ziffer_4 = 0
            Ziffer_5 = 0
            Ziffer_6 = 0
            Bcd_aus = Sek_einer

 End Select

' *********** 7 Segmentcode - Tabelle *****************
' --A--
' |   |
' F   B
' |   |
' --G--
' |   |
' E   C
' |   |
' --D--

 Select Case Bcd_aus
                      'GFEDCBA
    Case 0 : Portd = &B0111111                              '0
    Case 1 : Portd = &B0000110                              '1
    Case 2 : Portd = &B1011011                              '2
    Case 3 : Portd = &B1001111                              '3
    Case 4 : Portd = &B1100110                              '4
    Case 5 : Portd = &B1101101                              '5
    Case 6 : Portd = &B1111101                              '6
    Case 7 : Portd = &B0000111                              '7
    Case 8 : Portd = &B1111111                              '8
    Case 9 : Portd = &B1101111                              '9
    Case 10 : Portd = &B0000000                             'leeres Feld (zur Nullstellenunterdrückung)
 End Select

Return

'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
'Get date time
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Getdatetime:
  I2cstart                                                  ' Start
  I2cwbyte Ds1307w                                          ' DS1307 schreiben
  I2cwbyte 0                                                ' DS1307 Adresszeiger auf 0 stellen

  I2cstart                                                  ' Start
  I2cwbyte Ds1307r                                          ' DS1307 lesen (ab vorher eingestellter Adresse 0)
  I2crbyte _sec , Ack                                       ' Sekunden
  I2crbyte _min , Ack                                       ' Minuten
  I2crbyte _hour , Ack                                      ' Stunden
  I2crbyte Weekday , Ack                                    ' Wochentag (in Dummy gelesen da von date$/time$ nicht genutzt)
  I2crbyte _day , Ack                                       ' Tag
  I2crbyte _month , Ack                                     ' Monat
  I2crbyte _year , Nack                                     ' Jahr
  I2cstop

  Sek_einer = _sec
  Sek_zehner = _sec
  Shift Sek_zehner , Right , 4
  Sek_einer = Sek_einer And &H0F
  Sek_zehner = Sek_zehner And &H0F
  Min_einer = _min
  Min_zehner = _min
  Shift Min_zehner , Right , 4
  Min_einer = Min_einer And &H0F
  Min_zehner = Min_zehner And &H0F
  Std_einer = _hour
  Std_zehner = _hour
  Shift Std_zehner , Right , 4
  Std_einer = Std_einer And &H0F
  Std_zehner = Std_zehner And &H0F
  Tag_zehner = _day
  Tag_einer = _day
  Shift Tag_zehner , Right , 4
  Tag_zehner = Tag_zehner And &H0F
  Tag_einer = Tag_einer And &H0F
  Monat_zehner = _month
  Monat_einer = _month
  Shift Monat_zehner , Right , 4
  Monat_zehner = Monat_zehner And &H0F
  Monat_einer = Monat_einer And &H0F
  Jahr_zehner = _year
  Jahr_einer = _year
  Shift Jahr_zehner , Right , 4
  Jahr_zehner = Jahr_zehner And &H0F
  Jahr_einer = Jahr_einer And &H0F

  _sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
  _day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
Return

Setdate:
  _day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
  I2cstart                                                  ' Start
  I2cwbyte Ds1307w                                          ' DS1307 schreiben
  I2cwbyte 4                                                ' DS1307 Adresszeiger auf 4 (Byte 5) stellen
  I2cwbyte _day                                             ' Tag schreiben
  I2cwbyte _month                                           ' Monat schreiben
  I2cwbyte _year                                            ' Jahr schreiben
  I2cstop
Return

Settime:
  _sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
  I2cstart                                                  ' Start
  I2cwbyte Ds1307w                                          ' DS1307 schreiben
  I2cwbyte 0                                                ' DS1307 Adresszeiger auf 0 stellen
  I2cwbyte _sec                                             ' Sekunden schreiben
  I2cwbyte _min                                             ' Minuten schreiben
  I2cwbyte _hour                                            ' Stunden schreiben
  I2cstop
Return

meine Fragen und Probleme
1.
ist es richtig das ich von dem DS1307
die folgenden variablen am Beispiel "08:10:17 01.01.2011 SA " bekommen

_sec = 17 --> Größe Byte --> Format DEC
_min = 10 --> Größe Byte --> Format DEC
_hour =08 --> Größe Byte --> Format DEC
Weekday = ??? --> Größe Byte --> Format DEC
_day =01 --> Größe Byte --> Format DEC
_month = 01 --> Größe Byte --> Format DEC
_year = 11 --> Größe Byte --> Format DEC

und Bascom trägt dann die variablen in

Time$= "08:10:17" --> Größe String * 8
Date$ = "01.01.11" --> Größe String * 8

ein.

Bitte berichtigen was falsch ist !!!

2.
mein Problem ist jetzt um die Uhrzeit auf der 7 Segment Anzeigen darstellen zu konne brauche ich
Sek_einer As Byte , Sek_zehner As Byte , Min_einer As Byte , Min_zehner As Byte , Std_einer As Byte , Std_zehner As Byte

also wie mache ich das aus _sec, _min, _hour ---> Sek_einer, Sek_zehner, , Min_einer, Min_zehner, Std_einer , Std_zehner werden
 
Hallo mnsp2 !

Fein, dass du die "ds1307.bas" gefunden und du sie dir auch mal angesehen hast. ;)

Nun zu deiner ersten Frage:
Wie du in der Beispieldatei sehen kannst, werden alle übermittelten Werte mit "Makedec()" konvertiert.
Demnach wird alles im BCD-Format vom DS1307 übermittelt.... und im Programmcode dann in dezimale Werte konvertiert.

Das hast du also richtig erkannt.

Weiterhin stimmt auch, dass die Strings "Time$" und "Date$" von BASCOM selbst erzeugt werden.
Die einzelnen Bytes _sec, _min, _hour usw. kannst du aber direkt ändern und beeinflussen dann die Softclock.

Die Strings "Time$" und "Date$" ist also immer nur die formatierte Ausgabe der jeweiligen einzelnen Bytes.



Kommen wir nun zu Zweitens:
Natürlich kannst du dir die Mühe machen und die Byte-Variablen _sec, _min und _hour nutzen, um deine Uhrzeit auf den 7-Segmenten auszugeben.
Wie du aber schon bemerkt hast, musst du dann den Wert erst in zwei Ziffern zerlegen.
Beispiel:
13 Minuten = 1 Zehner-Minuten und 3 Einer-Minuten

Vielleicht ist es programmtechnisch nicht unbedingt effiktiver, aber wesentlich einfacher ist es mit dem fertigen String "Time$". ;)

Der String sieht z.B. so aus:
12:13:14
Nun wird genau das angegeben, was ja auch auf deinen 7-Segmenten zu sehen sein soll. :)
Da es sich um einen String handelt, kannst du mit dem Befehl "Mid()" die einzelnen Zeichen (z.B. Ziffern) aus dem String lösen und in einzelne Variablen speichern.
Allerdings solltest du eines beachten.....
Ich kann dir nicht sagen warum, aber du kannst "Time$" nicht direkt in Mid() verwenden! :eek:
Bevor du also den String zerlegst, musst du ihn kurz vorher in eine andere String-Variable kopieren.
Beispiel:
Code:
Dim Zeit As String  * 8
.
.
.
.
' Kurz vor dem "Zerlegen" und Übergeben an die 7-Segmente dann:
Zeit = Time$


Nach dem Beispiel von oben kannst du dann Mid() einsetzen:
Code:
'String Time$ = 12:13:14
'                            ||
'    Vierte Stelle-----  |
'      Fünfte Stelle-----

10_min = Mid(zeit , 4 , 1)
1_min = Mid(zeit , 5 , 1)
'                    |     |   |
'                    |     |   Nur eine Stelle verwenden
'                    |     Stelle im String
'                    Variable

Als Ergebnis hast du zwei Variablen mit den benötigten einzelnen Ziffern. :)

Dass du diese nun ggf. wieder in Bytes konvertieren musst (mit "Val()" ) oder direkt verwenden kannst, hängt von deinem Programm ab.
Anschließend "übersetzt" du die einzelnen Variablen zur Ansteuerung für deine 7-Segmente und.............. FERTIG. :D


Grüße,
Cassio
 
Hallo zusammen

So ein gute Antwort habe ich schon lange nicht mehr aus einem Forum bekommen
super erklärt !!! großes Kompliment an Cassio :adore:

ich möcht mich ganz herzlich bedanken

jetzt funktioniert es
Programm:
Code:
'*******************************************************************************
'(                       7 segment anzeigen Uhr mit DS1307
'*******************************************************************************

'Atmega8 - - > Interner 8mhz                                   --A--
'                                                              |   |
'Segment_a - - > Portd.0     Ziffer_1 - - > Portc.0          ' F   B
'Segment_b - - > Portd.1     Ziffer_2 - - > Portc.1          ' |   |
'Segment_c - - > Portd.2     Ziffer_3 - - > Portb.4          ' --G--
'Segment_d - - > Portd.3     Ziffer_4 - - > Portb.3          ' |   |
'Segment_e - - > Portd.4     Ziffer_5 - - > Portb.2          ' E   C
'Segment_f - - > Portd.5     Ziffer_6 - - > Portb.5          ' |   |
'Segment_g - - > Portd.6     Dezimalpunkt - - > Portc.2      ' --D-- o <--- DP
'Segment_dp - - > Portd.7                                    '
'                                                      '
'Sda Vom Ds1307 - - > Portc.4
'Scl Vom Ds1307 - - > Portc.5
'
' 1111  2222     3333  4444     5555   6666
' 1  1  2  2  D  3  3  4  4  D  5  5   6  6
' 1111  2222     3333  4444     5555   6666
' 1  1  2  2  D  3  3  4  4  D  5  5   6  6
' 1111o 2222o    3333o 4444o    5555o  6666o
')

'*******************************************************************************

'**** µC Deklarationen ****
$regfile = "m8def.dat"
$crystal = 8000000
$lib "mcsbyte.lbx"                                          ' for smaller code
$lib "ds1307clock.lib"


'****Variablen****
Dim Temp_ziffer As Byte                                     'welche ziffer soll bearbeitet werden

Dim Bcd_aus As Byte                                         'enthält den Wert der dez zahl die ausgegeben werden soll

Dim Weekday As Byte

Dim Sek_einer As Byte , Sek_zehner As Byte , Min_einer As Byte , Min_zehner As Byte , Std_einer As Byte , Std_zehner As Byte

Dim Zeit As String * 8

Dim 1_sek As String * 1
Dim 10_sek As String * 1

Dim 1_min As String * 1
Dim 10_min As String * 1

Dim 1_std As String * 1
Dim 10_std As String * 1

'****Ein-/Ausgänge****

Config Portd = Output                                       'Ddrd = &B11111111 -->  1 Ausgang, 0 Eingang

Config Portc.0 = Output
Config Portc.1 = Output
Config Portc.2 = Output

Config Portb.0 = Output
Config Portb.1 = Output
Config Portb.2 = Output
Config Portb.3 = Output
Config Portb.4 = Output
Config Portb.5 = Output
Config Portb.6 = Input
Config Portb.7 = Input

Portd = &B00000000                                          ' Alle Ssegment AUS

Portc.1 = 0
Portc.0 = 0                                                 'Alle Ziffern AUS
Portb.2 = 0
Portb.3 = 0
Portb.4 = 0
Portb.5 = 0


'****Alias****:
Dezimalpunkt Alias Portc.2

Ziffer_2 Alias Portc.1
Ziffer_1 Alias Portc.0
Ziffer_6 Alias Portb.5
Ziffer_3 Alias Portb.4
Ziffer_4 Alias Portb.3
Ziffer_5 Alias Portb.2

'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    'Ds1307
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

' Einstellen der TWI (I2C) Schnittstelle in BASCOM
Config Sda = Portc.4
Config Scl = Portc.5
' Address des DS1307 $D0=schreiben $D1=lesen
Const Ds1307w = &HD0
Const Ds1307r = &HD1

' Einstellen der Datum-/Zeitfunktion in BASCOM dabei werden automatisch
' die Variablen _year,_month,_day,_hour,_min,_sec im BCD Format angelegt
Config Clock = User
' Datumsformat deutsch Tag.Monat.Jahr und als Trennzeichen den Punkt
Config Date = Dmy , Separator = .

'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
' Timer0 für Multiplexausgabe
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

On Timer0 7segment                                          'Interrupt-Routine für Timer0-Overflow
Config Timer0 = Timer , Prescale = 64                       'Takt: Quarz/Prescale  (möglich: 1, 8, 64, 256, 1024)
Enable Timer0                                               'Timer0-Overflow-Interrupt einschalten
Enable Interrupts
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
' Hauptprogramm
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

' ### Uhren Code ###
Do

Zeit = Time$

1_sek = Mid(zeit , 8 , 1)
10_sek = Mid(zeit , 7 , 1)

1_min = Mid(zeit , 5 , 1)
10_min = Mid(zeit , 4 , 1)

1_std = Mid(zeit , 2 , 1)
10_std = Mid(zeit , 1 , 1)

Sek_einer = Val(1_sek)
Sek_zehner = Val(10_sek)

Min_einer = Val(1_min)
Min_zehner = Val(10_min)

Std_einer = Val(1_std)
Std_zehner = Val(10_std)

Dezimalpunkt = 1

Loop


'### Uhr stellen ###


'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
' Interrupt-Routine für Ziffer ausgabe im 7 Segmentcode
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

7segment:

 If Temp_ziffer = 7 Then Temp_ziffer = 0
 Incr Temp_ziffer

 Portc.1 = 0
 Portc.0 = 0                                                'Alle Ziffern aus, ansonsten gibt es "Geister" Anzeigen
 Portb.2 = 0
 Portb.3 = 0
 Portb.4 = 0
 Portb.5 = 0

 Portd = &B00000000

 Select Case Temp_ziffer                                    'welche Ziffer soll angesteuert werden

   Case 1 : Ziffer_1 = 0                                    '6. Ziffer
            Ziffer_2 = 0
            Ziffer_3 = 0
            Ziffer_4 = 0
            Ziffer_5 = 0
            Ziffer_6 = 1

            If Std_zehner = 0 Then
               Bcd_aus = 10
               Ziffer_6 = 0
             Else
               Bcd_aus = Std_zehner
               Ziffer_6 = 1
            End If

   Case 2 : Ziffer_1 = 0                                    '5. Ziffer
            Ziffer_2 = 0
            Ziffer_3 = 0
            Ziffer_4 = 0
            Ziffer_5 = 1
            Ziffer_6 = 0
            Bcd_aus = Std_einer

   Case 3 : Ziffer_1 = 0                                    '4. Ziffer
            Ziffer_2 = 0
            Ziffer_3 = 0
            Ziffer_4 = 1
            Ziffer_5 = 0
            Ziffer_6 = 0
            Bcd_aus = Min_zehner

   Case 4 : Ziffer_1 = 0                                    '3. Ziffer
            Ziffer_2 = 0
            Ziffer_3 = 1
            Ziffer_4 = 0
            Ziffer_5 = 0
            Ziffer_6 = 0
            Bcd_aus = Min_einer

   Case 5 : Ziffer_1 = 0
            Ziffer_2 = 1                                    '2. Ziffer
            Ziffer_3 = 0
            Ziffer_4 = 0
            Ziffer_5 = 0
            Ziffer_6 = 0
            Bcd_aus = Sek_zehner

   Case 6 : Ziffer_1 = 1                                    '1. Ziffer
            Ziffer_2 = 0
            Ziffer_3 = 0
            Ziffer_4 = 0
            Ziffer_5 = 0
            Ziffer_6 = 0
            Bcd_aus = Sek_einer

 End Select

' *********** 7 Segmentcode - Tabelle *****************
' --A--
' |   |
' F   B
' |   |
' --G--
' |   |
' E   C
' |   |
' --D--

 Select Case Bcd_aus
                      'GFEDCBA
    Case 0 : Portd = &B0111111                              '0
    Case 1 : Portd = &B0000110                              '1
    Case 2 : Portd = &B1011011                              '2
    Case 3 : Portd = &B1001111                              '3
    Case 4 : Portd = &B1100110                              '4
    Case 5 : Portd = &B1101101                              '5
    Case 6 : Portd = &B1111101                              '6
    Case 7 : Portd = &B0000111                              '7
    Case 8 : Portd = &B1111111                              '8
    Case 9 : Portd = &B1101111                              '9
    Case 10 : Portd = &B0000000                             'leeres Feld (zur Nullstellenunterdrückung)
 End Select

Return

'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
'Get date time
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Getdatetime:
  I2cstart                                                  ' Generate start code
  I2cwbyte Ds1307w                                          ' send address
  I2cwbyte 0                                                ' start address in 1307

  I2cstart                                                  ' Generate start code
  I2cwbyte Ds1307r                                          ' send address
  I2crbyte _sec , Ack
  I2crbyte _min , Ack                                       ' MINUTES
  I2crbyte _hour , Ack                                      ' Hours
  I2crbyte Weekday , Ack                                    ' Day of Week
  I2crbyte _day , Ack                                       ' Day of Month
  I2crbyte _month , Ack                                     ' Month of Year
  I2crbyte _year , Nack                                     ' Year
  I2cstop
  _sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
  _day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
Return

Setdate:
  _day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
  I2cstart                                                  ' Start
  I2cwbyte Ds1307w                                          ' DS1307 schreiben
  I2cwbyte 4                                                ' DS1307 Adresszeiger auf 4 (Byte 5) stellen
  I2cwbyte _day                                             ' Tag schreiben
  I2cwbyte _month                                           ' Monat schreiben
  I2cwbyte _year                                            ' Jahr schreiben
  I2cstop
Return

Settime:
  _sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
  I2cstart                                                  ' Start
  I2cwbyte Ds1307w                                          ' DS1307 schreiben
  I2cwbyte 0                                                ' DS1307 Adresszeiger auf 0 stellen
  I2cwbyte _sec                                             ' Sekunden schreiben
  I2cwbyte _min                                             ' Minuten schreiben
  I2cwbyte _hour                                            ' Stunden schreiben
  I2cstop
Return

eine Sache habe ich noch

Ist es möglich die Uhrzeit zu stellen ?
Es ist ja leider so das die Uhr nicht so super genau ist
also muss man sie auch nach und vor stellen können

und für die Dezimalpunkt benötige ich noch einen 1Hz Takt (blinken)
kann man Takt von dem DS1307 bekommen?

lg mnsp2
 
Hallo zusammen,

Wie du aber schon bemerkt hast, musst du dann den Wert erst in zwei Ziffern zerlegen.
Beispiel:
13 Minuten = 1 Zehner-Minuten und 3 Einer-Minuten

Vielleicht ist es programmtechnisch nicht unbedingt effiktiver, aber wesentlich einfacher ist es mit dem fertigen String "Time$". ;)

Der String sieht z.B. so aus:
12:13:14
Nun wird genau das angegeben, was ja auch auf deinen 7-Segmenten zu sehen sein soll. :)
Da es sich um einen String handelt, kannst du mit dem Befehl "Mid()" die einzelnen Zeichen (z.B. Ziffern) aus dem String lösen und in einzelne Variablen speichern.
Allerdings solltest du eines beachten.....
Ich kann dir nicht sagen warum, aber du kannst "Time$" nicht direkt in Mid() verwenden! :eek:
Bevor du also den String zerlegst, musst du ihn kurz vorher in eine andere String-Variable kopieren.
naja ... ok ... :eek: :eek: :rolleyes: von hinten durch die Brust ins Auge.
Der Weg ist für nen Anfänger evtl ja recht leicht zu verstehen aber dafür
erzeugt er auch um mindestens das 10fache mehr an Code als die direkte
Verarbeitung der numerischen Werte.

Die einzelnen Bytes _sec, _min, _hour usw. kannst du aber direkt ändern und beeinflussen dann die Softclock.
... und auch auslesen. Da die Werte bei einer Uhrzeit maximal zweistellig
werden können kann man sehr effektiven und kurzen Code erzeugen ...
1. Den Wert von einer Binärzahl in eine BCD-Zahl wandeln.
2. Die BCD-Zahl nach oberen und unterem Nibble trennen (4 Bits = 1 Nibble)
3. freuen da man jetzt schon die Einer und Zehner hat.
alles ohne den riesen Umweg über Strings und Mid$ und andere Text-
manipulationen. Aber dafür mit ein klein wenig nachdenken.

ich schreibe mal jeweils auch die Binäre und Hex-Schreibweise mit hin ...

Beispiel : 13 Uhr 45 und 20 Sekunden
13:45:20 ==>
_hour = 13 ---> Binär = &B0000_1101 , Hex = &H0D
_min = 45 ---> Binär = &B0010_1101 , Hex = &H2D
_sec = 20 ---> Binär = &B0001_0100 , Hex = &H14

jetzt die Wandlung in BCD-Format ...

Stunden ...
13 dez / &B0000_1101 / &H0D ==>BCD==> 19dez / &B0001_0011 / &H13

Minuten ...
45 dez / &B0010_1101 / &H2D ==>BCD==> 69 dez / &B0100_0101 / &H45

Sekunden ...
20 dez / &B0001_0100 / &H14 ==>BCD==> 32 dez / &B0010_0000 / &H20

Seht euch mal bei Wikipedia oder so an was BCD bedeutet ...
Jetzt der Trick ... man trennt oberes und unteres Nibble voneinander.
zB mit einer Bitschiebeoperation. Die gibts auch in Assembler und darum ist
sie sehr effizient zu kompilieren. Was man bekommt ist folgendes ...

Stunden ...
13 dez ==>BCD==> &B0001_0011 ==>Nibbles==> 0001 = 1 dez / 0011 = 3 dez

Minuten ...
45 dez ==>BCD==> &B0100_0101 ==>Nibbles==> 0100 = 4 dez / 0101 = 5 dez

Sekunden ...
20 dez ==>BCD==> &B0010_0000 ==>Nibbles==> 0010 = 2 dez / 0000 = 0 dez

verstanden ? :cool: Mit ein bischen Bitgepopel und hin und herschieben und
wandeln kann man sehr effizient eine zweistellige Dezimalzahl in Einer und
Zehner trennen.

Gruß
Dino
 
.....
eine Sache habe ich noch

Ist es möglich die Uhrzeit zu stellen ?
Es ist ja leider so das die Uhr nicht so super genau ist
also muss man sie auch nach und vor stellen können

und für die Dezimalpunkt benötige ich noch einen 1Hz Takt (blinken)
kann man Takt von dem DS1307 bekommen?

lg mnsp2


Hallo !

Natürlich kannst du deine DS1307 auch stellen.
Wirf doch dafür noch mal einen Blick in die oben schon erwähnte Beispieldatei "ds1307.bas" !

Dort steht auch drin, wie du die Uhr und das Datum einstellen kannst. ;)

Ob du vom DS1307 auch ein 1Hz Signal bekommst weiß ich leider nicht.
Es müsste aber möglich sein, dass du die "Sectic"-Routine mit angibst. :hmmmm:

Code:
config clock = user , Gosub = Sectic



Dies Sectic-Subroutine wird dann jede Sekunde aufgerufen.
In der Sub kannst du dann den Port für deine Doppelpunkte toggeln:

Code:
Sectic:
Toggle PORTx.y
Return

Kannst es ja mal ausprobieren.

Grüße,
Cassio
 
Hallo zusammen

Danke für die Idee von dino03

Stunden ...
13 dez ==>BCD==> &B0001_0011 ==>Nibbles==> 0001 = 1 dez / 0011 = 3 dez

Minuten ...
45 dez ==>BCD==> &B0100_0101 ==>Nibbles==> 0100 = 4 dez / 0101 = 5 dez

Sekunden ...
20 dez ==>BCD==> &B0010_0000 ==>Nibbles==> 0010 = 2 dez / 0000 = 0 dez

verstanden ?

was BCD ist weiß ich :D

versanden habe ich das :D (gut erklärt!!!:adore: )
aber wie man das in einen BASCOM Code um setzt da fehlen mir die Kenntnisse :cray:
vor allem wie man das mit dem Nibbles/Nybble machen soll

Es müsste aber möglich sein, dass du die "Sectic"-Routine mit angibst.


config clock = user , Gosub = Sectic


Dies Sectic-Subroutine wird dann jede Sekunde aufgerufen.
In der Sub kannst du dann den Port für deine Doppelpunkte toggeln:


Sectic: Toggle PORTx.y Return

habe ich getestet hat nicht funktioniert
scheint so das Sectic nicht angesprungen wird

Thema Stellen der Uhrzeit !

das ich die uhrzeit über
'Time$ = "22:35:00"
'Date$ = "03.01.11"
einstelle weiß ich ja

ich wollt die Uhrzeit über 2 Tester stellen :eek:

well sie wird in ein schönes Acrylglas Gehäuse eingebaut
und um sie dann NACH oder VOR stellen zu können ohne den PC in der Hosentasche zuhaben
brauche ich mindestens eine Taster zu VOR stellen

ich dachte das es vielleicht so funktioniert aber wie erwartet geht nicht :cray:
Code:
Config Portb.6 = Input
Config Portb.7 = Input

Portb.6 = 1
Portb.7 = 1

Declare Sub Vor_stellen
Declare Sub Nach_stellen

Do
.........


Debounce Pinb.6 , 0 , Vor_stellen , Sub

Debounce Pinb.7 , 0 , Nach_stellen , Sub

Loop


'### Uhr stellen ###
Sub Vor_stellen
 Incr _min
End Sub

Sub Nach_stellen
 Decr_min
End Sub
 
Hi,

probier doch mal folgendes:

Code:
Config Portb.6 = Input
Config Portb.7 = Input

Portb.6 = 1
Portb.7 = 1


Do
.........


Debounce Pinb.6 , 0 , Vor_stellen , Sub

Debounce Pinb.7 , 0 , Nach_stellen , Sub

Loop


'### Uhr stellen ###
Vor_stellen:
 Incr _min
Return

Nach_stellen:
 Decr _min
Return

Ein "Sub" am Ende des Debounce Befehles bewirkt einen Gosub-Befehl. Steht dort kein "Sub" wird ein Goto-Befehl ausgeführt.
Deine declarierten Subroutinen kannst Du nur mit "Call" aufrufen, was Debounce nicht kann.
Ist etwas verwirrend, da "Sub" eben nicht zu einer Sub springt.
Hinter "Decr" fehlte überigens ein Leeerzeichen.
Sollte so funzen.

Schönen Gruss
Markus
 
Hallo!

@mnsp2

Zu dieser Aussage:

habe ich getestet hat nicht funktioniert
scheint so das Sectic nicht angesprungen wird

Ein Auszug aus der Hilfe:

This option only works with the SOFT clock mode.
It does not work in USER mode.

In der Hilfe zu lesen kann helfen.

MfG
 
Hallo,

also folgendes für die Umwandlung ...

1. Dezimal in BCD wandeln ( geht mit MAKEBCD() )
2. Das untere Nibble ausmaskieren und als Einer speichern ( geht mit AND )
3. die oberen 4 Bits nach unten schieben ( geht mit SHIFT )
4. Wieder das untere Nibble ausmaskieren und als Zehner speichern (wieder AND )

und als Code ...

bcdzahl = MAKEBCD(dezimalzahl)
einer = bcdzahl AND &B0000_1111
SHIFT bcdzahl, Right, 4
zehner = bcdzahl AND &B0000_1111

so sollte es theoretisch funktionieren. Probier es mal aus ... :D

Gruß
Dino
 
Hallo Zusammen

ich habe jetzt das mit dem Stellen hin bekommen
auch eine Helligkeitssteuerung habe ich drin (abdunkeln in der Nacht) :)

Programm im Anhang

@ caargoo und Markus Eisenberg
danke für den hinweis
man muss wirklich häufiger in die BASCOM Hilfe rein sehen:)

woran ich jetzt schon eine Weile knoble ist
das ich möcht wann man den Stell Taster länger drückt (ca 1s) das dann sich die Minuten schnell VOR ober NACH stellen

kurzer tasterdruck --> Minuten +1
langer tasterdruck --> solange Minuten +1 bis Taster nicht mehr gedrückt


Problem ist es jetzt wie man denn langen Tastendruck erfasst ohne das man das Hauptprogamm unterbricht oder warten läst
vielleicht hat jemand ein Idee wie man das mit dem langen Tastendruck machen kann

aktueller Versuch:

Code:
Do
....

Debounce Pinb.6 , 0 , Vor_stellen , Sub

If Pinb.6 = 0 Then
   Wait 1
    If Pinb.6 = 0 Then
       Gosub Vor_stellen
       Lagerdruck_vor = 1
    Else
       Langerdruck_vor = 0
    End If
Else
   Langerdruck_vor = 0
End If

......



Loop


'### Uhr stellen ###

Vor_stellen:
 Incr _min
 _sec = 00

 If Min_zehner >= 5 And Min_einer >= 9 Then
   _min = 00
   Incr _hour
 End If

 If Std_zehner >= 2 And Std_einer >= 3 And Min_zehner >= 5 And Min_einer >= 9 Then
   _hour = 00
   _min = 00
 End If

 Gosub Settime

 If Pinb.6 = 0 And Langerdruck_vor = 1 Then
 Goto Vor_stellen
 End If
Return
 

Anhänge

  • uhr Josi mit DS1307 mit LDR v0.3.4.bas
    11,7 KB · Aufrufe: 69
Hallo mnsp2,
du hast doch einen schnell laufenden Timer fürs Multiplexen.
Den würde ich benutzen um festzustellen, dass der PinB.6 länger als eine Sekunde auf 0 liegt.
Dazu rechnest du einfach aus, wieviele Überläufe der Timer in der Sekunde macht. In der ISR des Timers überprüfst du den Pin und erhöhst einen Zähler, wenn der Pin 0 ist. Ist er 1, setzt du den Zähler auf 0. Erreicht der Zähler den ausgerechneten Wert, ist eine Sekunde erreicht und du setzt ein Flag, dass der Minutenwert in der main Loop entsprechend geändert wird. Gleiches für den anderen Taster. In der ISR verringerst du den Wert des Zählers um einen Betrag, der der Wartezeit bis zum nächsten Ändern entspricht.
In der Timer ISR kostet dich das recht wenig Zeit, sodass das Multiplexen weiterhin funktioniert.

HBA
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)