PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 7 segment Anzeigen Uhr mit DS1307 und Bascom



mnsp2
02.01.2011, 00:13
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

'************************************************* ******************************
' 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

Cassio
02.01.2011, 00:27
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

mnsp2
02.01.2011, 13:30
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:

'************************************************* ******************************
'( 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

Cassio
02.01.2011, 14:25
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:


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:


'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

mnsp2
03.01.2011, 12:59
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:

'************************************************* ******************************
'( 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

dino03
03.01.2011, 19:49
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: :o :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

Cassio
03.01.2011, 20:05
.....
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:



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


Kannst es ja mal ausprobieren.

Grüße,
Cassio

mnsp2
04.01.2011, 00:32
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:



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

Markus Eisenberg
04.01.2011, 00:49
Hi,

probier doch mal folgendes:




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

caargoo
04.01.2011, 09:51
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

dino03
04.01.2011, 19:57
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

mnsp2
07.01.2011, 15:16
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:



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

HinterBlauenAugen
07.01.2011, 18:04
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