mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AVR Anfängerfrage Timer1


Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich bin dabei mir eine Lampensteuerung für ein Zimmer zu programmieren. 
Diese soll mittels eines Taster folgende Funktionen erfüllen:

erstes mal tasten                           - Lampe 1 geht an
zweites mal innerhalb von 2 Sekunden tasten - Lampe 1 und Lampe 2 gehen 
an
zweites mal tasten innerhalb von 6 Sekunden - Lampe 2 geht an
zweites bzw. 3 tasten                       - alles geht aus

Hier mein Programm was leider nicht ganz funktioniert:
$regfile = "m8def.dat"                                      'für Mega8
$crystal = 4000000

Config Portd = Output                                       'definiert Portd als Output
On Timer1 Isr_von_timer1                                    'verzweige bei Timer1 überlauf zu   Isr_von_Timer1                                              'Timer1 soll schon von 34285 wegzählen
Dim A As Byte
Config Portb = Input
Portb = 1
Do
If Pinb.0 = 0 Then                                          'wenn Taster gedrückt Lampe 1 und Timer1 wird aktiviert
Portd.0 = 1
Enable Timer1
Enable Interrupts
Config Timer1 = Timer , Prescale = 256
Timer1 = 34285
End If
While A = 1                                                 'wird innerhalb von 2 Sekunden der Taster erneut betätigt leuchtet Lampe 2 dazu
While A <= 2
If Pinb.0 = 0 Then Portd.1 = 1
Wend
Wend
While A = 3                                                 'wird der Taster erst nach 3 Sekunden nach dem ersten Tasten wieder betätigt leuchtet nur Lampe 2
While A <= 10
If Pinb.0 = 0 Then Portd.1 = 1 : Portd.0 = 0
Wend
Wend
While A > 11                                                ' wird der Taster erst nach 6 Sekunden ein zweites mal betätigt schaltet er alles aus
If Pinb.0 = 0 Then
Portd.0 = 0
Portd.1 = 0
Disable Timer1
Disable Interrupts
A = 0
End If
Wend
Loop
End

Isr_von_timer1:                                             'ISR von Timer1
Timer1 = 34285                                              'Timer1 soll wieder von 34285 wegzählen
Incr A                                                      'zählt variable A jede sekunde um eins hoch
Return
das Problem ist das die Schritte zwar alle richtig abgearbeitet werden 
aber die while-Wend schleifen schalten obwohl der Taster ncht betätigt 
wird.
Wie kann ich dies ändern?

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mache es mit einem Endlichen Automaten (state machine).

$regfile = "m8def.dat"
$crystal = 4000000

Config Portd = Output

Config Portb = Input
Portb = 1                  ' Pull-Up für PINB.0 aktivieren
Config Debounce = 30

Dim Zeit As Byte
Dim Zustand As Byte
Dim Taste As Byte

Zeit = 0
Zustand = 0
Taste = 0

'
' Zustand  Lampe 1  Lampe 2  Timer1 
'    0*      AUS      AUS    AUS
'    1       AN       AUS    AN
'    2       AUS      AN     AN
'    3       AN       AN     AN
'
' * Startzustand
'
' Übergänge:
' A: 0 -> 1: 1. Tastendruck
' B: 1 -> 3: 2. Tastendruck zwischen 0s und 2s
' C: 1 -> 2: 2. Tastendruck zwischen 2s und 6s
' D: 1 -> 0: 2. Tastendruck nach mehr als 6s
' E: 2 -> 0: 3. Tastendruck irgendwann
' F: 3 -> 0: 3. Tastendruck irgendwann
'
'                        Zustand 1
'                       /  |  ^  \
'                      /   D  A   \
'                     /    v  |    \
'                    C   Zustand 0  B 
'                   /    ^       ^   \
'                  /    E         F   \ 
'                 v    /           \   v
'             Zustand 2             Zustand 3                     

' Timer1 fürs spätere Laufenlassen einrichten
On Timer1 Isr_von_timer1
Config Timer1 = Timer , Prescale = 256
Enable Interrupts

DO
  DEBOUNCE Pinb.0 , 0 , Entprellen, SUB

  IF Zustand = 0 THEN
    Portd.0 = 0        ' Lampen entsprechend Zustand schalten
    Portd.1 = 0
    Disable Timer1     ' Stoppuhr aus     
    IF Taste = 1 THEN
      Zeit = 0         ' Reset Stoppuhr Teil 1
      Timer1 = 34285   ' Reset Stoppuhr Teil 2
      Enable Timer1    ' Stoppuhr an
      Zustand = 1      ' Warten auf die nächste Taste...
    END IF
  END IF

  IF Zustand = 1 THEN
    Portd.0 = 1
    Portd.1 = 0
    IF Taste = 2 THEN
      IF Zeit < 2 THEN Zustand = 3
      ELSEIF Zeit > 6 THEN Zustand = 0
      ELSE ' Zeit >= 2 und <= 6
        Zustand = 2
      END IF 
    END IF
  End If

  If Zustand = 2 Then
    Portd.0 = 0
    Portd.1 = 1
    IF Taste = 3 THEN 
      Zustand = 0
      Taste = 0
    END IF
  End If

  If Zustand = 3 Then
    Portd.0 = 1
    Portd.1 = 1
    IF Taste = 3 THEN 
      Zustand = 0
      Taste = 0
    END IF
  End If

LOOP
END 

Isr_von_timer1:   
  Timer1 = 34285    ' Timer1 ist übergelaufen jetzt resetten
  INCR Zeit         ' Überlauf als Sekunde zählen
RETURN

Entprellen:
  INCR Taste 
  if Taste > 3 THEN Taste = 1  ' (EDIT) Tasten resetten
RETURN


Autor: Sowas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Solche Anfragen gehören in das BASCOM Forum!

Autor: Piefke (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
BASCOM Forum?
Wo ist das?
Verträgt sich Deine Aussage mit den Anti-Diskriminierungs-Gesetzen?

Aber eigentlich haste recht.

Autor: www.comwebnet.de (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
www.comwebnet.de - Bascom Projekte

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dankeschön für die viele Mühe die sie sich gemacht haben jetzt 
funktioniert nach kleiner Abänderung alles wie es soll.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bitte schön. Wie das mit den state machines geht habe ich auch erst in 
diesen Forum gelernt. Ich kann also den Dank direkt an einige User hier 
weiter geben.

Autor: Alexey (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Sowas (Gast),

bist du auch einer dieser bekloppten Bascom-Hasser? Hast du schon mal 
mit Bascom gearbeitet? Wenn nein kannst du hier auch nicht mitreden. 
Falls du in C Programmierst motzt ja auch keiner oder... Bascom ist eine 
Programmiersprache die besonders für Einsteiger sehr gut geeignet ist, 
man kann damit aber durchaus auch anspruchsvolle Sachen machen. Du 
hängst wohl noch mit dem Vorurteil der 90'er das alles was Basic heißt 
schrott ist...

Sorry @all für die harsche Wortwahl meinerseits aber wenn ich lese wie 
hier Anfänger angeraunzt werden weil sie eine Frage stellen die mit 
Bascom-Programmierung zu tun hat könnte ich kotzen... Soviel zum Thema 
toleranz für andere.......

Alexey (der auch noch gerne in Bascom Proggt!)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.