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.
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.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
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







Zitieren

Lesezeichen