Anfänger hat Frage

Sirko

Neues Mitglied
05. Juli 2011
3
0
0
54
Sprachen
Hallo An alle,

ich wollte mal die Möglichkeiten von Mikrocontrollern etwas besser kennenlernen und habe mir ein Lernpaket zugelegt.
Die Entwicklungsumgebung ist Bascom.

Als erstes eigenes Programm habe ich eine Stoppuhr erstellt. Aus meiner sicht sollte sie auch laufen.
Ob sie es macht oder nicht, kann ich nicht sagen. Im Terminalprogramm sehe ich keine Uhranzeige.

Wenn ich den Tastern Sw1 und Sw2 die den Timer starten bzw. Stoppen sollen betätige geht zwar meine Led an und aus ich sehe keine Print ausgabe im Terminal. Setze ich Go=0 im Printbefehl wird im Terminal gleich nach dem öffnen 0:00 ausgegeben.

Meine Frage ist nun, kann es sein, dass die Übertragung zum Terminal zu langsam ist wenn der Timer läuft.
Muss ich ein LCD verwenden? Oder habe ich einen anderen Gedankenfehler?

Hier noch mein code.

Code:
'Stoppuhrtest
'Version 1.0

$regfile = "m88def.dat"
$crystal = 8000000
$baud = 19200


'Eingänge
Sw1 Alias Pind.2                                            'Alias für Pind 2
Config Sw1 = Input                                          'Sw1 ist Eingang
Portd.2 = 1                                                 'Eingang Entprellt

Sw2 Alias Pind.3                                            'Alias für Pind 3
Config Sw2 = Input                                          'Sw2 ist Eingang
Portd.3 = 1                                                 'Eingang entprellt

Sw3 Alias Pind.4                                            'Alias für Pind 4
Config Sw3 = Input                                          'Sw3 ist Eingang
Portd.4 = 1                                                 'Eingang entprellt

Led Alias Portb.6
Config Led = Output
Led = 0

'Timer
Config Timer0 = Timer , Prescale = 64                       'Timer0 mit Teiler 64
Stop Timer0                                                 'Teimer Stoppen
On Timer0 Timer_isr                                         'Interrupt Service Routiene
Enable Timer0                                               'Timer einschalten
Enable Interrupts                                           'Interrupt einschalten


'Variablen
Const Reload = 131                                          'Reloadwert 131
Dim Msekunden As Byte                                       'Variable für Tausendstel Sekunden
Dim Hsekunden As Byte                                       'Variable für Hundertstel Sekunden
Dim Csekunden As Byte                                       'Variable für Centel Sekunden
Dim Sekunden As Byte                                        'Variable für Sekunden
Dim Zsekunden As Byte                                       'Variable für 10 Sekunden
Dim Minuten As Byte                                         'Variable für Minuten
Dim Go As Byte                                              'Variable Timer Läuft

'Initialisierung
Msekunden = 0
Hsekunden = 0
Csekunden = 0
Sekunden = 0
Zsekunden = 0
Minuten = 0
Go = 0


Do
If Sw1 = 0 Then                                             'Starttaste gedrückt
Start Timer0                                                'Starten Timer0
Go = 1                                                      'Timer läuft
Led = 1
End If

If Sw2 = 0 Then                                             'Stoptaste gedrückt
Stop Timer0                                                 'Stoppen Timer0
Go = 0                                                      'Timer läuft nicht
Led = 0
End If

If Sw3 = 1 Then                                             'Resettaste gedrückt
Stop Timer0                                                 'Stoppen Timer0
Msekunden = 0
Hsekunden = 0
Csekunden = 0
Sekunden = 0
Zsekunden = 0
Minuten = 0
Go = 0
End If

If Msekunden = 10 Then
Incr Hsekunden
Msekunden = 0

If Hsekunden = 10 Then
Incr Csekunden
Hsekunden = 0

If Csekunden = 10 Then
Incr Sekunden
Csekunden = 0

If Sekunden = 10 Then
Incr Zsekunden
Sekunden = 0

If Zsekunden = 10 Then
Incr Minuten
Zsekunden = 0

If Minuten = 10 Then
Msekunden = 0
Hsekunden = 0
Csekunden = 0
Sekunden = 0
Zsekunden = 0
Minuten = 0
End If
End If
End If
End If
End If
End If

'Zeitanzeige
If Go = 1 Then
Print ; Minuten ; ":" ; Zsekunden ; Sekunden
End If

Loop

'Timer Interrupt
Timer_isr:
Timer0 = Reload                                             'Timer Reload laden
Incr Msekunden                                              'Tausendstel Sekunden Incrementieren

Return
End

Da mir am code nicht falsches aufgefallen ist, hoffe ich auf ein paar Tips von Euch Experten.

Sirko
 
Danke caargoo,

das hatte ich übersehen.
Musste aber die incrementierung auch noch in die Timer_isr verschieben.

So läuft es erst ein mal.

Code:
'Stoppuhrtest
'Version 1.0

$regfile = "m88def.dat"
$crystal = 8000000
$baud = 19200


'Eingänge
Sw1 Alias Pind.2                                            'Alias für Pind 2
Config Sw1 = Input                                          'Sw1 ist Eingang
Portd.2 = 1                                                 'Eingang Entprellt

Sw2 Alias Pind.3                                            'Alias für Pind 3
Config Sw2 = Input                                          'Sw2 ist Eingang
Portd.3 = 1                                                 'Eingang entprellt

Sw3 Alias Pind.4                                            'Alias für Pind 4
Config Sw3 = Input                                          'Sw3 ist Eingang
Portd.4 = 1                                                 'Eingang entprellt

Led Alias Portb.6
Config Led = Output
Led = 0

'Timer
Config Timer0 = Timer , Prescale = 64                       'Timer0 mit Teiler 64
Stop Timer0                                                 'Teimer Stoppen
On Timer0 Timer_isr                                         'Interrupt Service Routiene
Enable Timer0                                               'Timer einschalten
Enable Interrupts                                           'Interrupt einschalten


'Variablen
Const Reload = 131                                          'Reloadwert 131
Dim Msekunden As Byte                                       'Variable für Tausendstel Sekunden
Dim Hsekunden As Byte                                       'Variable für Hundertstel Sekunden
Dim Csekunden As Byte                                       'Variable für Centel Sekunden
Dim Sekunden As Byte                                        'Variable für Sekunden
Dim Zsekunden As Byte                                       'Variable für 10 Sekunden
Dim Minuten As Byte                                         'Variable für Minuten
Dim Go As Byte                                              'Variable Timer Läuft

'Initialisierung
Msekunden = 0
Hsekunden = 0
Csekunden = 0
Sekunden = 0
Zsekunden = 0
Minuten = 0
Go = 0


Do
If Sw1 = 0 Then                                             'Starttaste gedrückt
Start Timer0                                                'Starten Timer0
Go = 1                                                      'Timer läuft
Led = 1
End If

If Sw2 = 0 Then                                             'Stoptaste gedrückt
Stop Timer0                                                 'Stoppen Timer0
Go = 0                                                      'Timer läuft nicht
Led = 0
End If

If Sw3 = 0 Then                                             'Resettaste gedrückt
Stop Timer0                                                 'Stoppen Timer0
Msekunden = 0
Hsekunden = 0
Csekunden = 0
Sekunden = 0
Zsekunden = 0
Minuten = 0
Go = 0
End If

'Zeitanzeige
If Go = 1 Then
Print ; Minuten ; ":" ; Zsekunden ; Sekunden
End If

Loop

'Timer Interrupt
Timer_isr:
Timer0 = Reload                                             'Timer Reload laden
Incr Msekunden                                              'Tausendstel Sekunden Incrementieren

If Msekunden = 10 Then
Incr Hsekunden
Msekunden = 0

If Hsekunden = 10 Then
Incr Csekunden
Hsekunden = 0

If Csekunden = 10 Then
Incr Sekunden
Csekunden = 0

If Sekunden = 10 Then
Incr Zsekunden
Sekunden = 0

If Zsekunden = 10 Then
Incr Minuten
Zsekunden = 0

If Minuten = 10 Then
Msekunden = 0
Hsekunden = 0
Csekunden = 0
Sekunden = 0
Zsekunden = 0
Minuten = 0
End If
End If
End If
End If
End If
End If

Return
End

Nochmals vielen Dank.
Für weitere Tips bin ich immer offen

Sirko
 
So läuft es erst ein mal.

Code:
'Timer Interrupt
Timer_isr:
Timer0 = Reload                                             'Timer Reload laden
Incr Msekunden                                              'Tausendstel Sekunden Incrementieren

If Msekunden = 10 Then
Incr Hsekunden
Msekunden = 0

If Hsekunden = 10 Then
Incr Csekunden
Hsekunden = 0

If Csekunden = 10 Then
Incr Sekunden
Csekunden = 0

If Sekunden = 10 Then
Incr Zsekunden
Sekunden = 0

If Zsekunden = 10 Then
Incr Minuten
Zsekunden = 0

If Minuten = 10 Then
Msekunden = 0
Hsekunden = 0
Csekunden = 0
Sekunden = 0
Zsekunden = 0
Minuten = 0
End If
End If
End If
End If
End If
End If

Ret
End


Hallo Sirko!

Willkommen im AVR-Praxis Forum! :ciao:


Deine derzeitige "Lösung" mag vielleicht funktionieren, ist aber nicht so gut gelungen. :wink:

Zum Einen ist die Timer_ISR nun ziemlich lang und du wirst viel zu viele Taktzyklen verbraten um eine genaue Anzeige zu erhalten....... aber darauf kommt es bei dem Versuch wohl auch nicht an ........und zum Anderen sind deine ganzen IF - END IF Anweisungen "falsch" zusammen gefasst.

Natürlich kann man IF-Then Bedingungen verschachteln, aber nicht in dieser Form.
Wenn du eine Bedingung überprüfen möchstest..... und keine weitere Bedingung in Abhängigkeit steht ......dann musst du diese Abfrage auch mit END IF beenden.
Zur Zeit mag das in dem kleinen Programm noch keine Probleme bereiten........ sollten die Programme aber umfangreicher werden, wird die Fehlersuche später schwer.

Besser wäre daher:
Code:
If X = 0 Then
NOP
End If

'oder auch.....

If X = 0 Then
   If Y = 0 Then
      NOP
   End If
Else
   NOP
End If


'oder auch.....

If X = 0 Then
   NOP
Elseif X = 1 Then
   NOP
Else
   NOP
End If



Grüße,
Cassio
 
Hallo Cassio,

das mit dem Verschachteln läuchtet mit ein. Da hast Du Recht.
Mit der Timer_isr gefällt mir auch nicht so. Als ich aber diesen Abschnitt in der Do-Loop Schleife hatte hatte ich nur 0:00 als Anzeige.

Sirko
 
Hallo Sirko!

Ja, ich weiß wie schwer das ist, ein Programm neu aufzubauen bzw. neu zu struckturieren.
Meistens verfällt man zu Beginn auch wieder in das bereits erstellte........
Mit der Zeit ändert sich das aber. :wink:


Wie schon gesagt, für diesen Test kann man das so lassen, aber du solltest es nicht als Lösung betrachten und später wieder so verwenden.


Grüße,
Cassio
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)