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
Lesezeichen