Forum: Mikrocontroller und Digitale Elektronik AVR Bascom Befehl Case div. Pins abfragen


von Joe S. (steini65)


Lesenswert?

Hallo Leute,

ich besuche Euer Forum schon länger, nun habe ich mich angemeldet. Ich 
habe hier eine Frage zu Bascom und dem Befehl case/select .

In Google habe ich nicht so die Lösung gefunden, da die  Listings für 
einen Anfänger sehr umfangreich und manchmal undurchsichtig sind.

Bitte nicht andere Lösungen wie if, then else usw. präsentieren.

Nur antworten zu case/select!

Danke

-------------------

Hier mein Programm.
Ich möchte jeweils einen Taster an PortC 0, 1, 2 anschliessen. Dieser 
schaltet gegen GND.

Ist Schalter 0 gedrückt leuchtet die LED z.B. 1 Sekunde.
Ist Schalter 1 gedrückt leuchtet die LED z.B. 3 Sekunde.
Ist Schalter 2 gedrückt leuchtet die LED z.B. 6 Sekunde.
.....
Ist Schalter 0 und 1 gedrückt leuchtet die LED z.B. x Sekunden.
usw.


Die LED leuchtet  aber nicht.


Entweder habe ich ein Problem beim maskieren oder Do sitzt an der 
falschen Stelle. Als Anfänger bin ich da ein bisschen verloren.
Kann mir bitte jemand behilflich sei?

-------------------


$regfile = "m8def.dat"                         'ATmega8-Deklarationen
$crystal = 3686400                             'Quarz: 3,6864 MHz

Ddrc = &B00100000                              'Pin PC5 Ausgang,
                                               'Rest Eingang

Do
Portc = &B00001111                             'PullUp für Pin 
PC01/2/3/4
                                               'aktivieren



  Dim Eingabe As Byte


  Eingabe = &B00001111                         'gesamten Port abfragen
                                               'und maskieren

   Select Case Eingabe

      Case &B00000001:
         Portc.5 = 1                           'LED an (Pin PC5)
         wait 1

      Case &B00000011:
         Portc.5 = 1                           'LED an (Pin PC5)
         wait 3

      Case &B00000111:
         Portc.5 = 1                           'LED an (Pin PC5)
         wait 6

   End Select

Loop
End

von Klaus D. (kolisson)


Lesenswert?

Eingabe = Pinc                        'gesamten Port abfragen
                                               'und maskieren
Eingabe = Eingabe and &B00001111

von MWS (Gast)


Lesenswert?

Würd' mal sagen:
1
If Eingabe <> PortC Then
2
  Geht Nicht
3
Else
4
  Nix kapiert
5
End If

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Wenn du nur select-case haben willst, brauchst du für alle möglichen 
Fälle ein case.

      Case &B00000001: ' Nur Schalter 0
      Case &B00000011: ' Schalter 0 und Schalter 1
      Case &B00000111: ' Schalter 0, 1 und 2

plus...

      Case &B00000010: ' Nur Schalter 1
      Case &B00000100: ' Nur Schalter 2
      Case &B00000101: ' Schalter 0 und Schalter 2
      Case &B00000110: ' Schalter 1 und Schalter 2

ADD:
Eingabe = PINC and &B00000111

von Stefan B. (stefan) Benutzerseite


Lesenswert?

ADD2: Ich sehe gerade, dass du Pullups an PORTC benutzt, d.h. die 
Schalter sind active low geschaltet. Dann müssen die case invertiert 
sein, denn 0 bedeutet beträtigter Schalter und 1 nicht betätigter 
Schalter.

Bei
Eingabe = PINC and &B00000111

Also
      Case &B00000110: ' Nur Schalter 0
      Case &B00000100: ' Schalter 0 und Schalter 1
usw.

von Joe S. (steini65)


Lesenswert?

Ist es besser oder einfacher die Taster gegen + zu schalten?
wie
http://halvar.at/elektronik/kleiner_bascom_avr_kurs/schalter_anschliesen/

Dann würde halt je Taster ein externer R benötigt was ja kein Problem 
wäre.

Das andere probiere ich noch aus.
Danke.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Joe Joe schrieb:

> Ist es besser oder einfacher die Taster gegen + zu schalten?

Nö. Das passt schon wie es ist: Du brauchst keine externen Widerstände 
und im Code ist es nur eine andere Schreibweise. Der active high Fall 
(s. AVR-GCC-Tutorial im IO-Kapitel) ist mehr Aufwand.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.