- Labornetzteil AliExpress         
Ergebnis 1 bis 10 von 11

Thema: Attiny13 Frage

Hybrid-Darstellung

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

    Attiny13 Frage

    Hallo,

    ich beschäftige mich seit kurzem mit der Bascom Programmierung und wollte ein kleines Program mit dem ATTiny13 machen. Das macht aber nicht so wie ich es gern hätte.
    Ich möchte mittels eines Tastimpulses ein LED Blinken ein bzw. aus schalten. Hab schon verschiedene Varianten ( Loop Until; While Wend; If Then) versucht komme aber nicht recht weiter.
    Vielleicht kann mir mal jemand auch bei einer so banalen Frage helfen.

    regfile = "attiny13.dat"
    $crystal = 1200000

    Config Pinb.1 = Input

    Taster Alias Pinb.1

    Config Portb.3 = Output
    B3 Alias Portb.3

    Config Portb.4 = Output
    Weiss Alias Portb.4


    Dim X As Bit

    X = B3

    On Int0 Onint0

    Config Int0 = Falling
    Enable Int0
    Enable Interrupts

    While X = 1

    Toggle Weiss
    Waitms 300

    Toggle Weiss
    Waitms 1000

    Toggle Weiss
    Waitms 100

    Wend

    End

    Onint0:
    Toggle B3

    Return


    Gruß
    Caro

  2. #2
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    34
    Beiträge
    3.501
    Blog-Einträge
    9
    Du hast die

    Do

    Loop

    Schleife vergessen.
    Dein Programm wird ein mal durchlaufen und dann wars das, sprich der Mikrocontroller prüft ein mal ob das Bit gesetzt ist.
    Wenn du einen Interrupt verwendest solltest du den Taster entprellen, da der Mikrocontroller sonst mehrmals in die ISR springt und u.U. bleibt die LED dann aus, weil mit dem letzten Sprung das Bit wieder gelöscht wird.
    Siehe hier:

    http://www.mikrocontroller.net/articles/Entprellung

    Und wenn dann würde ich in der ISR nur ein Bit setzen z.B. so:

    Onint0:

    Toggle Port_B3_enable

    Return

    Und im Hauptprogramm dann:

    Do
    If Port_B3_Enable = 1 then
    LED = 1
    else
    LED = 0
    End if
    Loop
    End

    Weil das ist eigtl die schnellste Variante für eine ISR, wenn man in der ISR nur ein Flag setzt oder löscht und dieses Flag dann im Hauptprogramm abfragt.
    Bei deiner Anwendung ist das noch nicht kritisch aber solltest du vielleicht im Hinterkopf behalten :=)
    Geändert von Kampi (12.09.2012 um 09:56 Uhr)
    Schaut ruhig mal auf meiner Homepage vorbei :
    http://kampis-elektroecke.de

    Oder folge mir auf Google+:
    Daniel Kampert

    Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.

    Gruß
    Daniel

  3. #3
    Hallo,

    vielen Dank für die schnelle Antwort. Muß erst denken.
    Ich dachte die While Wend Schleife ist statt der Do Loop besser geeignet, sollte ja nur durchlaufen werden wenn die Bedingung erfüllt ist, sonst ist Ruhe.

    Ich werde mich sicher noch mal melden nachdem meine Denkphase beendet ist

    Gruß
    Caro

  4. #4
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    34
    Beiträge
    3.501
    Blog-Einträge
    9
    Die Do-Loop Schleife ist das Hauptprogramm, sprich quasi ein Rahmen wodrin das eigentliche Programm abgearbeitet wird.
    Eine While-Schleife ist ein Element des Hauptprogrammes, ähnlich wie eine If-Abfrage oder ein Pin schalten.
    Du kannst das Hauptprogramm natürlich weg lassen nur wenn dann die Bedingung für den Verbleib in der While-Schleife nicht erfüllt ist, springt der Controller aus der Schleife raus und sie beginnt nie wieder von vorne, da der Controller keinen Befehl bekommt das Programm neu auszuführen, da die Do-Loop Schleife fehlt.
    Schaut ruhig mal auf meiner Homepage vorbei :
    http://kampis-elektroecke.de

    Oder folge mir auf Google+:
    Daniel Kampert

    Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.

    Gruß
    Daniel

  5. #5

    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

  6. #6
    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

Ä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
  •  

12V Akku bauen