- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 7 von 7

Thema: Einfaches Timing-Programm - brauche Hilfe

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    17.01.2006
    Ort
    Homberg (Efze)/Nordhessen
    Alter
    39
    Beiträge
    207

    Einfaches Timing-Programm - brauche Hilfe

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hi

    Ich möchte ein Programm schreiben, bei dem ein ATmega 8 drei Relais schaltet, und zwar für eine genau definierte Zeit (nennen wir sie im folgenden t1). Die Relais sollen angesteuert werden, wenn taster 1 oder 2 gedrückt werden. Und zwar soll nur relais 1 anziehen, wenn taster 1 gedrückt wird, und relais 2 und 3 soll anziehen wenn taster 2 gedrückt wird. Relais 3 soll aber verzögert (Verzögerungszeit: t2)nach relais 2 anziehen. Des weiteren soll eine weitere zeit t3 integriert werden, die=0 ist, wenn einer der taster zum zweiten mal hintereinander betätigt wird. Wird erst Taster 1 und dann taster 2 betätigt, soll t3=20 ms sein.
    Die Zeit t1 wird vorgegeben von einem Drehschalter S1, er sagt dem MC wie lange Relais 1 und 2 schalten sollen. Je nachdem in welcher Stellung der Drehschalter (nicht Poti!) ist wird eben Eingangspin 0....7 auf low gezogen, und das Programm bekommt die dementsprechende Zeit mitgeteilt (z.b. 10ms bei stellung 1, 20 bei stellung 2 usw.).
    Die Zeit t2 soll genauso über einen zweiten Drehschalter eingestellt werden können.
    Ich brauche jetzt keinen ganzen Quelltext, sondern hänge nur an einem Problem: wenn ich mit dem Befehl "dim Time as Byte" arbeite, und dann sage If ... then time = 20 ... waitms time , dann funktioniert das ganze, allerdings nur mit genau einer zeit Time. jetzt habe ich aber 3 Zeiten und nur einmal die Variable Time. Ich habe es versucht mit dem Befehl "dim t2 as byte" und "dim t3 as byte", allerdings funktioniert es da nicht. Kann mir jemand Helfen?

    Gruß Paul

  2. #2
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    17.02.2005
    Ort
    NRW-Bergisches Land
    Beiträge
    311
    Wieso sollte dies mit "Dim t2 as Byte" nicht gehen?
    Mich wundert eher, dass es mit "Dim Time....." gehen soll, denn Time ist ja ein Reserved Word also für einen Variablen Namen nicht geeignet.
    Deine Drehschalterabfrage würde ich mit Select Case machen, da du mehrere möglichkeiten hast.
    Gruß RePi!


    *** Holzhacken ist deshalb so beliebt, weil man bei dieser Tätigkeit den Erfolg sofort sieht. ***
    *** (Albert Einstein) ***

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    17.01.2006
    Ort
    Homberg (Efze)/Nordhessen
    Alter
    39
    Beiträge
    207
    Hi

    Also es will einfach nicht funktionieren. Habe mal das Listing gepostet, vielleicht kann jemand einen fehler erkennen. Habe jetzt einfachheitshalber mal nur mit t1 geschrieben, denn nicht mal so funktioniert es.

    $regfile = "m8def.dat"
    $crystal = 1000000 'ATmega8-Deklarationen 'Quarz: 16,000 MHz

    Declare Sub Runter
    Declare Sub Hoch
    '
    Ddrb = &B00111000 'Pin Pb5,4,3 Ausgang, rest Eingang
    Portb = &B11000111 'Pullups der Eingänge aktiviert
    Ddrd = &B00000000 'Pins von Portd=Eingänge (Drehschalter)
    Portd = &B11111111 'PullUp von Pin PD0+1+rest aktivieren
    '----------------------------------------------------------

    Dim T1 As Byte

    '----------------------------------------------------------
    Do

    If Portb.0 = 0 Then
    T1 = 10
    End If

    If Portd.7 = 0 Then
    T1 = 20
    End If

    If Portd.6 = 0 Then
    T1 = 30
    End If

    If Portd.5 = 0 Then
    T1 = 40
    End If

    If Portd.4 = 0 Then
    T1 = 50
    End If

    If Portd.3 = 0 Then
    T1 = 60
    End If

    If Portd.2 = 0 Then
    T1 = 70
    End If

    Debounce Pinb.1 , 0 , Runter , Sub
    Debounce Pinb.2 , 0 , Hoch , Sub 'Entprellter Eingabetaster

    Loop
    '----------------------------------------------------------
    Sub Runter



    Portb.3 = 1

    Waitms T1 'Eingestellte Schaltzeit
    Portb.3 = 0
    End Sub

    Sub Hoch



    Portb.5 = 1
    Waitms 100 'Vorschaltzeit
    Portb.4 = 1
    Waitms T1 'Eingestellte Schaltzeit
    Portb.4 = 0
    Portb.5 = 0 'Ausgänge in Leerlaufzustand schalten
    End Sub


    End

  4. #4
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    17.01.2006
    Ort
    Homberg (Efze)/Nordhessen
    Alter
    39
    Beiträge
    207
    Hi Leute

    Kann mir niemand weiterhelfen? Ich bin am verzweifeln
    Vielleicht ist es ein einfacher Programmierfehler, ich bin noch nicht sehr lang im Geschäft und beherrsche Bascom nicht wirklich gut.
    Der Syntax Check meldet jedenfalls keine Fehler... kann jemand vielleicht ein Beispiellisting posten (von dem Teil wo´s drauf ankommt)? Wäre echt super.

    Gruß Paul

  5. #5
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    17.02.2005
    Ort
    NRW-Bergisches Land
    Beiträge
    311
    Da sehe ich schon mal eine Sache zum Thema Debounce.
    Die Hilfe sagt doch wie es geht.
    Nicht "Sub Hoch" sondern "Hoch:"
    Nicht "End Sub" sondern "Return".
    Was sagt der Simulator zu deinem Prog?
    Der ist für so etwas auch sehr brauchbar.
    Gruß RePi!


    *** Holzhacken ist deshalb so beliebt, weil man bei dieser Tätigkeit den Erfolg sofort sieht. ***
    *** (Albert Einstein) ***

  6. #6
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    17.01.2006
    Ort
    Homberg (Efze)/Nordhessen
    Alter
    39
    Beiträge
    207
    Hi

    Also ich hab jetzt herausgefunden, dass das Programm an sich eigentlich funktioniert. Wenn ich die Portpins nacheinander softwareseitig setze, dann arbeitet mir der µC das Programm auch genau wie gewünscht ab, je nachdem welcher Portpin simultan für den Drehschalter gesetzt wurde. Hardwareseitig werden die Pins auch vom Drehschalter auf low gezogen, ich messe 0 V am jeweiligen Pin. Aber das Programm ignoriert diese Tatsache vollkommen. Es ist wie wenn die Pins im Programm nicht als Eingänge definiert wären... sind sie doch aber. Wodran kann denn das bitte noch liegen? Ich hab schon active high und active low programmiert - nichts. Ich hab auch mal ausprobiert ob das ddregister vielleicht andersherum funktioniert (1= Eingan) - auch nichts. Mir ist das echt ein Rätsel...

  7. #7
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    17.01.2006
    Ort
    Homberg (Efze)/Nordhessen
    Alter
    39
    Beiträge
    207
    Hallo nochmal...
    Ich glaube ich hab den Fehler gefunden. Wie oben zu sehen hab ich bei den Drehschalterpins "If PORTD.x=..."
    Ich habs mal umgeschrieben in "If PIND.x=..." und oh wunder.... der geht!!!
    Allerdings auch nur, wenn man den Befehl in das Sub schreibt, wenn er in der Hauptschleife steht wird er irgendwie auch ignoriert...
    Jetzt hab ich zwar mein Problem gelöst, würde mich aber trotzdem über eine kurze Nachhilfe freuen, damit ich auch weiß warum das denn so nicht gefunzt hat.

    Gruß Paul

Berechtigungen

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

Labornetzteil AliExpress