-         

Ergebnis 1 bis 7 von 7

Thema: Controller Programmierung Verständniss+Problem

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    05.04.2010
    Ort
    D-NRW
    Beiträge
    11

    Controller Programmierung Verständniss+Problem

    Anzeige

    hallo hab getsern meinen At mega 32 fertig mit der Platine verlötet funktioniert einwandfrei \/

    >bin anfänger in Bascom hab aber schon erfahrung in programmierung also bin nicht ganz blöd<

    habe momentan fast genau sowas
    http://www.rn-wissen.de/images/3/30/...g_mitquarz.gif

    ich bin vorher nach einem turtorial gegangen
    wo der taster als input genommen wird und bei druck auf den taster leuchtet die LED solange man den taster hält...

    mein versuch das prog etwas zu erweitern und bei druck auf den taster einen ablauf zu zu erzeugen...

    Problem: die led blinkt von selbst los bei druck auf taster leuchtet sie normal


    sieht bei mir so aus:
    ,,,,

    Config Portc.0 = Output

    Config Pina.7 = Input
    Porta.7 = 1



    Do
    If Pina.7 = 1 Then
    Portc.0 = 1
    Waitms 100
    Portc.0 = 0
    Waitms 100
    Portc.0 = 1
    Wait 1
    Portc.0 = 0
    Wait 1
    Portc.0 = 1

    Else
    Portc.0 = 0

    End If


    Loop

    End


    meine bitte währe mir einen tipp zu geben und mich evtl auf eine seite zu verweisen wo ich das lernen kann besser mit befehlen umzugehen hab nur die standart sachen gefunden

    ____________
    gruß deable

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    705
    Moin deable,

    mit den Befehlen liegst Du schon ganz gut - nur muss man bei "typischem" Anschluss von einem Taster und einer LED zweimal umdenken:

    Dein Taster zieht den Eingang ja nicht auf +5V, sondern auf GND. Das macht man eigentlich immer so, weil die Controller PullUp-Widerstände eingebaut haben, die den Anschluss erstmal auf einen sauberen High-Pegel ziehen. Natürlich könntest Du den Taster auch auf +5V legen und mit einem externen PullDown-Widerstand arbeiten - aber so spart man halt ein Bauteil.
    Den Tastendruck erkennst Du also daran, dass PINA.7 = 0 wird (Umdenken Nr. 1).

    Bei gedrücktem Taster wird also nur der Teil hinter dem "else" ausgeführt - aber warum ist die LED dann an?

    Das liegt darn, dass die LED nicht vom I/O-Port nach Masse geht, sondern von +5V zum I/O-Port! Heißt im Klartext, dss die LED angeht, wenn der Port 0 wird (Umdenken Nr. 2).

    Auch hierfür gibt´s einen guten Grund: Der Strom, den ein I/O-Port nach Masse ableiten kann wenn er LOW ist, ist größer als der Strom den er abgeben kann, wenn er HIGH ist. Wenn man also ohne Treiberstufe o.ä. "Endverbraucher" wie LEDs direkt ansteuern möchte, ist es daher ratsam, sie zwischen +5V und dem PORT zu schalten.

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    05.04.2010
    Ort
    D-NRW
    Beiträge
    11
    hallo Sauerbruch

    funktioniert jetzt bestens

    wollte mal aussprechen das ich das sehr gut finde das leute wie du sich hier die zeit nehmen und so gut weiterhelfen


    danke ^^

    _________
    gruß d3a6le

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    05.04.2010
    Ort
    D-NRW
    Beiträge
    11
    ich hoffe das ist in odnung wenn ich noch eine fragen hier aufliste....

    ich möchte versuchen den controller jetzt so zu programmieren das die led bei einem einfachen druck die x abfolge macht und bei 2sec halten die y abfolge macht .. ist das realisierbar?

    welcher befehl passt

    habe an sowas gedacht wie:


    If Pina.7 = 0 for 2 Then
    Portc.0 = 0
    or if Pina.7 = 0 then.....

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    705
    ich hoffe das ist in odnung wenn ich noch eine fragen hier aufliste....
    Klar ist das in Ordnung - dafür ist so´n Forum ja da!

    Wenn man es sich leisten kann, dass der Controller währenddessen nichts anderes macht als Warten, kann man Zeiten in Bascom ganz gut mit den Befehlen

    wait x (X Sekunden)
    waitms x (X Millisekunden)
    waitus x (X Mikrosekunden)

    messen. Die sind zwar nicht 100% genau, aber für solche Taster-Geschichten allemal ausreichend. Man könnte also ein wait 2 schreiben, und danach den Taster erneut abfragen. Ist er immernoch gedrückt -> Aktion 1, andernfalls Aktion 2. Das hat natürlich den gravierenden Nachteil, dass auch nach einem kurzen Druck die vollen 2 Sekunden gewartet werden, was vielleicht extrem nervig sein könnte.

    Etwas aufwendiger aber komfortabler ist es, eine Variable z.B. alle 0,1 Sekunden hochzählen zu lassen, so lange wie der Taster gedrückt ist. Nachdem der Taster losgelassen wurde fragt man sie ab, und ist sie unter 20 -> Aktion 1, ansonsten Aktion 2. Als Code könnte das so aussehen:

    Code:
    ...
    ...
    Dim Z as Byte
    
    Do
    ..
    ..
    If PIND.7 = 0 then
      Zahl = 0
        While PIND.7 = 0
        Zahl = Zahl + 1
        waitms 100
        Wend
      
      If Zahl < 20 then
        ...
        ...
        ...
      Else
        ...
        ...
        ...
      End if
    
    End if
    
    Loop
    Wenn Du in Bascom auf den Button mit dem blauen Fragezeichen klickst, geht die Hilfe auf. Und dort gibt es das Kapitel "Bascom Language Reference". Da kann man nicht nur sehen, was es alles an interessanten Möglichkeiten gibt, sondern es sind zu fast allen Befehlen auch einleuchtende Beispiele angegeben. Da solltest Du unbedingt mal reinschauen!

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    05.04.2010
    Ort
    D-NRW
    Beiträge
    11
    ich bevorzuge die komfortable variante

    bei dem code hab ich jedoch probleme
    ich zähl mal mein verständiss und gleichzeitig nicht verständiss auf

    Dim Z as Byte : was bedeutet das?

    If PIND.7 = 0 then : wenn taster gedrückt dann zahl = 0 (zahl alias??? ist ja eng eig.)
    während der taster gedrückt ist +1 sec
    wartet 100 ms

    wend verstehe ich auch trotz help nicht

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    705
    Sorry - das kommt davon, wenn man > 1 Sache gleichzeitig macht

    Es muss natürlich heißen

    Dim Zahl as Byte

    Wenn der Controller mit Variablen arbeiten soll, muss für jede Variable 1. ein Name (fast beliebig) und 2. ein geeigneter Variablen-Typ festgelegt werden. Gängige Typen sind z.B.

    Bit (0 oder 1)
    Byte (8 Bits, d.h. die Variable kann Werte von 0 bis 255 annehmen)
    Word (16 Bits, d.h. die Variable kann Werte von 0 bis 65.535 annehmen)
    Integer (16 Bit, kann Werte von-32.768 bis +32.767 annehmen)

    Mit "Dim Zahl as Byte" wird eine Byte-Variable angelegt.

    While-Wend-Schleifen werden so lange durchaufen, wie die While-Bedingung erfüllt ist. In diesem Code heisst das, dass alle 100ms die Variable "Zahl" um eins erhöht ist - solange PIND.7=0 bleibt.

    Lässt Du den Taster los ist PIND.7=1, und die While-Wend-Schleife wird augenblicklich verlassen. Dann muss man nur noch checken ob die Variable Zahl < 20 oder > 20 ist, und schon weiß man, ob der Taster länger als 2 Sek. gedrückt wurde oder eben nicht.

    Die Variable behält ihren Wert aber erstmal weiter - und deshalb muss man sie unbedingt zurücksetzen, wenn der nächste Tsterdruck erfolgt. Sonst würde der Controller ganz gelassen vom alten Wret aus weiterzählen - und die Variable hätte einen falsch hohen Wert. Deshalb steht zwischen "If PIND.7=0" und der While-Wend-Schleife die Anweisung "Zahl = 0".

    Jetzt klarer??

Berechtigungen

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