Forum: Mikrocontroller und Digitale Elektronik Atmega8 - Zähler funktioniert nicht


von Fabian G. (Gast)


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. ;-)

von Bo G. (boge-ro)


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

von Fabian G. (Gast)


Lesenswert?

Hallo Bodo,
Danke für den Tipp! Wie mache ich die Tasterentprellung? ;-)

Gruß Fabian G.

von Karl H. (kbuchegg)


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?

von Karl H. (kbuchegg)


Lesenswert?

Fabian G. schrieb:
> Hallo Bodo,
> Danke für den Tipp! Wie mache ich die Tasterentprellung? ;-)

BASCOM Hilfe
"debounce" nachlesen

von Fabian G. (Gast)


Lesenswert?

sry hab deinen Post jetzt erst vollständig sehen können, da mein 
Internet nicht grad das schnellste ist... :-)
Gruß

von Bo G. (boge-ro)


Lesenswert?

Hallo,

dafür gibts viele Möglichkeiten.
Sehr einfach, wenn dein Rechner nichts weiteres zu tun hat und bei 
niedriger Taster-drück-Frequenz wäre eine Pause, also einfach da wo 
increased bzw. decreased wird jeweils ein waitms 200 oder so rein

Gruß
Bodo Geue

von Fabian G. (Gast)


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.

von Bo G. (boge-ro)


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

von Karl H. (kbuchegg)


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

von Fabian G. (Gast)


Lesenswert?

Danke für eure Hilfe!
Ich probier mal eure Vorschläge und Ansätze aus ;-)
Wenn ich nochmal auf dem Schlauch stehen sollte, melde ich mich.
Gruß Fabian G.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.