Hallo,

ich befasse mich seit wenigen Wochen mit der Programmierung von Microcontrollern. Mein Anfangsprojekt ist ein kleines Testboard für den ATmega8 um erstmal ein bisschen "rumzuspielen" (der ganz gewöhnliche Einstieg mit LED und Tastern eben).
Funktioniert auch bis jetzt ganz prima.

Bei meinen Versuchen bin ich jedoch nun auf ein kleines Problem gestoßen. In der Forum-Suche habe ich einen Treffer für ein scheinbar ähnliches Problem gefunden, hilft aber leider nicht weiter.

Ich benutze einen ATmega 8 mit internem Takt (1MHz), an Port B sind die obligatorischen LED angeschlossen, am Port D die Taster (gegen Masse, interne Pull-Up's).
Die Taster sollen die LED's in verschiedenen Arten ein- und ausschalten (Schalterfunktion, Tasterfunktion). Ich hoffe, die Funktion der verschiedenen Taster erschließt sich aus dem Code.
Code:
'************************************************************************************************************
'Program: Taster
'************************************************************************************************************

$regfile = "m8def.dat"
$crystal = 1000000
$baud = 19200

RESET UCR.3
RESET UCR.4

Declare Sub Taste_1                                                   'Deklaration Unterprogramm für Taste Nr. 1
Declare Sub Taste_2                                                   'Deklaration Unterprogramm für Taste Nr. 2
Declare Sub Taste_3                                                   'Deklaration Unterprogramm für Taste Nr. 3
Declare Sub Taste_4                                                   'Deklaration Unterprogramm für Taste Nr. 4
Declare Sub Taste_5                                                   'Deklaration Unterprogramm für Taste Nr. 5
Declare Sub Taste_6                                                   'Deklaration Unterprogramm für Taste Nr. 6
Declare Sub Taste_7                                                   'Deklaration Unterprogramm für Taste Nr. 7
Declare Sub Taste_8                                                   'Deklaration Unterprogramm für Taste Nr. 8
Declare Sub LED_Test(byval T1 As Integer)                             'Deklaration Unterprogramm LED-Test

Dim T_1 As Bit                                                        'Variable für Zustand der Taste Nr. 1
Dim T_2 As Bit                                                        'Variable für Zustand der Taste Nr. 2
Dim T_3 As Bit                                                        'Variable für Zustand der Taste Nr. 3
Dim T_4 As Bit                                                        'Variable für Zustand der Taste Nr. 4
Dim T_5 As Bit                                                        'Variable für Zustand der Taste Nr. 5
Dim T_6 As Bit                                                        'Variable für Zustand der Taste Nr. 6
Dim T_7 As Bit                                                        'Variable für Zustand der Taste Nr. 7
Dim T_8 As Bit                                                        'Variable für Zustand der Taste Nr. 8
Dim I as Byte                                                         'Variable für Portausgang
Dim N as Integer                                                      'Laufvariable
Dim Taster_Nummer As Integer                                          'Variable für Tastennummer


Config PortD = Input                                                  'Konfig. PortD als Eingang
Config PortB = Output                                                 'Konfig. PortB als Ausgang
Config Debounce = 30                                                  'Entprellzeit festlegen (ms)


PortD = &HFF                                                          'interne Pullup's einschalten
PortB = &HFF                                                          'Ausgänge PortB auf 1 setzen
T_1 = 0                                                               'Variablen initialisieren
T_2 = 0
T_3 = 0
T_4 = 0
T_5 = 0
T_6 = 0
T_7 = 0
T_8 = 0

call LED_Test(300)                                                    'Aufruf LED-Test

Do

  For N = 1 To 8
      Taster_Nummer = N
      Select Case Taster_Nummer
      Case 1 : Debounce PinD.0 , 0 , Taste_1 , Sub                    'Abfrage Taste D0, Taste Nr. 1
      Case 2 : Debounce PinD.1 , 0 , Taste_2 , Sub                    'Abfrage Taste D1, Taste Nr. 2
      Case 3 : Debounce PinD.2 , 0 , Taste_3 , Sub                    'Abfrage Taste D2, Taste Nr. 3
      Case 4 : Debounce PinD.3 , 0 , Taste_4 , Sub                    'Abfrage Taste D3, Taste Nr. 4
      Case 5 : Debounce PinD.4 , 0 , Taste_5 , Sub                    'Abfrage Taste D4, Taste Nr. 5
      Case 6 : Debounce PinD.5 , 0 , Taste_6 , Sub                    'Abfrage Taste D5, Taste Nr. 6
      Case 7 : Debounce PinD.6 , 0 , Taste_7 , Sub                    'Abfrage Taste D6, Taste Nr. 7
      Case 8 : Debounce PinD.7 , 0 , Taste_8 , Sub                    'Abfrage Taste D7, Taste Nr. 8
      End Select
   Next




Loop


'*******************************************
'Unterprogramm Taste_1
'*******************************************
Sub Taste_1
    If T_1 = 0 Then
       T_1 = 1
       PortB.0 = 0
    Else
        T_1 = 0
        PortB.0 = 1
    End If
    'Waitms 100
End Sub


'*******************************************
'Unterprogramm Taste_2
'*******************************************
Sub Taste_2
    PortB.1 = 0
    Waitms 100
    PortB.1 = 1
End Sub


'*******************************************
'Unterprogramm Taste_3
'*******************************************
Sub Taste_3
    If T_3 = 0 Then
       T_3 = 1
       PortB.2 = 0
    Else
        T_3 = 0
        PortB.2 = 1
    End If
    'Waitms 100
End Sub


'*******************************************
'Unterprogramm Taste_4
'*******************************************
Sub Taste_4
    PortB.3 = 0
    Waitms 100
    PortB.3 = 1
End Sub


'*******************************************
'Unterprogramm Taste_5
'*******************************************
Sub Taste_5
    PortB.4 = 0
    Waitms 150
    PortB.4 = 1
End Sub


'*******************************************
'Unterprogramm Taste_6
'*******************************************
Sub Taste_6
    If T_6 = 0 Then
       T_6 = 1
       PortB.5 = 0
    End If
End Sub


'*******************************************
'Unterprogramm Taste_7
'*******************************************
Sub Taste_7
    If T_6 = 1 Then
       T_6 = 0
       PortB.5 = 1
    End If
End Sub


'*******************************************
'Unterprogramm Taste_8
'*******************************************
Sub Taste_8
    If T_8 = 0 Then
       T_8 = 1
       PortB.7 = 0
    Else
        T_8 = 0
        PortB.7 = 1
    End If
    'Waitms 100
End Sub


'*******************************************
'Unterprogramm LED-Test
'*******************************************
Sub LED_Test(byval T1 As Integer byval)

   PortB = &HFF                                                       'alle LED's aus
   Print "LED AUS!"
   Waitms T1
   PortB = &H00                                                       'alle LED's an
   Print "LED AN!"
   Waitms T1
   PortB = &HFF                                                       'alle LED's aus
   Print "LED AUS!"
   Waitms T1
   PortB = &H00                                                       'alle LED's an
   Print "LED AN!"
   Waitms T1
   PortB = &HFF                                                       'alle LED's aus
   Print "LED AUS!"
   Waitms T1
   PortB = &H00                                                       'alle LED's an
   Print "LED AN!"
   Waitms T1
   PortB = &HFF                                                       'alle LED's aus
   Print "LED AUS!"
   Waitms T1

End Sub



End
Bis auf den an D.1 angeschlossenen Taster funktioniert die Schaltung. Bei Betätigung des Tasters an D.1 scheint in den meisten Fällen das Programm von vorn zu starten (Abbruch / Reset?), manchmal (eher selten) funktioniert die Tastenfunktion, zumindest solange, bis nach 2-3 maliger Betätigung wieder ein Neustart erfolgt.

Ich habe das Board schon überprüft (kein Kurzschluß, keine Unterbrechung, ...), habe die Leiterbahnen direkt am Portpin aufgetrennt und einen anderen Taster angeschlossen, habe einen anderen ATmega8 benutzt - ohne Erfolg!

In der Beschreibung zum ATmega8 und auch in der BASCOM-Hilfe steht, daß dieser Pin auch für die RS-232-Schnittstelle benutzt wird (Signal Tx -> Ausgang).
"• TXD – Port D, Bit 1
TXD, Transmit Data (Data output pin for the USART). When the USART Transmitter is enabled, this pin is configured as an output regardless of the value of DDD1."

Leider konnte ich an diesen Quellen bislang nicht finden, wie der USART Transmitter generell enabled oder disabled werden kann. Ich glaube schon, daß hier mein Problem verursacht wird.

Auch kann ich zur Zeit nicht überprüfen, ob die Angabe in der BASCOM-Hilfe
"When pins TXD and RXD are not used for RS-232 they can be used as an input or output pin.
No PRINT, INPUT or other RS-232 statement may be used in that case. The UCR register will by default not set bits 3 and 4 that enable the TXD and RXD pins for RS-232 communication. It is however reported that this not works for all chips. In this case you must clear the bits in the UCR register with the following statements:
RESET UCR.3
RESET UCR.4"
wirklich weiterhilft, da ich erst am Wochenende weiterbasteln kann.
Ich habe auch bislang noch keinen Code hier im Roboternetz gefunden, der diese Anweisungen benutzt.

Auf meinem Board ist keine zusätzliche Hardware für die RS-232-Schnittstelle vorhanden, es ist auch sonst nichts anderes an D.1 angeschlossen.

Weitere Daten:
Win XP prof. SP2, Bascom 1.11.7.7 (vollversion), Eigenbau ISP Programmer (Parallelport)

Wäre sehr dankbar, wenn mir jemand hilfreich unter die Arme greifen könnte.

Viele Grüße

Finor