7-Segmentanzeige (Werte aus Tabelle lesen)

Fuzzy

Mitglied
09. Dez. 2008
60
0
6
Worfelden
Sprachen
Hallo,

wie ich schon an anderer Stelle geschrieben habe bin ich dabei mir eine Wetterstation zu bauen die verschiedene Messgrößen (z.B. Temperatur, Windgeschwindigkeit, usw.) auf 7 Segmentanzeigen bringen soll. Danke Dino's Hilfe hab ich jetzt eine Anzeige aufgebaut, die eigentlich auch die Werte so anzeigt wie ich es erwarte, wenn ich die einzelnen Werte direkt aus der Tabelle hole. Wenn ich aber eine Wert einer Variablen zuweise und den Wert dann anzeigen lassen will, dann zeigt er nicht den richtigen Wert an. Ist schwierig zu erklären. Hier mal der Code wie es funktioniert:

Code:
' ' ----------------------------------------------------------------
' Autor : Roger
' 7 Segmentanzeige mit 74hc595 gemultiplexed
' Signale:
' Daten: Portb.0
' Takt (SCK):  Portb.1 -> Pin 11 am 74hc595
' MasterReset (SCL): Portb.2 -> Pin 10 am 74hc595
' AusgabeRegister aktivieren: Portb.3 -> Pin 12 am 74hc595
'
' Einer:    Portd.0 -> Enable für 7 Segmentanzeige_einer
' Zehner:   Portd.1 -> Enable für 7 Segmentanzeige_zehner
' Hunderter Portd.2 -> Enable für 7 Segmentanzeige_hunderter
' Tausender Portd.3 -> Enable für 7 Segmentanzeige_tausender
' zehntausender Portd.4 -> Enable für 7 Segmentanzeige_zehntausender
' ----------------------------------------------------------------

$regfile = "m8def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 1000000

Dim I As Byte
Dim Einer As Byte
Dim Zehner As Byte
Dim Hunderter As Byte
Dim Tausender As Byte
Dim Zehntausender As Byte
Dim Zeichen(10) As Byte
Dim X As Byte

Dim Wind_1 As Integer
Dim Tempi_1 As Integer
Dim Tempa_1 As Integer
Dim Baro_1 As Integer


Config Portb = Output                                       'Signalleitungen
Ddrb = &B11111111
Portb = &B11110100

Config Portd = Output                                       'Einer bis Tausender
Ddrd = &B11111111
Portd = &B00000000

Si Alias Portb.0                                            ' Daten schieben
Sck Alias Portb.1                                           ' Erzeugt steigende Flanke für den Datentakt
Scl Alias Portb.2                                           ' low = Segment bzw. Ausgangsspeicher löschen
Rck Alias Portb.3                                           ' Erzeugt Puls für den L

Einer_an Alias Portd.0
Zehner_an Alias Portd.1
Hunderter_an Alias Portd.2
Tausender_an Alias Portd.3
Zehntausender_an Alias Portd.4




Einer_an = 0
Zehner_an = 0
Hunderter_an = 0
Tausender_an = 0
Zehntausender_an = 0

Scl = 0

Main:

Restore 7_seg_tabelle

For X = 1 To 10
   Read Zeichen(x)
Next X

Wait 1

Tempa_1 = Zeichen(4)
Tempi_1 = Zeichen(5)
Wind_1 = Zeichen(6)

Scl = 1

Wait 1


Do


      Shiftout Si , Sck , Zeichen(1) , 1
      Shiftout Si , Sck , Zeichen(2) , 1
      Shiftout Si , Sck , Zeichen(3) , 1
      Rck = 0 : Rck = 1 : Rck = 0


      Zehner_an = 0
      Einer_an = 1


      Waitms 3

      Shiftout Si , Sck , Zeichen(4) , 1
      Shiftout Si , Sck , Zeichen(5) , 1
      Shiftout Si , Sck , Zeichen(6) , 1
      Rck = 0 : Rck = 1 : Rck = 0


      Einer_an = 0
      Zehner_an = 1

      Waitms 3



Loop

7_seg_tabelle:
'      0      1      2      3      4      5      6      7      8      9
Data &HF9 , &HA4 , &HB0 , &H99 , &H92 , &H82 , &HF8 , &H80 , &H90 , &HC0

Hier wird wie zu erwarten 1 2 3 4 5 6 angezeigt

Hier wie es nicht funktioniert:

Code:
' ----------------------------------------------------------------
' Autor : Roger
' 7 Segmentanzeige mit 74hc595 gemultiplexed
' Signale:
' Daten: Portb.0
' Takt (SCK):  Portb.1 -> Pin 11 am 74hc595
' MasterReset (SCL): Portb.2 -> Pin 10 am 74hc595
' AusgabeRegister aktivieren: Portb.3 -> Pin 12 am 74hc595
'
' Einer:    Portd.0 -> Enable für 7 Segmentanzeige_einer
' Zehner:   Portd.1 -> Enable für 7 Segmentanzeige_zehner
' Hunderter Portd.2 -> Enable für 7 Segmentanzeige_hunderter
' Tausender Portd.3 -> Enable für 7 Segmentanzeige_tausender
' zehntausender Portd.4 -> Enable für 7 Segmentanzeige_zehntausender
' ----------------------------------------------------------------

$regfile = "m8def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 1000000

Dim I As Byte
Dim Einer As Byte
Dim Zehner As Byte
Dim Hunderter As Byte
Dim Tausender As Byte
Dim Zehntausender As Byte
Dim Zeichen(10) As Byte
Dim X As Byte

Dim Wind_1 As Integer
Dim Tempi_1 As Integer
Dim Tempa_1 As Integer
Dim Baro_1 As Integer


Config Portb = Output                                       'Signalleitungen
Ddrb = &B11111111
Portb = &B11110100

Config Portd = Output                                       'Einer bis Tausender
Ddrd = &B11111111
Portd = &B00000000

Si Alias Portb.0                                            ' Daten schieben
Sck Alias Portb.1                                           ' Erzeugt steigende Flanke für den Datentakt
Scl Alias Portb.2                                           ' low = Segment bzw. Ausgangsspeicher löschen
Rck Alias Portb.3                                           ' Erzeugt Puls für den L

Einer_an Alias Portd.0
Zehner_an Alias Portd.1
Hunderter_an Alias Portd.2
Tausender_an Alias Portd.3
Zehntausender_an Alias Portd.4




Einer_an = 0
Zehner_an = 0
Hunderter_an = 0
Tausender_an = 0
Zehntausender_an = 0

Scl = 0

Main:

Restore 7_seg_tabelle

For X = 1 To 10
   Read Zeichen(x)
Next X

Wait 1

Tempa_1 = Zeichen(4)
Tempi_1 = Zeichen(5)
Wind_1 = Zeichen(6)

Scl = 1

Wait 1


Do


      Shiftout Si , Sck , Zeichen(1) , 1
      Shiftout Si , Sck , Zeichen(2) , 1
      Shiftout Si , Sck , Zeichen(3) , 1
      Rck = 0 : Rck = 1 : Rck = 0


      Zehner_an = 0
      Einer_an = 1


      Waitms 3

      Shiftout Si , Sck , Tempa_1 , 1
      Shiftout Si , Sck , Tempi_1 , 1
      Shiftout Si , Sck , Wind_1 , 1
      Rck = 0 : Rck = 1 : Rck = 0


      Einer_an = 0
      Zehner_an = 1

      Waitms 3



Loop

7_seg_tabelle:
'      0      1      2      3      4      5      6      7      8      9
Data &HF9 , &HA4 , &HB0 , &H99 , &H92 , &H82 , &HF8 , &H80 , &H90 , &HC0

Jetzt wird angezeigt:

1 2 3 5 8 6

Ich denke es liegt an der Art und Weise wie ich die Werte aus der Tabelle raus hole.

Kann mir jemand weiter helfen :confused:

Danke schon mal.

Gruß
Roger
 
Hallo,

also so auf den ersten Blick kann ich mit meinen minimalen BASCOM-Kenntnissen
keinen Fehler finden :D

Aber ich geb dir mal nen Tip ...

Zur Einschaltung der einzelnen Stellen (Einer, Zehner, ...) ...
mach das anders. mit einzelnen Variablen programmierst du dir da später
den Wolf.

Bei dir ist PortD für die Einschaltung da ...
Setz eine Variable auf 0b00000001 (oder 0x01) für die Einerstelle und schreib
sie auf PortD raus. Für die Zehnerstelle schiebst du den Inhalt der Variable
um ein Bit nach Links (also wird dann 0b00000010 oder 0x02 draus). Das ist
einfacher weil du die gesammte Stellenbehandlung und Ausgabe nachher in
einer Schleife machen kannst.

Gruß
Dino
 
Hallo Dino,

war nur mal so zum Testen. Später will ich die Segmente ja vielleicht auch mit einem 74hc595 anschalten und dann schieb ich die 1en dann an die richtige Stelle. Erstmal läuft die Anzeige soweit ganz ordentlich, jetzt will ich es über's Wochende mal schaffen realistische Werte, gemessen mit DS18S20 anzuzeigen. Wenn das klappt bin ich schon ein schönes Stück weiter ;)

Gruß
Roger
 
ok, hat sich erledigt. Ich muß die Variable als Index mitgeben also so:

Code:
Tempa_1 = 1
Tempi_1 = 2
Wind_1 = 3

Scl = 1

Wait 1


Do
      Shiftout Si , Sck , Zeichen(tempa_1) , 1
      Shiftout Si , Sck , Zeichen(tempi_1) , 1
      Shiftout Si , Sck , Zeichen(wind_1) , 1
      Rck = 0 : Rck = 1 : Rck = 0

      Zehner_an = 0
      Einer_an = 1

      Waitms 3

      Shiftout Si , Sck , Zeichen(4) , 1
      Shiftout Si , Sck , Zeichen(5) , 1
      Shiftout Si , Sck , Zeichen(6) , 1
      Rck = 0 : Rck = 1 : Rck = 0

      Einer_an = 0
      Zehner_an = 1

      Waitms 3
Loop

Gruß
Roger
 
So ganz klappts leider doch noch nicht :confused:

Ich versuche gerade die Temperaturanzeige zu simulieren und daraus für die einzelnen 7 Segmentanzeigen die Werte zu extrahieren. Also z.B. liegt später die Temperatur 3 stellig in einer Variablen und ich muß dann die 3 Stellen daraus bestimmen. Hier ist der Code

Code:
Tempi = 29.3   
Do

   Anzeige = Tempi * 10

'Disable Interrupts
   Tempi_100 = Anzeige / 100                                '2
   Tempi_10 = Anzeige Mod 100                               '93
   Tempi_1 = Tempi_100 Mod 10                               '3
   Tempi_10 = Tempi_100 / 10                                '9
'Enable Interrupts
Loop

Sub Segment1
      Shiftout Si , Sck , Zeichen(1) , 1
      Shiftout Si , Sck , Zeichen(2) , 1
      [B]'Shiftout Si , Sck , Zeichen(tempi_1) , 1
      Shiftout Si , Sck , Zeichen(3) , 1[/B]
      Rck = 0 : Rck = 1 : Rck = 0

      Hunderter_an = 0
      Tausender_an = 0
      Zehner_an = 0
      Einer_an = 1
      A = 2
End Sub

Sub Segment2
      Shiftout Si , Sck , Zeichen(4) , 1
      Shiftout Si , Sck , Zeichen(5) , 1
      [B]'Shiftout Si , Sck , Zeichen(tempi_10) , 1
      Shiftout Si , Sck , Zeichen(9) , 1[/B]

      Rck = 0 : Rck = 1 : Rck = 0

      Tausender_an = 0
      Hunderter_an = 0
      Einer_an = 0
      Zehner_an = 1
      A = 3
End Sub

Sub Segment3
      Shiftout Si , Sck , Zeichen(7) , 1
      Shiftout Si , Sck , Zeichen(8) , 1
      [B]'Shiftout Si , Sck , Zeichen(tempi_100) , 1
      Shiftout Si , Sck , Zeichen(2) , 1[/B]
      Rck = 0 : Rck = 1 : Rck = 0

      Tausender_an = 0
      Zehner_an = 0
      Einer_an = 0
      Hunderter_an = 1
      A = 4
End Sub

Eigentlich sollte meine Anzeige 29.3 anzeigen. Tut sie momentan auch weil ich aus Testzwecken die Werte so fest mitgegeben habe. Wenn ich den Code aber jetzt so ändere, dass ich die Auskommentierungen an den fetten Zeilen wegnehme und die festen Werte einkommentiere, wird Müll angezeigt. Hat jemand eine Ahnung wo der Fehler ist?

Danke schon mal ;)

Gruß
Roger
 
Multiplex: Probleme beim Timing

Hab das jetzt soweit hin bekommen, dass es den erwarteten Wert für die eine Temperaturanzeige korrekt angezeigt hat. Also hab ich den DS18S20 an einen Port angeschlossen um den ersten realen Wert anzuzeigen. Hat dann auch alles soweit geklappt. Hatte Anfangs zur Kontrolle noch eine LCD Anzeige angeschlossen und es werden auch die Werte auf beiden Anzeigen gleich angezeigt. Da aber zum Auslesen des DS18S20 in eine Unterroutine gesprungen wird, die wegen dem DS18S20 Timing zeitkritisch ist, flackert dadurch die Anzeige. Das liegt wohl daran, dass ich in der Zeit wo das Auslesen aus dem DS18S20 stattfindet die Interrupts sperre und die brauch ich ja für das Multiplexing. Hat jemand eine Idee wie ich das hin bekommen kann. Oder ist es vielleicht besser wenn ich 2 Atmega's einsetze. Einen für die Sensoren und die Berechnung der Werte und einen der die Werte geliefert bekommt und die Anzeige bedient?

Code:
' ----------------------------------------------------------------
' Autor : Roger
' 7 Segmentanzeige mit 74hc595 gemultiplexed
' Signale:
' Daten: Portb.0
' Takt (SCK):  Portb.1 -> Pin 11 am 74hc595
' MasterReset (SCL): Portb.2 -> Pin 10 am 74hc595
' AusgabeRegister aktivieren: Portb.3 -> Pin 12 am 74hc595
'
' Einer:    Portd.0 -> Enable für 7 Segmentanzeige_einer
' Zehner:   Portd.1 -> Enable für 7 Segmentanzeige_zehner
' Hunderter Portd.2 -> Enable für 7 Segmentanzeige_hunderter
' Tausender Portd.3 -> Enable für 7 Segmentanzeige_tausender
' zehntausender Portd.4 -> Enable für 7 Segmentanzeige_zehntausender
' ----------------------------------------------------------------

$regfile = "m8def.dat"
$framesize = 40
$swstack = 60
$hwstack = 60
$crystal = 1000000

Declare Sub Read1820
Declare Sub Crcit
Declare Sub Temperature
Declare Sub Min_max

Declare Sub Segment1
Declare Sub Segment2
Declare Sub Segment3
Declare Sub Segment4

Dim I As Byte
Dim A As Byte
Dim Einer As Byte
Dim Zehner As Byte
Dim Hunderter As Byte
Dim Tausender As Byte
Dim Zehntausender As Byte
Dim Zeichen(10) As Byte
Dim X As Byte

Dim Wind_1 As Integer
Dim Wind_10 As Integer
Dim Wind_100 As Integer
Dim Tempi_1 As Integer
Dim Tempi_10 As Integer
Dim Tempi_100 As Integer
Dim Tempa_1 As Integer
Dim Tempa_10 As Integer
Dim Tempa_100 As Integer
Dim Baro_1 As Integer
Dim Baro_10 As Integer
Dim Baro_100 As Integer
Dim Baro_1000 As Integer
Dim Tempi As Single
Dim Tempi_int As Integer
Dim Tempi_z As Integer
Dim Anzeige As Integer
Dim Temper As Integer

Dim Bd(9) As Byte
Dim Crc As Byte
Dim Tmp As Byte
Dim T As Word , T1 As Word
Dim E As Single
Dim Tmax As Single
Dim Tmin As Single


Config 1wire = Portc.5

Ddrc = &B00000011

'Confic Portc.1 = Output

Config Portb = Output                                       'Signalleitungen
Ddrb = &B11111111
Portb = &B11110100

Config Portd = Output                                       'Einer bis Tausender
Ddrd = &B11111111
Portd = &B00000000

Config Timer0 = Timer , Prescale = 8                        'Konfiguriere Timer1 für Multiplex
Enable Timer0                                               'schalte den Timer1 ein
On Timer0 Isr_von_timer0                                    'verzweige bei Timer1 überlauf zu   Isr_von_Timer1

Si Alias Portb.0                                            ' Daten schieben
Sck Alias Portb.1                                           ' Erzeugt steigende Flanke für den Datentakt
Scl Alias Portb.2                                           ' low = Segment bzw. Ausgangsspeicher löschen
Rck Alias Portb.3                                           ' Erzeugt Puls für den L

Einer_an Alias Portb.4
Zehner_an Alias Portb.5
Hunderter_an Alias Portc.0
Tausender_an Alias Portc.1
'Zehntausender_an Alias Portd.4

Einer_an = 0
Zehner_an = 0
Hunderter_an = 0
Tausender_an = 0
'Zehntausender_an = 0


' ########### für DS18S20 ###############
Tmax = -25
Tmin = 99

Deflcdchar 0 , 32 , 32 , 4 , 10 , 10 , 4 , 32 , 32          ' replace ? with number (0-7)

Config 1wire = Portc.5                                      ' DS1820 on pin 12 (pull up)


Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , _
   Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2

Config Lcd = 20 * 2

Cursor Off Noblink

'############

Scl = 0

Main:

Restore 7_seg_tabelle

For X = 1 To 10
   Read Zeichen(x)
Next X


Scl = 1

Wait 1

A = 1



Do

   Temperature

   Wait 1

   E = E * 10
   Temper = Int(e)

   Anzeige = Temper


   Tempi_100 = Anzeige / 100                                '2
   Tempi_z = Anzeige Mod 100                                '93
   Tempi_1 = Tempi_z Mod 10                                 '3
   Tempi_10 = Tempi_z / 10                                  '9

Loop

'####### SUB's für Anzeige ##############

Sub Segment1
      Tausender_an = 0
      Shiftout Si , Sck , Zeichen(1) , 1
      Shiftout Si , Sck , Zeichen(2) , 1
      Shiftout Si , Sck , Zeichen(tempi_1) , 1
      Rck = 0 : Rck = 1 : Rck = 0

      Hunderter_an = 0
      Tausender_an = 0
      Zehner_an = 0
      Einer_an = 1

      A = 2

End Sub

Sub Segment2
      Einer_an = 0
      Shiftout Si , Sck , Zeichen(4) , 1
      Shiftout Si , Sck , Zeichen(5) , 1
      Shiftout Si , Sck , Zeichen(tempi_10) , 1
      Rck = 0 : Rck = 1 : Rck = 0

      Tausender_an = 0
      Hunderter_an = 0
      Einer_an = 0
      Zehner_an = 1
      A = 3
End Sub

Sub Segment3
      Zehner_an = 0
      Shiftout Si , Sck , Zeichen(7) , 1
      Shiftout Si , Sck , Zeichen(8) , 1
      Shiftout Si , Sck , Zeichen(tempi_100) , 1
      Rck = 0 : Rck = 1 : Rck = 0

      Tausender_an = 0
      Zehner_an = 0
      Einer_an = 0
      Hunderter_an = 1
      A = 4
End Sub

Sub Segment4
      Hunderter_an = 0
      Shiftout Si , Sck , Zeichen(10) , 1
      Shiftout Si , Sck , Zeichen(1) , 1
      Shiftout Si , Sck , Zeichen(10) , 1
      Rck = 0 : Rck = 1 : Rck = 0

      Zehner_an = 0
      Einer_an = 0
      Hunderter_an = 0
      Tausender_an = 1
      A = 1
End Sub

'/////////////////// SUB'S für DS18S20 ///////////////////////////////////////////////////////////
Sub Temperature                                             ' actual measuring

 1wwrite &HCC : 1wwrite &H44                                'startet Messung
 Waitms 700

 Disable Interrupts                                         'warten bis Konvertierung beendet
   Read1820                                                 ' lesen der 9 Bytes
 Enable Interrupts

 If Err = 1 Then                                            ' wenn kein Sensor gefunden  sensor
   Print "kein Sensor"
 Else
 If Crc = 0 Then                                            ' Sensor da, check CRC
  Print "CRC OK"
 Else
  Print "CRC NOT OK"
 End If
 End If
End Sub

'//////////////////////////////////////////////////////////////////////////////

Sub Read1820                                                ' liest sensor
 ' T for 0.1 C
'Disable Interrupts
 1wreset                                                    ' resetet den bus
 1wwrite &HCC                                               ' liest RAM vom DS18S20
 1wwrite &HBE
                                                             ' liest die 9 data Bytes
 Bd(1) = 1wread(9)                                          ' liest die Bytes in Array
 1wreset                                                    ' resetet den bus


 Crcit                                                      ' ckeck CRC
 If Crc = 0 Then                                            ' wenn OK,
 Tmp = Bd(1) And 1                                          ' 0.1C


 If Tmp = 1 Then Decr Bd(1)
 T = Makeint(bd(1) , Bd(2))
 T = T * 50 : T = T - 25 : T1 = Bd(8) - Bd(7) : T1 = T1 * 100
 T1 = T1 / Bd(8) : T = T + T1 : T = T / 10
 E = T : E = T / 10


 End If
'Enable Interrupts
'Min_max

End Sub

'//////////////////////////////////////////////////////////////////////////////

Sub Min_max

If Tmax < E Then Tmax = E
If Tmin > E Then Tmin = E

End Sub

'//////////////////////////////////////////////////////////////////////////////



Sub Crcit                                                   ' 8 bit CRC
 ' bigger but faster
 Crc = 0
 For I = 1 To 9
 Tmp = Crc Xor Bd(i)
 Crc = Lookup(tmp , Crc8)
 Next
End Sub

'//////////////////////////////////////////////////////////////////////////////



'///////////////////// ISR ////////////////////////////////////////////////////
Isr_von_timer0:
     Select Case A
     Case 1 : Segment1
     Case 2 : Segment2
     Case 3 : Segment3
     Case 4 : Segment4
     End Select                                             'ISR von Timer1
Return

'//// TABELLEN ///////

7_seg_tabelle:
'      0      1      2      3      4      5      6      7      8      9
Data &HF9 , &HA4 , &HB0 , &H99 , &H92 , &H82 , &HF8 , &H80 , &H90 , &HC0


Crc8:
Data 0 , 94 , 188 , 226 , 97 , 63 , 221 , 131 , 194 , 156
Data 126 , 32 , 163 , 253 , 31 , 65 , 157 , 195 , 33 , 127
Data 252 , 162 , 64 , 30 , 95 , 1 , 227 , 189 , 62 , 96
Data 130 , 220 , 35 , 125 , 159 , 193 , 66 , 28 , 254 , 160
Data 225 , 191 , 93 , 3 , 128 , 222 , 60 , 98 , 190 , 224
Data 2 , 92 , 223 , 129 , 99 , 61 , 124 , 34 , 192 , 158
Data 29 , 67 , 161 , 255 , 70 , 24 , 250 , 164 , 39 , 121
Data 155 , 197 , 132 , 218 , 56 , 102 , 229 , 187 , 89 , 7
Data 219 , 133 , 103 , 57 , 186 , 228 , 6 , 88 , 25 , 71
Data 165 , 251 , 120 , 38 , 196 , 154 , 101 , 59 , 217 , 135
Data 4 , 90 , 184 , 230 , 167 , 249 , 27 , 69 , 198 , 152
Data 122 , 36 , 248 , 166 , 68 , 26 , 153 , 199 , 37 , 123
Data 58 , 100 , 134 , 216 , 91 , 5 , 231 , 185 , 140 , 210
Data 48 , 110 , 237 , 179 , 81 , 15 , 78 , 16 , 242 , 172
Data 47 , 113 , 147 , 205 , 17 , 79 , 173 , 243 , 112 , 46
Data 204 , 146 , 211 , 141 , 111 , 49 , 178 , 236 , 14 , 80
Data 175 , 241 , 19 , 77 , 206 , 144 , 114 , 44 , 109 , 51
Data 209 , 143 , 12 , 82 , 176 , 238 , 50 , 108 , 142 , 208
Data 83 , 13 , 239 , 177 , 240 , 174 , 76 , 18 , 145 , 207
Data 45 , 115 , 202 , 148 , 118 , 40 , 171 , 245 , 23 , 73
Data 8 , 86 , 180 , 234 , 105 , 55 , 213 , 139 , 87 , 9
Data 235 , 181 , 54 , 104 , 138 , 212 , 149 , 203 , 41 , 119
Data 244 , 170 , 72 , 22 , 233 , 183 , 85 , 11 , 136 , 214
Data 52 , 106 , 43 , 117 , 151 , 201 , 74 , 20 , 246 , 168
Data 116 , 42 , 200 , 150 , 21 , 75 , 169 , 247 , 182 , 232
Data 10 , 84 , 215 , 137 , 107 , 53
 
Hallo,

Da aber zum Auslesen des DS18S20 in eine Unterroutine gesprungen wird, die wegen dem DS18S20 Timing zeitkritisch ist, flackert dadurch die Anzeige. Das liegt wohl daran, dass ich in der Zeit wo das Auslesen aus dem DS18S20 stattfindet die Interrupts sperre und die brauch ich ja für das Multiplexing. Hat jemand eine Idee wie ich das hin bekommen kann. Oder ist es vielleicht besser wenn ich 2 Atmega's einsetze. Einen für die Sensoren und die Berechnung der Werte und einen der die Werte geliefert bekommt und die Anzeige bedient?
Das wird wohl weiter flackern. Das Problem hast du auch beim LCD. Da sind die
Routinen auch zeitkritisch und unterbrechen die Interrupts. Da die aber nicht
ganz so lange dauern wie eine 1Wire-Bus Kommunikation sieht man das meißt
nicht. Also Plan B (2ter Atmel) ;)

Gruß
Dino
 
Danke Dino :),

früher oder später hätte ich sowieso die 2. Variante nehmen müssen weil ich die Messwerte ja mit Funk (RFM12) übertragen will. Wie verbinde ich die 2 Prozessoren am Besten? SPI?

Gruß
Roger
 
Hallo Roger,

früher oder später hätte ich sowieso die 2. Variante nehmen müssen weil ich die Messwerte ja mit Funk (RFM12) übertragen will. Wie verbinde ich die 2 Prozessoren am Besten? SPI?
also nach meiner Info sind die RFM12 sowieso mit SPI-Schnittstelle über die du
die Daten und die Einstellungen (Kanal, Modulation, ...) übertragen mußt.
Hab ich aber noch nix mit gemacht. Ich hab aber für ein eventuelles
Zeitloch schon 5 Transceiver hier rumliegen ;) Einer hat auch schon nen
Adapter auf 2,54mm-Raster bekommen.

Die Kopplung kann man über SPI, I2C oder RS232 machen. Oder man bastelt
sich was eigenes über mehrere Port-Pins zusammen. Zum Beispiel ne
4Bit-Parallel-Verbindung. Da ist man absolut frei. Man könnte auch mehrere
µC über einen SRAM-Baustein miteinander kommunizieren lassen. Der
Möglichkeiten gibt es viele :D Das hängt nur von der Anwendung und dem
eigenen Wunsch ab was man im Endeffekt verwendet.

Da du hier sowieso bei Funk später die SPI brauchst, würde ich da jetzt auch
schon drüber arbeiten. Die eigentliche Übertragung wird sich aber wohl im
Protokoll und der Art, wie man die Daten rüberbringt dann wieder ändern.
Wenn man aber modular arbeitet (über Subroutinen für den Transfer) muß
man später nur die entsprechenden Subroutinen tauschen und der Rest
bleibt identisch ;) => Software-Schnittstellen

Gruß
Dino
 
Hallo

Hier mal ein Tipp wie ich es mache wenn man nur einen DS18S20 abfragt, ohne Timing Probleme!

Stoße zbs. bei sekunde 6 die Temperaturmessung des DS an.

Und bei sekunde 7 oder besser 8 fragst den DS ab!

Also dafür zwei Controller zunehmen ist blödsinn!

cya
 
Hi,

Hier mal ein Tipp wie ich es mache wenn man nur einen DS18S20 abfragt, ohne Timing Probleme!

Stoße zbs. bei sekunde 6 die Temperaturmessung des DS an.

Und bei sekunde 7 oder besser 8 fragst den DS ab!

Also dafür zwei Controller zunehmen ist blödsinn!
Wenn man sich entsprechende Gedanken über die zeitliche Verschachtelung
der Aufgaben macht, dann ist das sicherlich mit einem µC möglich ;)
Dann darf das Multiplexing aber nicht so schnell sein, das man keine volle
1-Wire-Abfrage von einem DS18S20 hinbekommt. Oder andersrum ...
Eine 1Wire-Abfrage muß weniger Zeit dauern als die Umschaltung zur
nächsten Anzeige ;) Dann paßt das auch mit den Interrupts.
Und dafür ist es am allerbesten wenn man die 1Wire-Kommunikation auch
noch mit den Interrupts synchronisiert. Möglich ist das alles. Es ist nur ne
Frage des Aufwandes und der Gedanken die man sich dafür machen muß.

Aber im Grunde hast du da schon Recht ... ;)

Gruß
Dino
 

Ü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)