- 12V Akku mit 280 Ah bauen         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 19 von 19

Thema: Eingänge ständig abfragen mit Bascom

  1. #11
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.09.2007
    Beiträge
    101
    Anzeige

    Powerstation Test
    Ja, Danke!
    Ich hab inzwischen die Logischen Operatoren gefunden und ausprobiert.
    Genauso werd ich das auch versuchen.

  2. #12
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.09.2007
    Beiträge
    101
    Noch eine dämliche Frage?
    Warum wird mir am LCD nichts angezeigt, wenn ich eine Taste drücke?
    Unten bei LCD Eingang
    oder LCD PortD
    Müßte da nicht eine 2 kommen, wenn ich die Taste 1 betätige?


    $regfile = "8515def.dat"
    $crystal = 4000000
    Config Lcd = 20 * 4
    Config Lcdmode = Port
    Config Lcdbus = 4
    Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6
    Config Lcdpin = Pin , Db7 = Portc.7 , E = Portc.3 , Rs = Portc.2
    Baud = 9600

    '--- Definitionen
    Dim A As Byte
    Dim B As Byte
    Dim C As Byte
    Dim Eingang As Byte

    '-- PortD.0 bis PortD.7 als Input (Taste 0...7) konfigurieren
    Config Portd = Input
    Config Portb = Output

    '-- Alle Leds ausschalten. Wegen pullup ist 0= eingeschaltet
    Set Portb.0
    Set Portb.1
    Set Portb.2
    Set Portb.3
    Set Portb.4
    Set Portb.5
    Set Portb.6
    Set Portb.7
    Cls


    Main:

    Do
    A = 10 And 2 'Ergebnis 2
    B = 10 Or 2 'Ergebnis 10
    C = 10 Xor 2 'Ergebnis 8

    Cls
    Locate 1 , 1
    Lcd A
    Waitms 500

    Locate 2 , 1
    Lcd B
    Waitms 500

    Locate 3 , 1
    Lcd C
    Waitms 500

    ' keine Anzeige wenn eine Taste gedrückt wird? Warum?

    Eingang = Portd
    Locate 4 , 1
    Lcd Eingang
    Lcd Portd

    Wait 3
    Loop
    End

  3. #13
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Beiträge
    2.731
    Hi,

    weil man die Eingänge an PinD einliest,
    PortD ist für den Ausgang

  4. #14
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.09.2007
    Beiträge
    101
    Danke!
    Und schon gehts.
    Gruß
    Hans

  5. #15
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.09.2007
    Beiträge
    101
    So schauts jetzt aus und es funktioniert.
    Danke an alle die mir geholfen haben!


    '///////////////////////////////////////////////////////////////////////////////
    'Die Taster 0,1,2,3 abfragen
    ' STK200 mit AT90S8515 und LCD- Display an PortC
    '///////////////////////////////////////////////////////////////////////////////
    $regfile = "8515def.dat"
    $crystal = 4000000
    Config Lcd = 20 * 4
    Config Lcdmode = Port
    Config Lcdbus = 4
    Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6
    Config Lcdpin = Pin , Db7 = Portc.7 , E = Portc.3 , Rs = Portc.2
    Baud = 9600
    Config Portd = Input
    Config Portb = Output
    '-- Alle Leds ausschalten. Wegen pullup ist 0= eingeschaltet
    Set Portb.0
    Set Portb.1
    Set Portb.2
    Set Portb.3
    Set Portb.4
    Set Portb.5
    Set Portb.6
    Set Portb.7
    Cls
    '///////////////////////////////////////////////////////////////////////////////
    'Achtung Eingänge mit PIND einlesen!
    'Wenn keine Taste gedrückt=255 . d.h. 0 wenn keine Taste betätigt
    ' Das sind die Möglichkeiten bei 4 Tastern
    ' 0 0 0 0 = 255
    ' 0 0 0 1 = 254
    ' 0 0 1 0 = 253
    ' 0 0 1 1 = 252
    ' 0 1 0 0 = 251
    ' 0 1 0 1 = 250
    ' 0 1 1 0 = 249
    ' 0 1 1 1 = 248
    ' 1 0 0 0 = 247
    ' 1 0 0 1 = 246
    ' 1 0 1 0 = 245
    ' 1 0 1 1 = 244
    ' 1 1 0 0 = 243
    ' 1 1 0 1 = 242
    ' 1 1 1 0 = 241
    ' 1 1 1 1 = 240
    '///// HAUPPROGRAMM /////////////////////////////////////////////////////////
    Zustand_eingaenge:
    Do
    If Pind = 255 Then Goto Kein_eingang_angesprochen

    Eingang_angesprochen:
    If Pind = 254 Then Goto E0
    If Pind = 253 Then Goto E1
    If Pind = 251 Then Goto E2
    If Pind = 247 Then Goto E3
    If Pind = 252 Then Goto E0_e1
    If Pind = 250 Then Goto E0_e2
    If Pind = 249 Then Goto E1_e2
    If Pind = 248 Then Goto E0_e1_e2
    If Pind = 246 Then Goto E0_e3
    If Pind = 245 Then Goto E1_e3
    If Pind = 244 Then Goto E0_e1_e3
    If Pind = 243 Then Goto E2_e3
    If Pind = 242 Then Goto E0_e2_e3
    If Pind = 241 Then Goto E1_e2_e3
    If Pind = 240 Then Goto E0_e1_e2_e3

    E0:
    Cls
    Locate 1 , 1
    Lcd "Eingang 0"
    Wait 2
    Goto Zustand_eingaenge

    E1:
    Cls
    Locate 1 , 1
    Lcd "Eingang 1"
    Wait 2
    Goto Zustand_eingaenge

    E2:
    Cls
    Locate 1 , 1
    Lcd "Eingang 2"
    Wait 2
    Goto Zustand_eingaenge

    E3:
    Cls
    Locate 1 , 1
    Lcd "Eingang 3"
    Wait 2
    Goto Zustand_eingaenge

    E0_e1:
    Cls
    Locate 1 , 1
    Lcd "Eingang 0 / 1"
    Wait 2
    Goto Zustand_eingaenge

    E0_e2:
    Cls
    Locate 1 , 1
    Lcd "Eingang 0 / 2"
    Wait 2
    Goto Zustand_eingaenge

    E1_e2:
    Cls
    Locate 1 , 1
    Lcd "Eingang 1 / 2"
    Wait 2
    Goto Zustand_eingaenge

    E0_e1_e2:
    Cls
    Locate 1 , 1
    Lcd "Eingang 0 / 1 / 2"
    Wait 2
    Goto Zustand_eingaenge

    E0_e3:
    Cls
    Locate 1 , 1
    Lcd "Eingang 0 / 3"
    Wait 2
    Goto Zustand_eingaenge

    E1_e3:
    Cls
    Locate 1 , 1
    Lcd "Eingang 1 / 3"
    Wait 2
    Goto Zustand_eingaenge

    E0_e1_e3:
    Cls
    Locate 1 , 1
    Lcd "Eingang 0 / 1 / 3"
    Wait 2
    Goto Zustand_eingaenge

    E2_e3:
    Cls
    Locate 1 , 1
    Lcd "Eingang 2 / 3"
    Wait 2
    Goto Zustand_eingaenge

    E0_e2_e3:
    Cls
    Locate 1 , 1
    Lcd "Eingang 0 / 2 /3"
    Wait 2
    Goto Zustand_eingaenge

    E1_e2_e3:
    Cls
    Locate 1 , 1
    Lcd "Eingang 1 / 2 / 3"
    Wait 2
    Goto Zustand_eingaenge

    E0_e1_e2_e3:
    Cls
    Locate 1 , 1
    Lcd "Eingang 0 / 1 / 3 / 3"
    Wait 2
    Goto Zustand_eingaenge

    '///// WENN KEIN EINGANG ANGESPROCHEN ////////////////////////////////
    Kein_eingang_angesprochen:
    Cls
    Lcd "Alle Eingange sind 0"
    Wait 1
    Loop
    ' Weiter im Programm ......
    End

  6. #16
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    11.04.2005
    Beiträge
    1.469
    Hi,
    soll jetzt keine Kritik am Programm sein...
    Alles was geht ist auch OK.

    Aber es ist schöner, das zB. mit Gosub/Return oder Sub zu machen.
    Das macht es etwas übersichtlicher, da die Haupschleife dann wesentlich kürzer ist.
    Bei so kleinen Programmen ist das eigentlich Egal, aber wenn du einige hundert Zeilen hast, dann ist ein Loop am Ende schon etwas blöd.

    Des weiteren wird dein LCD ja jede Sekunde komplett gelöscht, wenn keine Taste gedrückt wird.
    Das sieht unschön aus.
    Du könntest ein Bit setzen, wenn die Anzeige einmal "Alle Eingänge sind 0" angezeigt hat und das dann auswerten.
    Wenn eine Taste gedrückt wird, wird das Bit rückgesetzt.
    Dadurch kommt beim loslassen der Taste nur einmal die Anzeige und ist dann bis zum nächsten Tastendruck gesperrt.

    Gruß
    Christopher

  7. #17
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    19.07.2007
    Alter
    60
    Beiträge
    1.080
    Hallo Hans,

    man freu sich ja als Anfänger über alles was funktioniert - ging mir auch nicht anders, und meine ersten Programme sahen echt erheblich schlimmer aus als deine ...

    aber wie immer kann man einiges verbessern. ich glaube, dein programm funktioniert auch jetzt noch nicht optimal. wenn du eine taste drückst, und eine sekunde später eine andere, dann geht der tastendruck verloren, da das programm in der "wait 2" anweisung hängt.
    desweiteren musst du alle möglichen kombinationen an tastern abfragen, was viel code bedeutet und bei einem evtl. hinzukommenden taster dann wirklich unübersichtlich wird.

    hier aus dem bauch ein paar verbesserungen, ohne das getestet zu haben. ich sitze auch grade nicht an bascom, deswegen wirds sicherlich ein paar schreibfehler geben
    einiges könnte man auch kürzer machen, aber ich schreibe einiges etwas ausführlicher und dabei leider auch umständlicher

    $regfile = "8515def.dat"
    $crystal = 4000000
    Config Lcd = 20 * 4
    Config Lcdmode = Port
    Config Lcdbus = 4
    Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6
    Config Lcdpin = Pin , Db7 = Portc.7 , E = Portc.3 , Rs = Portc.2
    Baud = 9600
    Config Portd = Input
    Config Portb = Output

    '-- Alle Leds ausschalten. Wegen pullup ist 0= eingeschaltet
    portb = 255
    Cls

    dim tasten as byte
    tasten=255 'alle bits gesetzt. eine 0 bedeutet: taster gedrückt

    'interrupt configurieren. wird ca. 60 mal pro sekunde ausgelöst
    config timer0 = counter, prescale=256
    on timer0 tastenlesen
    enable interrupts

    do
    if tasten.0 = 0 then gosub t0
    if tasten.1 = 0 then gosub t1
    if tasten.2 = 0 then gosub t2
    if tasten.3 = 0 then gosub t3
    loop

    t0:
    'hier wird das gemacht, was taste 0 auslösen soll
    ...
    tasten.0 = 1 'taste wieder als ungedrückt markieren
    return

    t1:
    'hier wird das gemacht, was taste 1 auslösen soll
    ...
    tasten.1 = 1 'taste wieder zurücksetzen
    return

    t2:
    'hier wird das gemacht, was taste 2 auslösen soll
    ...
    tasten.2 = 1 'taste wieder zurücksetzen
    return

    t3:
    'hier wird das gemacht, was taste 3 auslösen soll
    ...
    tasten.3 = 1 'taste wieder zurücksetzen
    return

    tastenlesen:
    'interrupt-routine: wenn eine tasten gedrückt ist (=0) dann wird die null in der variablen "tasten" vermerkt
    'da es per interrupt geschiet, braucht es nicht in der hauptschleife zu stehen und funktioniert auch während das programm irgendwo in einer wait anweisung hängt
    if pind.0=0 then tasten.0 = 0
    if pind.1=0 then tasten.1 = 0
    if pind.2=0 then tasten.2 = 0
    if pind.3=0 then tasten.3 = 0
    return
    Mein Hexapod im Detail auf www.vreal.de

  8. #18
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.09.2007
    Beiträge
    101
    Danke für die Infos!
    Ich werd das Progrämmchen gleich mal nach euren Angaben optimieren und ausprobieren.
    Das von Meckpommer schaut gut aus, muss es aber erst mal einwirken lassen um es zu verstehen.
    Gruß
    Hans

  9. #19
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.09.2007
    Beiträge
    101
    Hallo Meckpommer,
    das mit den Interrupts funktioniert auch, wenn man
    das ENABLE TIMER0 einfügt.
    (Hab ich nach langer Sucherei im AVR-Buch Roland Walter gefunden)

    So recht versteh ich's allerdings noch nicht warum das geht.

    ...
    Config Timer0 = Timer , Prescale = 256
    Enable Timer0 <=== Das hier fehlt meine ich
    ...
    Alles Super, Danke!

Seite 2 von 2 ErsteErste 12

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test