Hallo,
ich habe eine 7-Segmentanzeige die wunderbar funktioniert hat.

Nun wollte ich ein Paar Funktionen dazu haben und musste einen größeren µC nehmen. Deshalb hab ich eine paar Pinns ändern müssen.

Leider leuchtet nun immer Segment "B" also PD1. Wenn ich PD1 aus der Fassung biege ist der Fehler nicht mehr - also liegt es auf jeden fall an der software.(natürlich funktioniert dann das Segment auch nicht mehr...)

Kann mir jemand sagen warum PD1 gesetzt wird?

AT-Mega8 mit 8MHZ intern (Beschaltung im Code am Ende)

Tobias

Code:
'Geschwindigkeitsmessung mit AT-MEGA8 und 2 LaserLichtschranken
'7Segmentanzeige mit 4 Anzeigen

'Version: 0.1
'ohne Zeitmessung - nur Anzeige!!!!

'Version: 0.2


'-------------------------------------------------------------------------------
'Konfiguration µC:

$regfile = "m8def.dat"                                      'AT-Mega8
$crystal = 8000000                                          '18432000

$hwstack = 32                                               ' default use 32 for the hardware stack
$swstack = 8                                                ' default use 10 for the SW stack
$baud = 9600

'_______________________________________________________________________________
Ddrb = &B11111111                                           'PortB = Ausgang (PB0=A usw.)
Ddrc = &B111111                                             'PortC = Ausgang
Ddrd = &B11110011                                           'PortD = Ausgang (PD0=Anzeige1, PD4=A2, PD5=A3, PD6=A4) PD2/3 =INT

Config Int0 = Rising                                        'Falling                                       'wechsel von High auf Low
Config Int1 = Rising                                        'Falling                                       'wechsel von High auf Low
Enable Int0
Enable Int1
'On Int0 Irq0
'On Int1 Irq1


'_______________________________________________________________________________
Dim Anzeige_akt As Word                                     'Aktuelle Zeitmessung
Dim Anzeige_str As String * 5                               'Zeit als String
Dim Anzeige_str_len As Byte                                 'String-Länge
Dim Anzeige_ziffer As String * 1                            'Aktuelle Ziffer
Dim Anzeige_pos As Byte                                     'Aktuelle Ziffer im String
Dim I As Byte                                               'Allgem. Laufzahl

Dim Test As Word

Dim Zeit As Word
Dim Messzeit As Word                                        'in Millisekunden
Dim Zeitfake As Word                                        'damit nicht mit dem Wert 0 gerechnet wird 0=108km/h!!!                                            'gemessene Zeit von Timer1
Dim Zeit1 As Single
Dim Zeit2 As Single
Dim Zeit3 As Single

Dim Int0_merker As Byte                                     'als verriegelung für den int0 Eingang
Dim Int1_merker As Byte                                     'als verriegelung für den int1 Eingang
Dim Timer0merker As Word                                    'um intMerker zurück zu setzen

'_______________________________________________________________________________
'TIMER0 Konfiguration für Ziffernwechsel:
Config Timer0 = Timer , Prescale = 1024                     '64                       ' Timer0 für Anzeige
Const T0_preload = 0'230                                      ' Startwert Timer0 für 5000Hz
Tcnt0 = T0_preload

On Timer0 Timer_irq_led                                     ' Timer0-Overflow-Interrupt

Enable Timer0                                               ' Timer0 starten
Sreg.7 = 1                                                  'Globale Interruptfreigabe

'_______________________________________________________________________________
'TIMER1 Konfiguration für Messzeit Lichtschranke:
Config Timer1 = Timer , Prescale = 64
Const Timervorgabe = 65410                                  '65410 -> 1 kHz also 1Überlauf/Millisekunde
On Timer1 Timer1_irq                                        'Unteprogramm aufrufen
Enable Interrupts


'_______________________________________________________________________________
'Int0_merker = 0                                             'als verriegelung für den int0 Eingang
'Int1_merker = 0                                             'als verriegelung für den int1 Eingang
'Zeit = 0                                                    'gemessene Zeit auf 0 setzen
I = 1

'Test = 0

Do
If Zeit =< 500 Or Zeit => 18615 Then                        'damit nicht mit dem Wert 0 gerechnet wird 0=108km/h!!!
Zeitfake = 18616
Else
Zeitfake = Zeit
End If



Zeit1 = Messzeit * 0.0058579
Zeit2 = 109.05442 - Zeit1
Zeit3 = Zeit2 * 10                                          'damit ich eine nachkommastelle habe!!!


Anzeige_akt = 5                                             'Zeit3                                         '3                                         'Wert zum anzeigen

'If Timer0merker => 5000 Then                                '20000 Then                               'als Wartezeit nach einer KM/h Messung
'Incr Test
'Timer0merker = 0
'Int0_merker = 0                                             'als verriegelung für den int0 Eingang
'Int1_merker = 0                                             'als verriegelung für den int1 Eingang
'End If


Loop





'_______________________________________________________________________________
Timer_irq_led:


      Tcnt0 = T0_preload                                    'Timer wieder laden

      Anzeige_str = Str(anzeige_akt)                        ' Wert in String umwandeln
      Anzeige_str_len = Len(anzeige_str)                    ' Stringlänge messen

      Anzeige_pos = Anzeige_str_len - I
      Anzeige_pos = Anzeige_pos + 1

      Anzeige_ziffer = Mid(anzeige_str , Anzeige_pos , 1)

      Portc = 0                                             'Ghosting vermeiden (damit nich auf allen Anzeigen die selbe Zahl steht!!!)
      Portd = 0
      Portb = 0

      Select Case Anzeige_ziffer                            'Ziffer auf Port

           Case "0" :
           Portd.0 = 1
           Portd.1 = 1
           Portd.4 = 1
           Portb.6 = 1
           Portb.7 = 1
           Portd.5 = 1
           Portd.6 = 0
           Portd.7 = 0                                      'NULL

           Case "1" :
           Portd.0 = 0
           Portd.1 = 1
           Portd.4 = 1
           Portb.6 = 0
           Portb.7 = 0
           Portd.5 = 0
           Portd.6 = 0
           Portd.7 = 0                                      'EINS

           Case "2" :
           Portd.0 = 1
           Portd.1 = 1
           Portd.4 = 0
           Portb.6 = 1
           Portb.7 = 1
           Portd.5 = 0
           Portd.6 = 1
           Portd.7 = 0                                      'ZWEI

           Case "3" :
           Portd.0 = 1
           Portd.1 = 1
           Portd.4 = 1
           Portb.6 = 1
           Portb.7 = 0
           Portd.5 = 0
           Portd.6 = 1
           Portd.7 = 0                                      'DREI

           Case "4" :
           Portd.0 = 0
           Portd.1 = 1
           Portd.4 = 1
           Portb.6 = 0
           Portb.7 = 0
           Portd.5 = 1
           Portd.6 = 1
           Portd.7 = 0                                      'VIER

           Case "5" :
           Portd.0 = 1
           Portd.1 = 0
           Portd.4 = 1
           Portb.6 = 1
           Portb.7 = 0
           Portd.5 = 1
           Portd.6 = 1
           Portd.7 = 0                                      'FÜNF

           Case "6" :
           Portd.0 = 1
           Portd.1 = 0
           Portd.4 = 1
           Portb.6 = 1
           Portb.7 = 1
           Portd.5 = 1
           Portd.6 = 1
           Portd.7 = 0                                      'SECHS

           Case "7" :
           Portd.0 = 1
           Portd.1 = 1
           Portd.4 = 1
           Portb.6 = 0
           Portb.7 = 0
           Portd.5 = 0
           Portd.6 = 0
           Portd.7 = 0                                      'SIEBEN

           Case "8" :
           Portd.0 = 1
           Portd.1 = 1
           Portd.4 = 1
           Portb.6 = 1
           Portb.7 = 1
           Portd.5 = 1
           Portd.6 = 1
           Portd.7 = 0                                      'ACHT

           Case "9" :
           Portd.0 = 1
           Portd.1 = 1
           Portd.4 = 1
           Portb.6 = 1
           Portb.7 = 0
           Portd.5 = 1
           Portd.6 = 1
           Portd.7 = 0                                      'NEUN

           Case Else :
           Portd.0 = 0
           Portd.1 = 0
           Portd.4 = 0
           Portb.6 = 0
           Portb.7 = 0
           Portd.5 = 0
           Portd.6 = 0
           Portd.7 = 0

      End Select

     'Segment wählen
      If I = 1 Then Portc.1 = 1                             'EINER
      'If I = 2 Then Portc.2 = 1                            'ZEHNER
      If I = 2 Then
      Portc.2 = 1                                           'ZEHNER
      Portd.7 = 1                                           'EINE Kommastelle
       End If
      If I = 3 Then Portc.3 = 1                             'HUNDERTER
      If I = 4 Then Portc.4 = 1                             'TAUSENDER

      I = I + 1                                             'Nächste Ziffer
      If I >= 5 Then I = 1                                  'max Anzeigen angeben! damit Anzeige möglichst hell ist(bei 5Anzeigen muss bei der 6. wieder bei 1 Angefangen werden)

      Timer0merker = Timer0merker + 1                       '+1 um intMerker zurück zu setzen

Return

'Irq0:                                                       'Aufruf bei Lichtschranke 1 per Interrupt
 'If Int0_merker = 0 Then
 'Timer1 = 0                                                 'Timer auf 0 setzen
 'Zeit = 0                                                   'Timer1Zähler auf 0 setzen
 'Start Timer1
 'Messzeit = 0
 'End If
 'Int0_merker = 1
 'Return
 '
'Irq1:                                                       'Aufruf bei Lichtschranke 2 per Interrupt
' Stop Timer1
' If Int1_merker = 0 Then
' Messzeit = Zeit                                            'gemessene Zeit in Variable Zeit schreiben
' End If
' Int1_merker = 1
' Return


Timer1_irq:                                                 'Aufruf jede oder jede halbe Sekunde
' Timer1 = Timervorgabe                                      'AUF TIMER EINSTELLUNG ACHTEN!!!!!!!
' Incr Zeit
Return

'-------------------------------------------------------------------------------
'Anschlussbelegung am AT-MEGA8
'-------------------------------------------------------------------------------

'Segment A = PD0 (rote Ader)
'Segment B = PD1
'Segment C = PD4
'Segment D = PB6
'Segment E = PB7
'Segment F = PD5
'Segment G = PD6
'Segment DP = PD7

'Zahl 1 = PC1 ganz rechts EINER (rote Ader)
'Zahl 2 = PC2 2.Stelle von Rechts ZEHNER
'Zahl 3 = PC3 3.Stelle von Rechts Hunderter
'Zahl 4 = PC4 4.Stelle von Rechts Tausender

'Lichtschranke INT0 = PD2
'Lichtschranke INT1 = PD3