Atmega8 - Zähler funktioniert nicht

Gast #2316355
Lesenswert?

Hallo allerseits.
ich möchte gerne einen kleinen Zähler mit einer 7 Segmentanzeige, zwei 
Tastern und einem Atmega8 in Bascom realisieren.
Im Netz bin ich leider nicht ganz fündig geworden, daher hoffe ich dass 
ihr mir bei meinem Problem weiterhelfen könnt.
Ich habe einige Grundkenntnisse in Basic und arbeite seit 2 Monaten mit 
Bascom.

Die Schaltung soll folgendes machen:
Wenn die Betriebspannung eingeschaltet wird, soll der AVR eine "0" auf 
der Anzeige darstellen. Anschließend sollte man mit einem Taster die 
Zahl um eins erhöhen und mit dem anderen die Zahl um eins verringern 
können. Dies soll von "0" bis "9" funktionieren.

Ich habs mal mit Decr und Incr versucht aber das funktioniert noch nicht 
ganz.
Der Code:

$regfile "m8def.dat"
$crystal = 1000000

Config Portd = Output
Config Portb.0 = Input
Config Portb.1 = Input

Pinb.0 = 1
Pinb.1 = 1

Dim Num(10) As Byte

Num(1) = &B00111111
Num(2) = &B00000110
Num(3) = &B01011011
Num(4) = &B01001111
Num(5) = &B01100110
Num(6) = &B01101101
Num(7) = &B01111101
Num(8) = &B00000111
Num(9) = &B01111111
Num(10) = &B01101111

Do
  If Pinb.0 = 0 Then
       Incr ....'Nummer soll hier um eins erhöht werden
   End If

  If Pinb.1 = 0 Then
       Decr ....'Nummer soll hier um eins verringert werden
   End If
Loop

Danke schonmal im vorraus
Gruß Fabian G.

P.S: Schaltplan kann ich noch erstellen. Falls einer benötigt werden 
sollte, poste ich ihn noch nach. ;-)
#2316363
Lesenswert?

Hallo Fabian,

was schonmal fehlt ist die Entprellung. Ein Tastendruck würde in 
mehreren Durchläufen der Main-Loop den Wert verändern.
Somit bist du bei einem Tastendruck immer an den jeweiligen Anschlägen.

Weiterhin sieht das auch nicht richtig aus:

Config Portd = Output
Config Portb.0 = Input
Config Portb.1 = Input

Pinb.0 = 1
Pinb.1 = 1


probier mal:
Taster1 alias pinb.0 : config Taster1 = Input : Portb.0 = 1
Taster2 alias pinb.1 : config Taster2 = Input : Portb.1 = 1


und in der Main fragst du dann ab:

if Taster1 = 0 then ...


Gruß
Bodo Geue
#2316372
Lesenswert?

Was denkst du, wie lange wohl ein Durchlauf hierdurch

Do
  If Pinb.0 = 0 Then
       Incr ....'Nummer soll hier um eins erhöht werden
   End If

  If Pinb.1 = 0 Then
       Decr ....'Nummer soll hier um eins verringert werden
   End If
Loop


dauert?
Kannst du einen Taster so schnell drücken und wieder loslassen?
Gast #2316400
Lesenswert?

Karl Heinz Buchegger schrieb:
> BASCOM Hilfe
> "debounce" nachlesen

Hab ich gemacht.
Also muss ich z.B. schreiben: "Config Debounce = 30" ?

Bodo Geue schrieb:
> und in der Main fragst du dann ab:
>
> if Taster1 = 0 then ...

Ja, das ist mir klar, aber wie schreibe ich das mit "Zahl erhöhen" und 
Zahl verringern"?
Muss ich da Inrease und Decrease benutzen?
Wo und wie schreibe ich was in die Do-Loop Schleife?

Danke schonmal für die Tipps!
Gruß Fabian G.
#2316413
Lesenswert?

Hi,

Zahlen werden mit incr Zahl um 1 erhöht und mit decr Zahl um eins 
verringert.
Das und setzen der Grenzen, und der Pause gehört hinter die 
Tasterauswertung.
Aber soviel Eigeninitiative solltest du selber aufbringen

Debounce ist die bessere Lösung, aber config debounce allein reicht da 
nicht. Wichtiger ist der Befehl debounce, zum Beispiel:

Debounce Taster1 , 0 , Taster1_routine , Sub

und dann als Sub:

Taster1_routine:
   incr Nummer
Return

Gruß BoGe-Ro
#2316430
Lesenswert?

Fabian G. schrieb:

> Ja, das ist mir klar, aber wie schreibe ich das mit "Zahl erhöhen" und
> Zahl verringern"?

Du nimmst eine Variable, nennst die zb 'Zaehler' und erhöhst oder 
verringerst sie. Wo ist das Problem?

> Muss ich da Inrease und Decrease benutzen?

Müssen nicht. Du kannst auch

    Zaehler = Zaehler + 1

schreiben, wenn dir Incr unsympatisch ist.

    Incr Zaehler

> Wo und wie schreibe ich was in die Do-Loop Schleife?

So wie du das erwarten würdest:
1
  Abfragen ob eine Taste gedrückt ist
2
    wenn ja, dann eine Sub aufrufen lassen, die die zugehörige
3
    Funktionalität macht
4

5
  ANzeige anktualisieren
6

7
  eventuell ein bischen warten (muss aber nicht sein)

eigentlich sehr logisch, oder nicht?
1
Do
2

3
   Debounce Taster1, 0, Hoch, Sub
4
   Debounce Taster2, 0, Nieder, Sub
5

6
   Num( Zaehler )   auf der 7_Seg ausgeben
7

8
   Wait
9

10
Loop
1
Hoch:
2
   if Zaehler kleiner 9
3
     Incr Zaehler
4
   return
1
Nieder:
2
   if Zaehler größer 0
3
     Decr Zaehler
4
   return

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren