Hallo
Ich versuche mich gerade etwas in Sachen I2C und Bascom
meine Plan ist es eine Kleinen Mega zunutzen um mir eine Zeit auf ein 7 Segment Display anzeigen zulassen, zusätzlich noch die Temp mit einem/zwei DS1820b und dies in ein Moped einzubauen das ich beim fahren immer eine Zeit habe sowie die Temperatur
Ich habe mir eine RTC 1307 geholt diese ist nach DCF-77 gestellt dies geht soweit ganz gut.
zusätztlich habe ich mir ein TM1637 geholt ( habe schon gelesen das das nicht so einfach sein soll aber es funktioniert es zeigt mir die Zeit an welche es über DCF-77 bekommt und auch die Temperaturen der DS1820b Sensoren. Soweit sogut.
Also beide Programme einzeln funktionieren super.
wie bekomme ich es jetzt hin das ich beide I2C teile in ein Programm bekomme. Habe im Forum nicht wirklich was gefunden. oder soll ich mir ein andere 7-Segment Display besorgen wenn welches.
CodeBox BascomAVR
das ist mein Teil für die RTC
Und hier der Teil für da TM1637
CodeBox BascomAVR
habe halt irgenwie bei der Adressierung der der Teile ein Problem denk ich aber für das Display habe ich halt keine Adresse raus bekommen weder im netz noch lässt sich eine auslesen. Da denke ich wird schon das ganze sein oder habt ihr da eine andere Idee.
Habe zwar schon ein Paar Sachen programmiert aber bin trotzdem noch ein blutiger Anfänger.
Würde mich über Tipps freuen
Ich versuche mich gerade etwas in Sachen I2C und Bascom
meine Plan ist es eine Kleinen Mega zunutzen um mir eine Zeit auf ein 7 Segment Display anzeigen zulassen, zusätzlich noch die Temp mit einem/zwei DS1820b und dies in ein Moped einzubauen das ich beim fahren immer eine Zeit habe sowie die Temperatur
Ich habe mir eine RTC 1307 geholt diese ist nach DCF-77 gestellt dies geht soweit ganz gut.
zusätztlich habe ich mir ein TM1637 geholt ( habe schon gelesen das das nicht so einfach sein soll aber es funktioniert es zeigt mir die Zeit an welche es über DCF-77 bekommt und auch die Temperaturen der DS1820b Sensoren. Soweit sogut.
Also beide Programme einzeln funktionieren super.
wie bekomme ich es jetzt hin das ich beide I2C teile in ein Programm bekomme. Habe im Forum nicht wirklich was gefunden. oder soll ich mir ein andere 7-Segment Display besorgen wenn welches.
CodeBox BascomAVR
'RTC 1307 auslesen nur Uhrzeit $regfile = "m32def.dat" 'Atmega32 $crystal = 16000000 '16MHZ $hwstack=40 $swstack=16 $framesize=32 'Display einstellen Config Lcd = 16 * 4 Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , _ Db7 = Portd.7 , E = Portd.2 , Rs = Portd.3 Initlcd Cls 'Display beleuchtung einschalten Config Timer0 = Pwm , Compare Pwm = Clear up , Prescale = 256 Config Portb.3 = Output OCR0 = 250 CONFIG CLOCK = soft Enable Interrupts 'I2C einstellen SCL = Port C.0 und SDA = Port C.1 Config Scl = Portc.0 Config Sda = Portc.1 Dim Sekunde As Byte Dim Minute As Byte Dim Stunde As Byte Dim Ds1307w As Byte Dim Ds1307r As Byte Ds1307w = &B11010000 Ds1307r = &B11010001 Declare Sub auslesen Do Locate 1 , 1 Lcd Time$ Call Auslesen 'Auslesen starten Loop End 'Uhrzeit aus RTC auslesen ohne Datum nur Zeit SUB Auslesen _Sec = Makedec(sekunde) _min = Makedec(minute) _hour = Makedec(stunde) I2cstart I2cwbyte Ds1307w I2cwbyte 0 I2cstop I2cstart I2cwbyte Ds1307r I2crbyte Sekunde , Ack I2crbyte Minute , Ack I2crbyte Stunde , Nack I2cstop END SUB Auslesen
das ist mein Teil für die RTC
Und hier der Teil für da TM1637
CodeBox BascomAVR
$Regfile="m32def.dat" $Crystal=16000000 $hwstack=40 $swstack=16 $framesize=32 config Portc.0 = output config Portc.1 = output Clk Alias Portc.0 Dio_set Alias Portc.1 Dio_out Alias Portc.1 Dio_in Alias Pinc.1 Match_rom Alias &H55 Skip_rom Alias &HCC Auslesen Alias &HBE Messen Alias &H44 DdrA = &B0000000 Declare Sub Tm1637_wrbyte(byval Bajt As Byte) declare Sub Tm1637_start declare Sub Tm1637_ack declare Sub Tm1637_stop Declare Sub Funkuhr declare Sub Einzelzeit Declare Sub Tempmessung Config Dcf77 = PinB.0 , Timer = 1 , Debug = 1 , Check = 1 , Inverted = 0 , Gosub = Sectic 'Tempvariable Dim T10 As Integer , T20 As Integer 'für min max berechnung dim einerT1 as byte , einerT2 as byte , zehnT1 as byte , zehnT2 as byte dim ceinerT1 as byte , ceinerT2 as byte , czehnT1 as byte , czehnT2 as byte Dim Ds1820id(16) As Byte , Sc(9) As Byte 'Anzahle sensoren 8 = 1 16 = 2 , 24 = 3 , 32 = 4 ,40 = 5 , 48 = 6 , 54 = 7 Dim I As Byte Dim Dgc As Integer Dim T1 As Integer , T2 As Integer 'Uhr Variable Dim temp as byte Dim Dezimalziffern(4) as byte Dim Zehnerh as byte , zehnermin as byte Dim einerh as byte , Einermin as byte , Einerhpunkt as byte Dim Zehnerhzeit as Byte , Einerhzeit as byte , Zehnerminzeit as byte , Einerminzeit as byte Dim Takt as byte , Takt_alt as byte Dim Punktzeit as byte call Tm1637_start Call Tm1637_wrbyte(&H89) ' Hex 80=off; Hex 88= 1/16 brightness to Hex 8F = Maximun Brightness call Tm1637_ack call Tm1637_stop Enable Interrupts Config 1WIRE = PortA.6 '1Wire-Port festlegen war mal Port C.1 Declare Function Decigrades18b20(byval Sc(9) As Byte) As Integer 'für DS18b20 ( China Sensoren ) Restore Sensor_ids For I = 1 To 17 Read Ds1820id(i) Next I 1wreset 1wwrite Skip_rom 1wwrite Messen Do If Punktzeit >= 2 then Punktzeit = 0 Call einzelzeit 'Funkuhr / Zeitberechnungsunterprogramm starten Call Tempmessung 'Zeit Anzeige Zehnerhzeit = Lookup(zehnerh , Ziffern_pattern) 'Lookup holt aus den Daten unter Ziffern_pattern aus Tabelle If Punktzeit = 1 then Einerhzeit = Lookup(einerh , Ziffern_pattern) 'Doppelpunkt blinkenlassen If Punktzeit = 0 then Einerhzeit = Lookup(einerhpunkt , Ziffern_pattern) 'Doppelpunkt blinkenlassen Zehnerminzeit = Lookup(zehnermin , Ziffern_pattern) 'Lookup holt aus den Daten unter Ziffern_pattern aus Tabelle Einerminzeit = Lookup(einermin , Ziffern_pattern) 'Lookup holt aus den Daten unter Ziffern_pattern aus Tabelle 'Temp Anzeige czehnT1 = Lookup(ZehnT1 , Ziffern_pattern) ceinerT1 = Lookup(einerT1 , Ziffern_pattern) czehnT2 = Lookup(ZehnT2 , Ziffern_pattern) ceinerT2 = Lookup(einerT2 , Ziffern_pattern) 'Zeit Anzeige If _Sec <20 or _Sec >= 50 then 'Hier wird die Zeit angezeigt call Tm1637_start Call Tm1637_wrbyte(&H40) 'Data instruction set Hex44 write one byte to register (data write mode set) autoincrement adress mode call Tm1637_ack call Tm1637_stop ' call Tm1637_start Call Tm1637_wrbyte(&Hc0) 'addres instruction setting, first digit (HexC0) MSB display Call Tm1637_ack 'erste Stelle Call Tm1637_wrbyte(Zehnerhzeit) Call Tm1637_ack 'zweite Stelle Call Tm1637_wrbyte(Einerhzeit) Call Tm1637_ack 'dritte Stelle Call Tm1637_wrbyte(Zehnerminzeit) Call Tm1637_ack ' Gosub 'vierte Stelle Call Tm1637_wrbyte(Einerminzeit) Call Tm1637_ack Call Tm1637_stop End if 'Temp1 Anzeige If _Sec >=20 and _sec < 35 then 'We want to display 1234 call Tm1637_start Call Tm1637_wrbyte(&H40) 'Data instruction set Hex44 write one byte to register (data write mode set) autoincrement adress mode call Tm1637_ack call Tm1637_stop ' call Tm1637_start Call Tm1637_wrbyte(&Hc0) 'addres instruction setting, first digit (HexC0) MSB display call Tm1637_ack 'erste Stelle Call Tm1637_wrbyte(czehnT1) 'Digit 1; showing:1 call Tm1637_ack 'zweite Stelle Call Tm1637_wrbyte(ceinerT1) 'Digit 2; showing:2 call Tm1637_ack 'dritte Stelle Call Tm1637_wrbyte(&B01100011) 'Digit 3; showing:3 call Tm1637_ack 'vierte Stelle Call Tm1637_wrbyte(&B00111001) 'Digit 4; showing:4 call Tm1637_ack call Tm1637_stop End if 'Temp2 Anzeige If _Sec >=35 and _sec < 50 then 'We want to display (empty)008 call Tm1637_start Call Tm1637_wrbyte(&H40) 'Data instruction set Hex44 write one byte to register (data write mode set) autoincrement adress mode call Tm1637_ack call Tm1637_stop ' call Tm1637_start Call Tm1637_wrbyte(&Hc0) 'addres instruction setting, first digit (HexC0) MSB display Call Tm1637_ack 'erste Stelle Call Tm1637_wrbyte(czehnT2) 'Digit 1; showing:0 Call Tm1637_ack 'zweite Stelle Call Tm1637_wrbyte(ceinerT2) 'Digit 2; showing:0 Call Tm1637_ack 'dritte Stelle Call Tm1637_wrbyte(&B01100011) 'Digit 3; showing:0 Call Tm1637_ack ' Gosub 'vierte Stelle Call Tm1637_wrbyte(&B00111001) 'Digit 4; showing:8 Call Tm1637_ack Call Tm1637_stop End IF Loop Sub Einzelzeit 'Zehner Stunden If _hour <10 or _hour = 20 then Zehnerh = 0 if _hour =>10 and _hour <20 then Zehnerh = 1 if _hour >=20 then Zehnerh = 2 'Einer Stunden If _hour <10 then einerh = _hour if _hour =>10 and _hour <20 then Einerh = _hour - 10 End if if _hour >20 then einerh = _hour - 20 End if if _hour = 20 or _hour = 10 then Einerh = 0 Einerhpunkt = Einerh + 10 'sekunden in 1Takt schalten dann immer auf einerhpunkt und Einerh umschalten 'Zehner Minuten if _Min <10 then Zehnermin = 0 if _Min =>10 and _Min <20 then Zehnermin = 1 if _Min =>20 and _Min <30 then Zehnermin = 2 if _Min =>30 and _Min <40 then Zehnermin = 3 if _Min =>40 and _Min <50 then Zehnermin = 4 if _Min =>50 then Zehnermin = 5 'einer Minuten if _min <10 then einermin = _min if _min >=10 and _min <20 then einermin = _min - 10 end if if _min >=20 and _min <30 then einermin = _min - 20 end if if _min >=30 and _min <40 then einermin = _min - 30 end if if _min >=40 and _min <50 then einermin = _min - 40 end if if _min >=50 then einermin = _min - 50 end if End sub Einzelzeit Sub Tempmessung 'Belegung von Pins zu einen von Links nach Rechts Flach oben '1 = GND '2 = Signal '3 = VCC (5V) ' - - - ' 1 2 3 ' \ _ / If Takt <> Takt_alt Then Takt_alt = Takt End If ' cli ' Stop timer2 ' Wird bei ADC nutzung benötige 1wverify Ds1820id(1) 'Sensor aus China 1wwrite Auslesen Sc(1) = 1wread(9) ' Start Timer2 ' Wird bei ADC nutzung benötige T1 = Makeint(sc(1) , Sc(2)) If Sc(9) = Crc8(sc(1) , 8) Then Dgc = Decigrades18b20(sc(9)) End If If dgc < 10 Then zehnT1 = 0 If dgc >= 10 and dgc <=19 then ZehnT1 = 1 If dgc >= 20 and dgc <=29 then ZehnT1 = 2 If dgc >= 30 and dgc <=39 then ZehnT1 = 3 If dgc >= 40 and dgc <=49 then ZehnT1 = 4 'Einer Grad T1 If dgc <10 then einerT1 = dgc If dgc >= 10 and dgc <20 then einerT1 = dgc - 10 end if If dgc >=20 and dgc <30 then einerT1 = dgc - 20 end if If dgc >=30 and dgc <40 then einerT1 = dgc - 30 end if If dgc >=40 and dgc <50 then einerT1 = dgc - 40 end if 'Stop timer2 ' Wird bei ADC nutzung benötige 1wverify Ds1820id(9) 'Sensor aus China 1wwrite Auslesen Sc(1) = 1wread(9) ' Start Timer2 ' Wird bei ADC nutzung benötige T2 = Makeint(sc(1) , Sc(2)) If Sc(9) = Crc8(sc(1) , 8) Then Dgc = Decigrades18b20(sc(9)) End If If dgc < 10 Then zehnT2 = 0 If Dgc >= 10 and Dgc <=19 then ZehnT2 = 1 If Dgc >= 20 and Dgc <=29 then ZehnT2 = 2 If Dgc >= 30 and Dgc <=39 then ZehnT2 = 3 If Dgc >= 40 and Dgc <=49 then ZehnT2 = 4 'Einer Grad T2 If Dgc <10 then einerT2 = Dgc If Dgc >= 10 and Dgc <20 then einerT2 = Dgc - 10 end if If Dgc >=20 and Dgc <30 then einerT2 = Dgc - 20 end if If Dgc >=30 and Dgc <40 then einerT2 = Dgc - 30 end if If Dgc >=40 and Dgc <50 then einerT2 = Dgc - 40 end if Restore Sensor_ids For I = 1 To 17 Read Ds1820id(i) Next I 1wreset 1wwrite Skip_rom 1wwrite Messen End Sub TEMPMESSUNG 'End Sub Tm1637_start '1637 start transmission Set Clk Set Dio_out Waitus 2 Reset Dio_out 'Return End Sub Sub Tm1637_ack '1637 responses transmission Reset Clk Waitus 5 'After the eighth clock falling edge delay 5us, start determination ACK signal Reset Dio_set Bitwait Dio_in , Reset Set Clk Waitus 2 Reset Clk Set Dio_set End SUB 'Return Sub Tm1637_stop '1637 Stop transmission Reset Clk Waitus 2 Reset Dio_out Waitus 2 Set Clk Waitus 2 Set Dio_out End Sub 'Return Sub Tm1637_wrbyte 'Write byte variable passed by the call (Bajt) For Temp = 0 To 7 'send bit, LSB first Reset Clk Dio_out = Bajt.temp Waitus 3 Set Clk Waitus 3 Next Temp End Sub 'Formal für China Sensoren ( DS18B20 ) Function Decigrades18b20(byval Sc(9) As Byte) Decigrades18b20 = 0 Decigrades18b20 = Makeint(sc(1) , Sc(2)) Decigrades18b20 = Decigrades18b20 / 16 End Function Sectic: Takt = _sec Punktzeit = Punktzeit + 1 Return 'Tempsensoren Sensor_ids: Data &H28 , &HA0 , &H29 , &H34 , &H05 , &H00 , &H00 , &H3A 'Innen Sensor T1 Data &H28 , &HDE , &H06 , &H34 , &H05 , &H00 , &H00 , &H26 'Ausen Sensor T2 Ziffern_pattern: 'Daten zur Segmentansteuerung. Data &B00111111 '0 Data &B00000110 '1 Data &B01011011 '2 Data &B01001111 '3 Data &B01100110 '4 Data &B01101101 '5 Data &B01111101 '6 Data &B00000111 '7 Data &B01111111 '8 Data &B01101111 '9 Data &B10111111 '0: 10 Data &B10000110 '1: 11 Data &B11011011 '2: 12 Data &B11001111 '3: 13 Data &B11100110 '4: 14 Data &B11101101 '5: 15 Data &B11111101 '6: 16 Data &B10000111 '7: 17 Data &B11111111 '8: 18 Data &B11101111 '9: 19 Data &B01100011 '° 20 Data &B01110111 'A 21 Data &B00111001 'C 22 Data &B00111000 'L 23 Data &B01110110 'H 24 Data &B00000000 'aus 23
habe halt irgenwie bei der Adressierung der der Teile ein Problem denk ich aber für das Display habe ich halt keine Adresse raus bekommen weder im netz noch lässt sich eine auslesen. Da denke ich wird schon das ganze sein oder habt ihr da eine andere Idee.
Habe zwar schon ein Paar Sachen programmiert aber bin trotzdem noch ein blutiger Anfänger.
Würde mich über Tipps freuen
Zuletzt bearbeitet: