Hallo zusammen,
Zur Einleitung: ich benutze die Evaluations Boards von Pollin (da schalten die Tasten nach +5V(!) und offen liegt der Kontakt über 33k||330n auf Masse) und einen Atmega8.
Ich komme bei folgendem Problem nicht weiter:
ich möchte beim Atmega8 den Port D weitestgehend mit benutzen. Nun bin ich schon am Anfang steckengeblieben.
Ich wollte mit 4 Pins (PinD.0, PinD.1 PinD.4 und PinD.5) über 4 Taster zwei Variablen herauf- und herunterzählen (PinD.1 und PinD.2 sind wohl die Externen Interrupts, die brauche ich noch).
Kurz und schmerzvoll - ich bekomme lediglich PinD.1 und PinD.4 als Eingänge über die ersten zwei Tasten angesprochen.
PinD.0 scheint permanent als Ausgang auf H zu liegen und der Rest reagiert nicht (die Tastensignale liegen aber an den Pins lauf Logiktester an).
Nun sehe ich im Datenblatt des Atmga8, dass sich auf den Pins allerlei "Alternate Functions" tummeln, das Abschalten derselben bekomme ich aber nicht hin, ausserdem "hinkt" mein Englisch ziemlich.
Also meine Frage: wie kann ich die Pins trotzdem als normale Eingäng nutzen?
Hier mein Code bis jetzt:
Ich bin für jede Hilfe dankbar.
Grüße
Knut
Zur Einleitung: ich benutze die Evaluations Boards von Pollin (da schalten die Tasten nach +5V(!) und offen liegt der Kontakt über 33k||330n auf Masse) und einen Atmega8.
Ich komme bei folgendem Problem nicht weiter:
ich möchte beim Atmega8 den Port D weitestgehend mit benutzen. Nun bin ich schon am Anfang steckengeblieben.
Ich wollte mit 4 Pins (PinD.0, PinD.1 PinD.4 und PinD.5) über 4 Taster zwei Variablen herauf- und herunterzählen (PinD.1 und PinD.2 sind wohl die Externen Interrupts, die brauche ich noch).
Kurz und schmerzvoll - ich bekomme lediglich PinD.1 und PinD.4 als Eingänge über die ersten zwei Tasten angesprochen.
PinD.0 scheint permanent als Ausgang auf H zu liegen und der Rest reagiert nicht (die Tastensignale liegen aber an den Pins lauf Logiktester an).
Nun sehe ich im Datenblatt des Atmga8, dass sich auf den Pins allerlei "Alternate Functions" tummeln, das Abschalten derselben bekomme ich aber nicht hin, ausserdem "hinkt" mein Englisch ziemlich.
Also meine Frage: wie kann ich die Pins trotzdem als normale Eingäng nutzen?
Hier mein Code bis jetzt:
Code:
$regfile = "m8def.dat" 'definieren des verwendeten Chips
$framesize = 64
$swstack = 64
$hwstack = 64
$crystal = 8000000 'definieren des verwendeten externen Quarz (8MHz)
'B.0 bis B.7 alle auf Ausgang ohne Pullup, hier hängt das LCD dran
Ddrb = &B11111111
Portb = &B00000000
'C.0 Eingang fürs Poti, C.1 bis C.5 alle auf Ausgang(c.6 Und C.7 sind nicht zu Benutzen - > Quarzanschluss)
Ddrc = &B00111110
Portc = &B00000000 'ohne Pullup,
Ddrd = &B00000000 'PD0-PD3 Eingang, PD4-PBD7 Eingang
Portd = &B00000000 'PullUp für die Eingänge inaktiv
'------------ Konstanten ---------
Const Falsch = 0
Const Wahr = 1
'------
Enable Interrupts
'LCD konfigurieren
Config Lcd = 16 * 2 'geht auch mit 8 * 2 Display
Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.4 , Rs = Portb.5
Config Lcdbus = 4
Cursor Off Noblink
Dim Poti1 As Word
Dim Twarte As Byte , Tdimme As Byte 'Die Aktionszeiten in Minuten, werden über die Taster gestellt
'Testvorbelegung
Twarte = 3
Tdimme = 3
Tasterwtup Alias Pind.1 'Taster WaitTime Up
Tasterwtdn Alias Pind.4 'Taster WaitTime Down
Tasterdtup Alias Pind.5 'Taster DimmTime Up
Tasterdtdn Alias Pind.6 'Taster DimmTime Down
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc
'Acsr.7 = 1
'............ SUSs ..............................
Declare Sub Zeileclear(byval Zn As Byte) 'eine Zeile löschen
Declare Sub Zweizeilenclear 'beide Zeilen löschen
Cls
'--------- Hauptschleife -----------------------
Do
If Tasterwtup = 1 Then
Bitwait Tasterwtup , Reset
Incr Twarte
End If
If Tasterwtdn = 1 Then
Bitwait Tasterwtdn , Reset
Decr Twarte
End If
If Tasterwtup = 1 Then
Bitwait Tasterdtup , Reset
Incr Tdimme
End If
If Tasterwtup = 1 Then
Bitwait Tasterdtdn , Reset
Decr Tdimme
End If
Poti1 = Getadc(0)
Call Zweizeilenclear
Locate 1 , 2
Lcd Poti1
Locate 2 , 1
Lcd "W" ; Twarte ; "/" ; "D" ; Tdimme
Waitms 200
Loop
End
'--------- ENDE Hauptschleife -----------------------
'>>>>>>>>>>>>>>>>> SUBs >>>>>>>>>>>>>>>>>>>>>>>
'eine Zeile löschen
Sub Zeileclear(zn As Byte)
Locate Zn , 1
Lcd " "
End Sub
'beide Zeilen löschen
Sub Zweizeilenclear
Locate 1 , 1
Lcd " "
Locate 2 , 1
Lcd " "
End Sub
'<<<<<<<<<<<<<< END SUBs <<<<<<<<<<<<<<<<<<<<<<<<
Ich bin für jede Hilfe dankbar.
Grüße
Knut