- fchao-Sinus-Wechselrichter AliExpress    Werbung      
Ergebnis 1 bis 10 von 15

Thema: Attiny 13

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter Genie Avatar von HeXPloreR
    Registriert seit
    08.07.2008
    Ort
    Soltau - Niedersachsen
    Alter
    47
    Beiträge
    1.369
    Code:
    $regfile = "attiny13.dat"
    $crystal = 9600000
    $hwstack = 16
    $swstack = 8
    $framesize = 24
    Config Portb.2 = Input
    Config Portb.1 = Output
    Config Portb.0 = Output
    Do                                                            'endlosschleife
    Do                                                             'erste für motor 12V
    Dim W As Integer                                                'Variable festlegen
    Pulsein W , Pinb , 2 , 1                                            'Abfrage Fernsteuerung
    If W <= 150 Then                                                'alles unter 150 (cirka die Mitte) keine Aktion
    Portb.1 = 0                                                        'port bleibt aus
    End If
    If W > 150 And W <= 200 Then                            'alles über 150 und unter 200 Setzt port PB1 auf 5V
    Portb.1 = 1
    Waitms 1500 'besser hier warten, oder?? 1,5 Sekunden Warten dann PB1 auf 0V
    End If
    'Waitms 1500                                                 '1,5 Sekunden Warten dann PB1 auf 0V
    Portb.1 = 0
    Loop Until W > 150                                        'aus der ersten Schleife springen wenn W größer 150 ist
    
    'Hier dritt die Wartezeit auf obwohl keine engetragen ist 
    
    Do                                                            'zeite für Servosteuerung
    Config Servos = 1 , Servo1 = Portb.0 , Reload = 10            'servo configurieren
    Enable Interrupts                                                'Interrupts einschalten
    Dim I As Byte
    For I = 100 To 200
     Servo(1) = I
     'waitms 12 '?? oder höher wählen
    Next I
    For I = 200 To 100 Step -1
      Servo(1) = I
      Waitms 12  '?? oder höher wählen
    Next I
    Disable Interrupts                                                   'Ganz wichtig was du anschaltest solltest du auch ausschalten
    I = 100 
    Loop Until I = 100                                                   'aus der zweiten Schleife springen wenn I größer 100 ist
    
    
    'Das Teil wird Sporadisch komplett ausgelassen
    
    
    Dim Z As Integer                                                   'wert für Aussprung aus der dritten schleife festlegen
    Z = 0
    For Z = 1 To 300 'diese und nächste Zeile sind unsinnig
    Next Z
    Portb.1 = 1                                                           'PB1 auf 5V setzen
    Waitms 1500                                                  '1,5 Sekunden Warten dann PB1 auf 0V setzen
    Portb.1 = 0
    Loop Until Z = 300 'unsinnig mit For Z Schleife vorher - Z ist bereits 300 
    loop
    end
    Fehlt wohl mindestens noch ein Loop und End, oder?

    Wenn keine Wartezeit gewünscht ist dann sollte sie auch nur in einen optional aktiven Block gesetzt werden.
    Variablen können am Anfang des Codes gesetzt werden wenn sie eine bestimmte Nutzung haben sollen.

    Ich würde dir empfehlen mit dem Pulseout Befehl zu arbeiten anstatt den Servobefehl zu benutzen.
    Geändert von HeXPloreR (27.07.2015 um 15:39 Uhr)

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    03.03.2013
    Beiträge
    6
    Hallo

    Erst einmal herzlichen Dank für die schnellen Antworten. Suuper.

    Vieleicht hab ich mich unklar ausgedrückt darum noch mal.

    Das Programm soll nach dem es per Pulsein (wert wird von RC Fernsteuerung zur verfügung gestellt) einen Wert größer 150 erkannt hat das restliche Programm abarbeiten (ohne Pause zwischen den einzelnen Do Loop Teilen).
    Die waitms haben die Aufgabe
    W es soll der Port Pb1 für 1500ms = 1,5s auf 1 gesetzt werden so das für diese Zeit über ein Relais ein 12V Motor seine Arbeit auf nimmt.
    Das Funktioniert ganz ordentlich und wird gebraucht um über den wert Zeit einen Feinabgleich vornehmen zu Können da der Motor am Ende 10 mal exakt die beiden Schritte ausführen muss sonst würde sich durch die
    Verschiebung eine heftige Ungenauigkeit ergeben.

    Bevor jetzt der Bereich mit I abgearbeitet wird macht das Prog eine mir unerklärliche Pause. Normalerweise sollte Übergangslos von dem vorangehenden Do Loop zu diesem weiter gegangen werden , hier liegt mein
    erstes Problem . Die Do Loop Schleife wird korekt abgearbeitet die Wartezeit wird gebraucht für die Optik Schnell rein langsam raus , in der Art eines Stoßdämfers.

    Wenn I abgearbeitet ist soll der 12V Motor noch mal anlaufen um in die Startposition zurück zu kehren. Hier ist dann das 2. Problem , dieser Schritt wird völlig unvorhersehbar ausgeführt oder Komplett Ausgelassen.

    Valen du hast Recht ich weiß nicht sicher wo das Prog hängen bleibt , doch wenn W < 150 ist sollja nichts passieren (tut es auch nicht) erst wenn der Wert größer wird soll der Rest abgearbeitet werden. Am Pb1 liegt das Relais und an Pb0 der Servo.

    ober allgeier bitte sei mir nicht böse aber ich kann mit dem was du sagst im Moment noch nichts anfangen , der Compiler sagt gar nichts weil für ihn alles ok. ist sonst käme eine Fehlermeldung in Form "Error Fehler in Zeihle x"

    Thomas$ wie meinst du das , Do Loop ist die Schleife in der gewartet werden soll bis sich der Wert W ändert . Unter deinem Link ist noch nichts enthalten.

    HeXPloreR das erste wait in die IF Then zu setzen kann ich nachvolziehen und werde ich übernehmen . Das mit dem Servo habe ich oben noch mal erklärt wir haben es ausprobiert und es sieht fürs erste gut aus. Die letzte Schleife werde ich noch mal überarbeiten da es reichen müsste den Port Pb1 für benötigte Zeit auf 1 zu setzen und dann wieder auf 0. Wegen Loop , oben steht 2 mal Do unter einander ich hatte gedacht das dadurch das ganze verschachtelt ist un der Sprung der erst erfolgen soll wenn
    Z = 300 ist darum Loop Until Z = 300. Das müsste dan in etwa so aussehen:

    Portb.1 = 1
    waitms 1500
    Portb.1 = 0
    Loop

    Wenn jetzt end eingetragen wird bleibt das Programm dann nicht einfach stehen ?


    Auf alle Fälle werde ich die Anregungen probieren. Eine Bitte kann jemand untersuchen warum die unerwünschte Pause auftritt ?
    danke un freundlich Güße Henry

  3. #3
    Erfahrener Benutzer Roboter Genie Avatar von HeXPloreR
    Registriert seit
    08.07.2008
    Ort
    Soltau - Niedersachsen
    Alter
    47
    Beiträge
    1.369
    Ich frage mich wie der DC-Motor zu seinem Anfangspunkt zurückfahren soll? Dazu könntest Du ja nochmal was zu sagen.

    Warum baust Du nicht eine einfache Schleife auf die genau einmal den Ablauf (Startsignal -> 1500sek Motor dreht -> Servo vor -> Servo zurück -> 1500sek Motor dreht(?) ) durchläuft wenn das Signal kommt? Und wenn das Signal nicht kommt alles aus bleibt.
    Ansonsten kannst Du waits nur noch mit einem Hardwaretimer verhindern.

    Die Syntax was ein Programm in Bascom betrifft ist ungefähr so:

    - Chip
    - Crystal
    - Configuration
    - Variablen ( das was Thomas$ meinte)

    Do 'Endlosschleife ??
    |
    | [tab] ALLES an Code auch do loops die mit Until oder exit sonstwas abgebrochen werden sollen - damit es eine Endlosschleife bleibt!!
    |
    Loop 'Endlosschleife nur sicher auch wirklich Eine mit dem dazugehörigen "loop"!!
    End

    ggf Subs
    Geändert von HeXPloreR (27.07.2015 um 17:17 Uhr)

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    03.03.2013
    Beiträge
    6
    Der Motor ist an ein Hebelsystem angebaut das eine Trommel bewegt und schrittweise um 36° pro Schritt geschoben wird.

    Über den Rest muss ich erst mal nachdenken , gehe aber davon aus das du mir den benötigten Rat gegeben hast. Ich melde mich wieder.

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    03.03.2013
    Beiträge
    6
    So jetzt hab ich das ganze noch mal neu geschieben und die halbe nacht getestet und es ist dies hier herausgekommen .

    Code:
    $regfile = "attiny13.dat"
    $crystal = 9600000
    $hwstack = 16
    $swstack = 8
    $framesize = 24
    Config Portb.2 = Input
    Config Portb.1 = Output
    Config Portb.0 = Output
    Config Servos = 1 , Servo1 = Portb.0 , Reload = 10
    Do
    
    
    Do
    Dim W As Integer
    Pulsein W , Pinb , 2 , 1
    If W <= 150 Then
    Portb.1 = 0
    End If
    If W > 150 And W <= 200 Then
    Portb.1 = 1
    End If
    
    Waitms 1450
    Portb.1 = 0
    
    Loop Until W > 150               '  Wiederhole do loop, bis Bedingung W>150 wahr ist.
    
    
    
    Enable Interrupts               'Servoschleife
    Dim I As Byte
    For I = 100 To 200
     Servo(1) = I
    Next I
    For I = 200 To 100 Step -1
      Servo(1) = I
      Waitms 12
    Next I
    Disable Interrupts
    
    
    Portb.1 = 1
    Waitms 8
    Waitms 1700
    Portb.1 = 0
    Loop
    
    End
    Wie ihr seht hab ich die Anregungen mit berücksichtigt.

    Aber wie es immer so ist , erst geht alles und dann nichts mehr , ich war kurz vorm Kollaps . Dann alles noch mal Messen und hol es der Teufel das Relais fällt nicht mehr ab . Gut messen wir doch mal den Anlaufstrom ,3,25A das Relais verträgt aber nur max. 1A , da hatte ich den Grund nun muss ich das ganze Platinenlayout umarbeiten weil der Motor nun mit einem BUZ11 angetrieben wird.

    herzlichen Dank für eure Hilfe
    Henry

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    30.12.2008
    Beiträge
    1.427
    ich mache mal ein paar änderungsvorschläge siehe code

    Code:
    $regfile = "attiny13.dat"
    $crystal = 9600000
    $hwstack = 16
    $swstack = 8
    $framesize = 24
    //Configs
    Config Portb.2 = Input
    Config Portb.1 = Output
    Config Portb.0 = Output
    Config Servos = 1 , Servo1 = Portb.0 , Reload = 10
    //Variablen
    Dim W As Integer
    Dim I As Byte
    Do
    
    
    Do
    
    Pulsein W , Pinb , 2 , 1
    If W <= 150 Then Portb.1 = 0
    elseif W > 150 And W <= 200 Then
    Portb.1 = 1
    Waitms 1450
    Portb.1 = 0
    End If
      //Nu warten wenn es auch sinvoll ist, sonst wartet der µC 1,5S und merkt dabei nicht das nächste start signal
    
    
    Loop Until W > 150               '  Wiederhole do loop, bis Bedingung W>150 wahr ist.
    
    
    
    Enable Interrupts               'Servoschleife
    
    For I = 100 To 200
     Servo(1) = I
    Next I
    For I = 200 To 100 Step -1
      Servo(1) = I
      Waitms 12
    Next I
    Disable Interrupts
    
    
    Portb.1 = 1
    Waitms 8
    Waitms 1700
    Portb.1 = 0
    Loop
    
    End
    was gibt es noch zu sagen

  7. #7
    Erfahrener Benutzer Roboter Genie Avatar von HeXPloreR
    Registriert seit
    08.07.2008
    Ort
    Soltau - Niedersachsen
    Alter
    47
    Beiträge
    1.369
    Zitat Zitat von Vidarodinssohn Beitrag anzeigen
    Wie ihr seht hab ich die Anregungen mit berücksichtigt.
    Wenn Du das sagst Bild  

    Da war der Thomas$ wohl etwas schneller Bild  

    Hier mein Vorschlag (ungetestet) :
    Code:
    $regfile = "attiny13.dat"
    $crystal = 9600000
    $hwstack = 16
    $swstack = 8
    $framesize = 24
    Config Portb.2 = Input
    Config Portb.1 = Output         'Relais
    Config Portb.0 = Output
    Config Servos = 1 , Servo1 = Portb.0 , Reload = 10
    
    Dim Puls as Integer     'dim W As Integer
    Dim I As Byte
    
    Enable Interrupts
    
    ' Relais Alias Portb.1
    
    Do
      Pulsein Puls , Pinb , 2 , 1                                               'Schelife geht solange in else Zweig bis Pukls größer 150 ist
      If Puls > 150 then                                                         'And Puls <= 200 'Then    'Steigt Puls/W überhaupt über 200 oder ist es sogar egal??
         Portb.1 = 1      'Relais = 1                                          'Relais an
         Waitms 1450
         Portb.1 = 0      'Relais = 0                                          'Relais aus
    '     'Enable 'Interrupts                                                     'siehe oben
         For I = 100 To 200                                                     'Servoschleife anfang
             Servo(1) = I
             Next I                                                                    'schnelle fahrt des Servo
         For I = 200 To 100 Step -1
             Servo(1) = I
             Waitms 12                                                             'geregelte Rückfahrt des Servo
         Next I                                                                        'Servoschleife ende
    '     'Disable 'Interrupts                                                    'weglassen! Siehe Hilfe >> mit F1 auf CONFIG (- servo)
         Portb.1 = 1    'Relais = 1                                             'Relais an
         Waitms 1708                                                             'Waitms 8 +  'Waitms 1700
         Portb.1 = 0    'Relais = 0                                             'Relais aus
      else
         Portb.1 = 0    'Relais = 0                                             'Relais aus
      End If
    loop
    End
    Wichtig hierbei ist das dieser Code lesbar ist, und nicht in unnötige Stücke zerhackt die man nicht mehr zuordnen kann.

    Viele Grüße
    Jörg
    Geändert von HeXPloreR (28.07.2015 um 16:40 Uhr)

Ähnliche Themen

  1. ATTiny´s Massensterben
    Von pmaler im Forum Elektronik
    Antworten: 48
    Letzter Beitrag: 25.02.2008, 23:14
  2. AtTiny 12L + 1*16 LCD ?
    Von Robin1508 im Forum AVR Hardwarethemen
    Antworten: 10
    Letzter Beitrag: 27.12.2007, 14:55
  3. ATTiny als I²C Slave?
    Von nyquest im Forum Assembler-Programmierung
    Antworten: 2
    Letzter Beitrag: 12.01.2007, 19:47
  4. ATtiny 13 mit Stk 500
    Von AVRboy im Forum AVR Hardwarethemen
    Antworten: 1
    Letzter Beitrag: 01.10.2006, 16:36
  5. ATtiny 13 bzw. 85
    Von MrQu im Forum AVR Hardwarethemen
    Antworten: 2
    Letzter Beitrag: 16.05.2005, 15:51

Stichworte

Berechtigungen

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

    Werbung      fchao-Sinus-Wechselrichter AliExpress