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

Thema: Attiny13 Frage

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1

    Bascom Program

    Hallo,

    ich muß mich doch noch mal melden. Erst mal vielen Dank für deine Tipps. hat mir sehr geholfen und bin nun auch ganz gut fertig geworden.
    Nun habe ich aber noch ein Problem.
    Der Interrupt soll die Abarbeitung der Schleife unterbrechen und nach erneuter Umschaltung wieder fort setzen. Das macht sie auch, aber nach dem Interrupt läuft die Schleife noch etwas weiter bevor sie aufhört. Nun habe ich schon nach jedem Toggle eine If Then Abfrage gemacht, so dass die Schleife nach jeder Umschaltung abbricht. Wenn nun aber die Wait Zeit recht lang dauert wartet der Interrupt immer noch bis zum Ende der Wartezeit bevor sie aufhört.
    Nun meine Frage: gibt es einen Befehl der, egal wo sich das Program gerade befindet, selbst mitten in einem Waitablauf, die Schleife verlässt bzw. beendet und wenn nötig wieder fort setzt.
    Vielen Dank im Voraus

    Gruß
    H.Jeske

    Hab noch das Program vergessen, ist vielleicht hilfreich:

    $regfile = "attiny13.dat"
    $crystal = 1200000
    Config Pinb.1 = Input
    Portb.1 = 1
    Taster Alias Pinb.1
    Config Portb.3 = Output
    B3 Alias Portb.3
    Config Portb.4 = Output
    Weiss Alias Portb.4

    On Int0 Onint0
    Config Int0 = Falling
    Enable Int0
    Enable Interrupts
    Do
    Weiss = 1
    If B3 = 1 Then
    Toggle Weiss
    Wait 5
    End If
    If B3 = 1 Then
    Toggle Weiss
    Waitms 300
    End If
    If B3 = 1 Then
    Toggle Weiss
    Wait 1
    End If
    If B3 = 1 Then
    Toggle Weiss
    Waitms 500
    End If
    If B3 = 1 Then
    Toggle Weiss
    Waitms 500
    End If
    If B3 = 1 Then
    Toggle Weiss
    Wait 1
    End If
    Loop
    End
    Onint0:
    Toggle B3
    Return

  2. #2
    Erfahrener Benutzer Roboter-Spezialist Avatar von Thegon
    Registriert seit
    21.01.2011
    Beiträge
    562
    Also zur gewünschten Funktionsweise des Programms:
    Am Int0 ist ein Taster angeschlossen, und wenn der gedrückt wird, dann sollen bestimmte An - Aus - Sequenzen einer weißen LED durchlaufen werden.
    Wenn man den Taster nochmal drückt, dann soll der Durchlauf beendet werden.
    Und wenn man den Durchlauf ausschaltet, dann soll die LED sofort ausgehen, und nicht erst nach der Wartezeit?

    Man könnt doch einfach in die ISR schreiben:

    Code:
    Onint0:
       Toggle B3
    
    If B3 = 0 then
       Weiss = 0
    End If
    
    Return
    Dann würde die LED sofort ausgehen, wenn man den Taster drückt, um den Durchlauf auszuschalten. Das einzige Problem ist, dass man die Wartezeit noch abwarten muss, bis man den Durchlauf wieder einschalten kann.

    Eine Warteschleife zu Unterbrechen geht glaub ich nicht so einfach, ich habe zumindest nichts gefunden.
    Wenn man es unbedingt braucht, dann muss man entweder auf einen Timer zurückgreifen oder man baut sich eine Warteschleife nach, die eben nur wartet, wenn die Flag auch wirklich gesetzt ist.

    Also eine Schleife, die eine Varible runterzählt, und das aber nur, wenn B3 = 1. Wenn B3 = 0 dann hört die "nachgebaute" Schleife auf, zu zählen.
    Es wird also überprüft, ob B3 = 1, wenn nein, dann sofort beenden, wenn ja, dann eine Millisekunde warten und von einer Variable eins subtrahieren. Dann das ganze wieder von vorne... (also in einer Do - Loop schleife)

    Mfg Thegon

  3. #3
    Erfahrener Benutzer Roboter Experte Avatar von Thomas E.
    Registriert seit
    29.12.2011
    Beiträge
    638
    Ich würde mal versuchen, mittels Goto aus der ISR (BÖSE - ich weiß) zu einem Label vor der Hauptschleife zu springen. Denn wenn du die ISR mit Return verlässt, ist ja klar, dass er mitten in die Warteschleife zurückspringt und sie weiter ausführt.
    Grüße
    Thomas

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.715
    Blog-Einträge
    133
    Zitat Zitat von Thomas E. Beitrag anzeigen
    mittels Goto aus der ISR (BÖSE - ich weiß) zu einem Label vor der Hauptschleife zu springen.
    Das find ich einen echt gewagten Sprung. Da muß mindestens vorher noch der Stack bereinigt werden, sonst läuft der irgendwann über und das globale Interrupt Enable gesetzt werden, wenn noch weitere Interrupts stattfinden sollen.

    Gruß
    Searcher
    Geändert von Searcher (26.09.2012 um 19:08 Uhr)
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  5. #5
    Erfahrener Benutzer Roboter-Spezialist Avatar von Thegon
    Registriert seit
    21.01.2011
    Beiträge
    562
    Im Prinzip würde hier doch ein einfacher Timer Abhilfe schaffen. Und der ATtimy13 hat doch einen.
    Also einfach den Timer so konfiguriern, dass er in der Kleinsten gewünschten Zeit (z.B. 10ms) einen Overflow generiert, und in diesem Dann eine Variable hochzählen. Wenn die variable 1 dann togglen, dann wenn die Variable 2 ist, und dann wenn 4 wieder. Wenn die Variable z.B. 200 erreicht hat (würden im Beispiel 2s entsprechen), dann wird sie wieder auf Null gesetzt, und alles beginnt von vorne. Wenn nun der Interrupt reinkommt, dann wird der Timer ausgeschaltet, die Led ebenfalls sofort ausgeschaltet, und die Variable auf Null gesetzt. Kommt der Interrupt wieder herein, dann wieder Timer aktivieren und los gehts.

    Nur bin ich mir nicht sicher, ob sich das vom Speicher ausgeht, der ATtiny13 hat ja nur 64Bytes RAM oder so, aber so groß ist das Programm dann ja auch wieder nicht?

    Noch eine Frage: ist der Taster, mit dem der Interrut erzeugt wird (ich nehme einmal an, es ist ein Taster) eigentlich entprellt? Sonst könnten sich da ein paar lustige Effekte ergeben, und man fragt sich, warum der Taster nicht reagiert hat, obwohl der Interupt zwei mal reingekommen ist, einmal aus und gleich wieder an

    Mfg Thegon

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.05.2007
    Ort
    Berlin
    Alter
    54
    Beiträge
    765
    Normal reichen die 64 Byte für sowas aus. Wie groß ist denn der Stack in den Configs?

    Mit einem kleineren Stack lässt sich folgendes compilieren (ungetestet) :
    Code:
    $regfile = "attiny13.dat"
    $crystal = 1200000
    
    $hwstack = 16
    $swstack = 16
    $framesize = 8
    
    
    Ddrb = &B00011000
    Portb.1 = 1
    Taster Alias Pinb.1
    B3 Alias Portb.3
    Weiss Alias Portb.4
    Dim Anders As Bit
    Dim Wpause As Word
    
    On Int0 Onint0
    Config Int0 = Falling
    Enable Int0
    Enable Interrupts
    
    
    Do
       If B3 = 1 Then
          Wpause = 300
          Gosub Pause
       End If
       If Anders = 1 Then
          Enable Int0
          Waitms 20
          Reset Anders
          Toggle B3
       End If
    Loop
    End
    
    
    Pause:
       Do
          Waitms 1
          Decr Wpause
          If Anders = 1 Then Return
       Loop Until Wpause = 0
    Return
    
    
    Onint0:
       Disable Int0
       Set Anders
    Return
    Wenn das Herz involviert ist, steht die Logik außen vor! \/

  7. #7
    Hallo,

    also ich bin ja begeistert von der Gemeinde, so viele gute Tipps hätte ich gar nicht erwartet.
    Also den esten Tipp von Thegon habe ich aus probiert und das kommt meinen Vorstellungen schon sehr Nahe.
    Mal sehen, wenn ich Zeit habe werd ich weiter probieren, also vielen Dank an Euch, scheint ja doch ein Thema zu sein das ich da angesprochen hatte.

    Gruß
    Caro

Ähnliche Themen

  1. [ERLEDIGT] ATTiny13 Reset frage!
    Von bnitram im Forum AVR Hardwarethemen
    Antworten: 2
    Letzter Beitrag: 07.05.2011, 11:48
  2. ATTiny13 PWM
    Von Jacob2 im Forum AVR Hardwarethemen
    Antworten: 1
    Letzter Beitrag: 13.05.2009, 18:08
  3. attiny13
    Von epos im Forum AVR Hardwarethemen
    Antworten: 2
    Letzter Beitrag: 10.11.2007, 15:55
  4. attiny13
    Von epos im Forum AVR Hardwarethemen
    Antworten: 8
    Letzter Beitrag: 05.10.2007, 21:39
  5. PWM mit ATtiny13
    Von rapo im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 03.10.2006, 23:41

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress