Forum: Mikrocontroller und Digitale Elektronik mit AVR zählen -> 7-Segmentanzeige


von Tobias Blome (Gast)


Lesenswert?

Hallo,
ich möchte Türkontakte (Taster als Umschalter) kontrollieren. Jedesmal
wenn ein Türkontakt schaltet (Tür auf) soll der Wert auf der
7-Segmentanzeige um 1 erhöht werden (0 bis maximal 9).

Ich möchte in Basic programmieren und habe den AT90S2313 von Atmel.
Leider weiss ich nicht wie man das software mäßig realisiert. Kann mir
da einer helfen? Und, kann man auch 4 Türen mit 4 Anzeigen überwachen?
(AVR hat nur 15 IO Ports.) Wenn nicht erstmal für eine Tür.

Danke schon mal, Tobias

von Alexander Niessen (Gast)


Lesenswert?

Die Sache mit den Portpins haut schon hin (auf vier Türen/ Anzeigen
bezogen).
Betreibe die vier 7-Segmentanzeigen einfach im Multiplexbetrieb:
7 Portpins für die Segmente (z.B. PD0 bis PD6) und 4 Pins für die
gemeinsame Kathode/ Anode (z.B. PB0 bis PB3).
Macht 11 Pins für deine Anzeigen + vier Pins für die Türen.
Zufälligerweise passt das ganz genau mit dem überein, was der 2313 ohne
Schieberegister/ PCF8574 so hergibt ...

Wie man sowas in Basic realisiert weiss ich nicht.

Viel Erfolg bei deinem Vorhaben.

Grüsse,
Alex

von Chris (Gast)


Lesenswert?

Hallo,

ohne Bascom-Experte zu sein, würde ich Vorschlagen, einen Eingangs-Pin
ständig in einer Schleife abzufragen, falls er Null ist, nichts zu tun,
falls er eins ist, den Zähler=irgendein Register um eins zu erhöhen. Den
Wert des Registers müßtest Du dann von binär nach BCD wandeln. Danach
erscheinen die vier Ziffern in vier verschiedenen Registern. Die
Zuordnung zwischen dem Zählerstand und der 7-Segment-Anzeige wird
ziffernweise in einer Tabelle erledigt. Dann muß das ganze noch
gemultiplext werden.

Wichtig: Wegern der Kontakte ist eine Entprellung nötig oder das
Abfrage-Intervall müßte genügend groß sein (z.B. 0,5s,  also größer als
die Grenzfrequenz der Tür)!

Gruß

von harry (Gast)


Lesenswert?

hi,

wie chris schon sagt, die kontakte entprellen ist wichtig, sonst zählt
das teil bei jedem türöffnen 1-n mal, je nachdem, wie sauber der
kontakt schliesst oder öffnet. kriegst du aber leicht mit 'nem
kondensator hin (zähleingang nach gnd, grössenordnung 100nF)

den zähler könntest du so ungefähr machen:

TUER_1 und TUER_1_STATUS als BIT definieren und auf 0 setzen
TUER_1_ZAEHLER als Byte, Word oder Long definieren und auf 0 setzen

do

   TUER_1 = pinX.Y                 ' Tür abfragen, 0 zu, 1 offen

   if TUER_1 <> TUER_1_STATUS then ' Tür wurde auf oder zu gemacht
      if TUER_1 = 1 then           ' Tür offen
         incr TUER_1_ZAEHLER       ' Zähler um 1 erhöhen,
         TUER_1_STATUS = 1         ' Status OFFEN eintragen
         gosub ANZEIGE             ' Änderug anzeigen
      else                         ' Tür zu
         TUER_1_STATUS = 0         ' Status ZU eintragen
      end if
   end if

   . ' hier Code für andere Türen oder Anzeige
   .
   .
loop ' Endlosschleife

Anzeige könntest du als sub definieren

gruss, harry

von Tobias Blome (Gast)


Lesenswert?

Hi Harry,
wie funktioniert das mit: incr TUER_1_ZAEHLER       ' Zähler um 1
erhöhen? Warum erhöht der um 1? kann man das irgendwo festlegen?
-------------------------------------------------------------------
gosub ANZEIGE             ' Änderug anzeigen
springe ich mit diesem Befehl in eine unterroutine? und wie sage ich wo
die unterroutine anfängt? Also kann man da einfach "Routine:"
hinschreiben?
-------------------------------------------------------------------
wie kann ich den Endwert begrenzen? Also 0-9 Zählen (bei mir Endwert
1+2)
'----------------------------
'Türüberwachung
'----------------------------
$regfile = "2313def.dat"        'AT90S2313-Deklarationen
$crystal = 3686400              'Quarz: 3.6864 MHz

Dim Tuer_1 As Bit
Dim Tuer_1_status As Bit
Dim Tuer_1_zaehler As Byte
Dim Endwert1 As Byte         'Endwert für Zaehler
Dim Endwert2 As Byte         'Endwert für Zaehler


Tuer_1 = 0
Tuer_1_status = 0
Tuer_1_zaehler = 0
Endwert1 = 0                  'Zaehlerbegrenzung 0-9
Endwert2 = 9                  'Zaehlerbegrenzung 0-9



Do

   Tuer_1 = Pinx.y           ' Pin für Tür festlegen

   if TUER_1 <> TUER_1_STATUS then ' Tür wurde auf oder zu gemacht
      if TUER_1 = 1 then           ' Tür offen
         incr TUER_1_ZAEHLER       ' Zähler um 1 erhöhen,
         TUER_1_STATUS = 1         ' Status OFFEN eintragen
         gosub ANZEIGE             ' Änderug anzeigen
      else                         ' Tür zu
         TUER_1_STATUS = 0         ' Status ZU eintragen
      end if
   end if

   . ' hier Code für andere Türen oder Anzeige
   .
   .
loop ' Endlosschleife
--------------------------------------------------------------------
Vielen Dank schon mal, Tobias

von Tobias Blome (Gast)


Lesenswert?

Hi Alex,
also wenn ich dich richtig verstehe minst du mit multiplex, das immer
nur ein Dispaly zur Zeit leuchtet? Und das Display was leuchten soll
bekommt ne Spannung auf die gemeinsame Anode/Kathode?  -> also bekommen
alles Displays das gleiche Signal zur Zeit - aber nur ein Display
leuchtet?

Tolle Idee - wenn ich´s richtig verstanden habe UND es umgesetzt
bekomme ;-)

Tobias

von harry (Gast)


Lesenswert?

hi tobias,

in- oder dekrement befehle erhöhen bzw verringert einen wert um jeweils
1, ist eigentlich 'ne sparversion von zähler = zähler + 1.
bei bascom heist's halt "incr Variable", bei manchen wie c
schreibste "variable ++", kommt aber auf's gleiche raus.

die sub-routine musst du erst mal deklarieren, damit der compiler
weiss, dass es sie gibt: "declare sub ANZEIGE"

und irgendwo steht dann die passende marke:

ANZEIGE:

cls: lcd "Anzahl Türöffnungen: "+str(TUER_1_ZAEHLER)
' schon haste die Anzahl auf'm display, ist um klassen einfacher als

' 7-segment anzeigen multiplexen

RETURN  ' wichtig, sonst läuft dein proc ins nirwana

das mit dem multiplexen geht so:
alle anzeigen bekommen den wert der Tür1, nur die erste kriegt
anoden/kathodenspannung, dann bekommen alle den wert von tür2, nur
anzeige 2 kriegt ...

gruss, harry

von Tobias Blome (Gast)


Angehängte Dateien:

Lesenswert?

Ach so, aber wenn ich nicht "multiplexe" kann ich doch keine 4
Anzeigen/Schalter ansteuern (mit 15 Ports) - oder doch?

Tobias

von harry (Gast)


Lesenswert?

na passt doch, die schlatung ist doch schon für multiplexbetrieb
ausgelegt. alle datenpins hängen parallel, über pb0 - 3 steuerste die
einzelnen anzeigen. wenn das dein orig ist, fehlen da nicht noch die
vorwiderstände? 5v direkt auf ein led-segment ist dessen zackiger tod,
es sei denn du stellst per software sicher, dass keiner 'dauerfeuer'
bekommt. oder sind diese dinger für so einen direktbetrieb ausgelegt,
und wenn ja, was sagt dein avr dazu, wenn 4x betriebsstrom fliessen
muss, könnten doch leicht mal 'n paar mamps zusammen kommen.

fröhliches toben noch, harry

von Tobias Blome (Gast)


Lesenswert?

hups, die Vorwiderstände hab ich ja ganz vergessen und ne´n paar
Transistoren werd ich wohl auch noch spendieren - vielen Dank!!!

Aber wie ist denn das mit dem Multiplexing? Eigendlich ist das doch so,
das ein Impuls von der Tür kommt - der wird gezählt - das erste
LED-Segment bekommt spannung auf die gemeinsame masse - dann kommt die
Zahl(leuchtet) - und dann müsste doch die Spannung für die gemeinsame
masse wieder abgeschaltet werden - und das ganze von forn für die
nächste Tür. Wenn ich die gemeinsame masse nicht nach jedem schritt
abschalte bekomme ich doch ein "Wirrwar" oder mache ich nun einen
Denkfehler?

Habe ich denn das mit dem entprellen richtig gezeichnet (Schalter und
100nF)

Tobias

von harry (Gast)


Lesenswert?

jo, das is' richtig so wenn du den internen pull-up verwendest, um die
pins high zu bekommen.
das mit dem wirrwar stimmt so prinzipiell schon wenn du alle anzeige
gleichzeitig aktiv hältst, allerdings schaltest du ja jeweils nur eine
anzeige aktiv.

tür 1 hat nen zählerstand von 2, die 2te 4, 3te 6 und die vierte 8.

anzeigen 1 - 4 bekommen eine 2, anzeige 1 bekommt masse, zeigt an, der
rest bleibt dunkel.
für tür 2 'ne 4 schreiben, 2. anzeige kriegt masse, rest ist dunkel,
usw.

wenn du das schnell genug ausgibst (70x/sek, bei 50hz flackerts noch)
haste alle anzeigen als stehendes bild obwohl die seriell geschrieben
werden.

na denn, fröhliches schaffen noch, bis moin denn...

von Tobias Blome (Gast)


Angehängte Dateien:

Lesenswert?

So,
also ier ist nun die Schaltung mit allen Vorwiderständen und
Transistoren - sollte funktionieren ;-)
-------------------------------------------------------
ANZEIGE:

cls: lcd "Anzahl Türöffnungen: "+str(TUER_1_ZAEHLER)
' schon haste die Anzahl auf'm display, ist um klassen einfacher als

' 7-segment anzeigen multiplexen

RETURN  ' wichtig, sonst läuft dein proc ins nirwana

und wo geht das Programm weiter wenn ichbei Return angekommen bin?
geht´s dann da weiter wo der Befehl zur Sprungmarke ANZEIGE: steht?

Portb = &B0000 'PB 0-3 auf Low setzen?  -> funktioniert das um die
aktive anzeige zu deaktivieren damit beim nächsten durchlauf die
nächste Anzeige an geht? ach ja, und wo soll ich das hinschreiben?

Tobias

von Tobias Blome (Gast)


Lesenswert?

ANZEIGE:

cls: lcd "Anzahl Türöffnungen: "+str(TUER_1_ZAEHLER)
' schon haste die Anzahl auf'm display, ist um klassen einfacher als

' 7-segment anzeigen multiplexen
--------
wie kann ich angeben an welchem port die LED´s hängen? und welches die
dazugehörige gemeinsame anode ist?

Tobias

von harry (Gast)


Lesenswert?

hi,

das mit 'cls:lcd "Text..." ' war eigentlich für'n lcd-display
gedacht.
ist halt weit weniger aufwand als 'ne 7segment anzeige, brauchst auch
keine transistoren und widerstände, sondern direkt dran, verbraucht
auch nur 4 pin's und ist supereinfach zu steuern.

wenn du aber die led's willst musste das 'händisch' machen, also
jeden pin einzeln proggen. ob das mit portb = wert funktioniert, weiss
ich nicht, meines wissen schreibt der nur die register, ich verwende
'set pind.X' und 'reset pin...' um ein pin zu setzen. ob du 'nen
kompletten port setzen kannst musste probieren, tät mich auch
interessieren.

die vielen transistoren gegen gnd könntest du in deiner schaltung durch
'mem uln2003 ersetzen, sind 7 treiber drinne.

zum return: dein prog geht nach dem sub-aufruf weiter.

gruss, harry

von Tobias Blome (Gast)


Lesenswert?

hi,
also ich weiss, das dieser Befehl funzt:

Portd = B0000000            'PD0...PD6 auf Low setzen
Portb = B00000000           'PB0...PB7 auf Low setzen

das hab ich in einem programm benuzt um am Anfang alles Ports zu
löschen!
---

aber zu deinem Vorschlag: Was muss denn das LCD können - oder was muss
da für´n Chip / Konverter drauf sein?

---
ich hab nur in meine Schublade gesehen und da waren noch 4
LED-Display´s ;-)
---
ja und wie ist das mit set / reset? - ist das so richtig?

"set pind.PD1" und "reset pin.PD1"


Tobias

von harry (Gast)


Lesenswert?

hi,

muss heissen: 'set pind.1' oder 'reset pind.1'

'ne schicke variante ist auch per alias, macht alles übersichlicher.
Motor alias pind.1
set Motor

die lcd-display haben gewöhnlixh den hd44780 oder ks0066 drauf.
ich verwend meistens die 2-zeiligen mit je 16 zeichen.
die dinger gibts aber von 1x8 - 4x20, exotische typen bis 40 zeichen.
funktionsmuster gibts in alten faxgeräten, druckern... oder bei mir.

gruss, harry

von Tobias Blome (Gast)


Lesenswert?

Hi,

du schreibts gewöhnlich chip ...! ist das denn egal muss man nur darauf
achten das man 4 Leitungen hat? Und wie sage ich wo das LCD dranhängt?

Mir kam da noch so ne idee...........  ;-)

ähhh ja (grins)
wie groß ist denn der Aufwand, wen man da noch ne Uhr programmiert so
das man auch sehem kann wann die tür offen war? (zweizeiliges Display
oben Tür 1-4 und darunter die letzte uhrzeit als die jeweilige tür
offen war)
- wenn nicht dann nicht war nur so ne idee   ;-)

gruss Tobias

von harry (Gast)


Lesenswert?

hi,

hier mal der config für das lcd, hab's grade mal aus nem prog kopiert,
bei dir liegen die pins wohl woanders, kannste aber überall hinlegen,

$crystal = 3686411
$baud = 9600
$regfile = "m16def.dat"
'---------------------------------------------------------------------
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 ,
Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2

Config Lcd = 16 * 2
Cursor Off Noblink           ' Cursor aus
'---------------------------------------------------------------------

das mit dem display-controller is nich egal, aber es ist echt schwer,
andere bei den 'normalen' händlern zu kriegen.

die nummer mit der uhr ist kein grosser aufwand, du musst die uhr halt
stellen, wenn das prog losläuft. wenn spannung weg steht auch uhr.
die uhr machste am einfachsten mit 'nem timer-int, der auf 1 sek.
geprogt ist. bei jedem aufruf 'incr sekunden'. wenn 60 sekunden voll,
sekunden nullen un minuten 1 erhöhen, stunden genauso.

gruss und fröhliches schaffen, harry

von Tobias Blome (Gast)


Angehängte Dateien:

Lesenswert?

hi,
kling echt einfach - nur ob ich das so umgesetzt bekomme.. ;-)
mal sehen
Ach so - das LCD braucht doch keine vorwiderstände. Das kann ich doch
mit +5V ansteuern? sollte der µC doch schaffen oder...?

Ich probiers mal einfach...

Also:
ich hab hier ein Display mit einer HD4478-kompatieblen Schnittstelle -
so steht das hier! Das Ding ist von Reichelt Elektronik und heisst: LCD
162C  -  2Zeilen x je 16 Zeichen   -  Die Pin´s sind von 1-16
nummeriert. Und welcher Pin ist welcher? PDF im Anhang...
Also da steht drin:

1    2   3  4  5  6  7   8   9   10  11  12  13  14  15 16
VSS VDD VO RS R/W E DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7 BLA BLK

Tja brauch ich das alles - du hast bei dir nur 6 angeschlossen wenn ich
das richtig sehe.

Tobias

von harry (Gast)


Lesenswert?

moin,

nee, braucht keine widerstände, direkt dran.

Pin 1: GND
Pin 2: +5V
Pin 3: Kontrast (kannste auf Masse legen, ist für 0-1v (0-5 auch ok)
Pin 4: RS  -> AVR
Pin 5: R/W -> GND (read/write mode, wir writen nur)
Pin 6: E   -> AVR
Pin 7-10:  -> GND
Pin 11-14: -> AVR
Pin 15-16: Beleuchtung, wenn drinne und gebraucht wird, sonst frei

jo, das war's schon, so anschliessen, schon funzt das teil.

fröhliches 'fernsehgucken' noch, harry

von Markus (Gast)


Lesenswert?

@Tobias Blome

welche transistoren verwendest du denn zur bearbeitung der
7segmentanzeigen in deiner skizze? bc546 oder bc559?

von Chaldäer (Gast)


Lesenswert?

Noch ein kleiner besserwisserischer Hinweis von mir.
Im Schaltplan ist die Bezeichnung der gemeinsamen Anode etwas
fehlerhaft. 'dp' bezeichnet den Dezimalpunkt. 'ca' wäre an der
Stelle richtiger.

Hoffe mal, mich nicht zu irren... ;)

Gruß,
Chaldäer

von Tobias Blome (Gast)


Lesenswert?

Hi Markus,
also die Schaltung hab ich bis jetzt nur mit einer 7-Segmentanzeige
aufgebaut - genauer gesagt: Ich habe nur 3 Segmente die ich ansteuern
kann(bis jetzt / nur zum test) Ja, und ich habe   !nur!  den BC639
benuzt für alle eingezeichneten Transistoren. und es funzt!

bis dann, Tobias

von Tobias Blome (Gast)


Lesenswert?

Hi Chaldäer,
also ich kenne weder die Bezeichnung "dp" noch "ca". Ich hab mit
"S-Plan" gezeichnet und da war nur diese eine 7-Segmentanzeige ;-)
Hab mir aber auchnichts weiter dabei gedacht... Aber was heisst den
"ca"?

Tobias

von Tobias Blome (Gast)


Lesenswert?

Hi Markus,
nur Intressehalber: wie kommst du auf: bc546 oder bc559?

Ganz oben im Bild. 2. Transistor von Links (T2) ist mit BC639
bezeichnet - aber nur wenn man das Bild vergrößert ;-)

Tobias

von Uwe (Gast)


Lesenswert?

ca steht für gemeinsame Anode.

von Markus (Gast)


Lesenswert?

hi tobias, es sind die einzigen transitoren die ich kenne und meines
erachtens recht häufig auftauchen. und ausserdem hab ich da noch einige
von, während von den BC639 ich keinen mehr hab *g
also werden für alle transistoren bei deinem plan die BC639 genommen?

Gruß Markus

von Tobias Blome (Gast)


Lesenswert?

Jip, aber du kannst bestimmt auch (beliebig) andere nehmen, weil die
hier ja nur als Schalter genutzt werden.

Tobias

von Tobias Blome (Gast)


Lesenswert?

Hi,
ich hab das Programm Bascom-AVR und da ist ja ne´ tolle Hilfe drin -
aber gibt es die auch auf DEUTSCH - dann würde ich mich sehr viel
schneller zurechtfinden :-)
vielleicht ne´ *.help datei oder so?
--

Uhrzeit?
als Beispiel hab ich dieses Programm gefunden: aber wie funktioniert
das mit dem konfigurieren des LCD´s? LcdBus?
'----------------
Enable Interrupts
'[configure LCD]
$lcd = &HC000                             'address for E and RS
$lcdrs = &H8000                           'address for only E
Config Lcd = 20 * 4                       'nice display from bg micro
Config Lcdbus = 4                         'we run it in bus mode and I
hooked up only db4-db7
Config Lcdmode = Bus                      'tell about the bus mode


Tobias

von Tobias Blome (Gast)


Lesenswert?

So,
also soweit klappt es jetzt! zumindest in der Simulation ;-)
in der Realität nicht :-(

es erscheint zwar der Richtige text aber ich kann nicht mit dem Kontakt
Zählen wenn ich ihn auf Masse ziehe!

'-----------------------------------------------------------------
'Türüberwachung
'----------------------------
$regfile = "2313def.dat"
'AT90S2313-Deklarationen
$crystal = 3686400                                          'Quarz:
3.6864 MHz
'---------------------------------------------------------------------
Ddrd.5 = 0                                                  'PD5 als
Eingang setzen
Dim Tuer_1 As Bit
Dim Tuer_1_status As Bit
Dim Tuer_1_zaehler As Byte
Dim Sresult As String * 16 At &H64 Overlay
Dim Result(16) As Byte At &H64


Declare Sub Anzeige

Tuer_1 = 0
Tuer_1_status = 0
Tuer_1_zaehler = 0
'---------------------------------------------------------------------
'LCD Anzeige
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.3 , Db6 = Portb.2 ,
Db7 = Portb.1 , E = Portd.6 , Rs = Portb.0
Cursor Off Noblink                                          ' Cursor
aus


'---------------------------------------------------------------------

Do


   Tuer_1 = Portd.5                                         ' Pin für
Tür festlegen

   If Tuer_1 <> Tuer_1_status Then                          ' Tür
wurde auf oder zu gemacht
      If Tuer_1 = 1 Then                                    ' Tür
offen
         Incr Tuer_1_zaehler                                ' Zähler
um 1 erhöhen,
         Tuer_1_status = 1                                  ' Status
OFFEN eintragen
         Gosub Anzeige                                      ' Änderug
anzeigen
      Else                                                  ' Tür zu
         Tuer_1_status = 0                                  ' Status
ZU eintragen

        End If
    End If

                                                          ' hier Code
für andere Türen oder Anzeige


Loop                                                        '
Endlosschleife




Anzeige:
Home Upper                                                  'in die
obere zeile gehen
Lcd "Anzahl: " + Str(tuer_1_zaehler)
Home Lower                                                  'in die
untere zeile gehen
Lcd "Uhrzeit: ??? :-)"


Return                                                      ' wichtig,
sonst läuft dein proc ins nirwana

von Tobias Blome (Gast)


Lesenswert?

Also es wird nun richtig angezeigt aber ich hab das Gefühl, das der
Taster an PD5 nicht erkannt wird (schaltet auf MASSE) Ist der
Pullup/pulldown widerstand richtig?
'------------------------------------------------------------------
'Türüberwachung
'----------------------------
$regfile = "2313def.dat"
'AT90S2313-Deklarationen
$crystal = 3686400                                          'Quarz:
3.6864 MHz
'---------------------------------------------------------------------

Dim Tuer_1 As Bit
Dim Tuer_1_status As Bit
Dim Tuer_1_zaehler As Byte
'LCD
Dim Sresult As String * 16 At &H64 Overlay
Dim Result(16) As Byte At &H64

Ddrd.5 = 0                                                  'PD5 als
Eingang setzen

Declare Sub Anzeige

Tuer_1 = 0
Tuer_1_status = 0
Tuer_1_zaehler = 0
'---------------------------------------------------------------------
'LCD Anzeige
'---------------------------------------------------------------------

Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.3 , Db6 = Portb.2 ,
Db7 = Portb.1 , E = Portd.6 , Rs = Portb.0
Cursor Off Noblink                                          ' Cursor
aus
'-------------------
Anzeige:
Home Upper                                                  'in die
obere zeile gehen
 Cls : Lcd "Anzahl: " + Str(tuer_1_zaehler)                 'Anzahl
Türöffnungen
Home Lower                                                  'in die
untere zeile gehen
Lcd "Uhrzeit: ??? :-)"


'Return
                                                      ' wichtig

'---------------------------------------------------------------------
'            Zaehlen:
'---------------------------------------------------------------------

Do


   Tuer_1 = Portd.5                                         ' Pin für
Tür festlegen

   If Tuer_1 <> Tuer_1_status Then                          ' Tür
wurde auf oder zu gemacht
      If Tuer_1 = 1 Then                                    ' Tür
offen
         Incr Tuer_1_zaehler                                ' Zähler
um 1 erhöhen,
         Tuer_1_status = 1                                  ' Status
OFFEN eintragen
         Gosub Anzeige                                      ' Änderug
anzeigen
      Else                                                  ' Tür zu
         Tuer_1_status = 0                                  ' Status
ZU eintragen

        End If
    End If

                                                          ' hier Code
für andere Türen oder Anzeige


Loop                                                        '
Endlosschleife

von Michael Bertz (Gast)


Lesenswert?

Hallo Tobias,
versuche doch mal folgendes:

Do
   Tuer_1 = Pind.5
   ...
Loop

Mit "Tuer_1 = Portd.5" liest du nur den Zustand des Pull-Up
Widerstandes aus.

Michael

von Tobias Blome (Gast)


Lesenswert?

Hallo Michael,
vielen Dank für den Tip aber:

Wenn der Schalter geschlossen ist (D5 auf Masse) ist alles ok aber wenn
ich die Tür auf mache (undefinierter Zustand) dann zählt er bis 256 und
fängt sofort wieder von forne an.

Tobias

von Tobias Blome (Gast)


Lesenswert?

Aha,
nun geht´s: vor die Do-Schleife muss noch: Portd.5 = 1

Aber auf dem LCD zählt er nur bis 17! bei 18stehen noch 2 unleserliche
Zeichen dahinter 19 wird nicht angezeigt und dann fängt er wieder von
forne an!
Dabei hab ich doch gesagt "Dim Tuer_1_zaehler As Byte "

Tobias

von harry (Gast)


Lesenswert?

hi,
sorry, die macke hab' ich gestreut, war so adhoc zusammengestrickt.

das prog macht folgendes:


   If Tuer_1 <> Tuer_1_status Then  ' Tür wurde auf oder zu gemacht
      If Tuer_1 = 1 Then            ' Tür offen
         Incr Tuer_1_zaehler        ' Zähler um 1 erhöhen,
         Tuer_1_status = 1          ' Status OFFEN eintragen
         Gosub Anzeige              ' Änderug anzeigen
      Else                          ' Tür zu
         Tuer_1_status = 0          ' ZU eintragen (*)
      End If
   End If

(*) wenn die tür geöffnet wird ist der status noch 0, die Tür_1 steht
auf 1. solange sie offenbleibt, bleibt Tür_1 auf 1, status wird aber
auf 0 zurückgesetzt, weil die bedingung "if tuer_1 <> Tuer_status
then" nicht mehr erfüllt wird, status ist ja noch auf 1, verzweigung
in den ELSE-zweig, status wird auf 0 zurückgesetzt. beim nächsten
durchlauf wird die bedingung wieder erfüllt, zähler um 1 erhöht, status
zugewiesen, raus aus if...then. wenn die do-schleife von vorn losgeht
gleiche prozedur wie eben. der status darf erst neu zugewiesen werden,
wenn die tür wieder geschlossen wird. machste im else-zweig.

macke is, der zählt bei jeder statusänderung


If Tuer_1 =1 and Tuer_1_status = 0 Then  ' Tür wurde aufgemacht
   Incr Tuer_1_zaehler        ' Zähler um 1 erhöhen,
   Tuer_1_status = 1          ' Status OFFEN eintragen
   Gosub Anzeige              ' Änderung anzeigen
end if
if tuer_1 = 0 then Tuer_1_status = 0 ' Tür zu, status zuweisen

so zählt das prog nur, wenn die tür aufgemacht wird, wenn sie offen ist
tut sich nix, wenn sie geschlossen wird, wird nur der status
geschrieben, fertig.

die sache mit der anzeige musst du mal 'händisch' ausprobieren,
irgendwelche texte ausgeben, zählschleife bauen, sehen wann das teil
tilt. ganz gut wäre noch ein "waitms 100" in die do...loop
einzubauen, sonst rasselt das prog im affentempo, muss nich sein.

die hilfe gibt's meines wissens nur in englisch, aber ich kann mich
irren, vielleicht mal bei mcs anfragen.

gruss, harry

von Tobias Blome (Gast)


Lesenswert?

also so geht es jetzt - aber ich muss pd5 am anfang auf high setzen
damit das funzt. und das heist, das der zähler schon ein signal bekommt
und für mich also mit 1 zu zählen anfängt :-(
leider kann ich "Tuer_1_zaehler = 0" ja nicht auf -1 setzen:-)
zumindest meckert er dann.

Tobias


'Türüberwachung
'----------------------------
$regfile = "2313def.dat"
'AT90S2313-Deklarationen
$crystal = 3686400                                          'Quarz:
3.6864 MHz
'---------------------------------------------------------------------

Dim Tuer_1 As Bit
Dim Tuer_1_status As Bit
Dim Tuer_1_zaehler As Byte
'LCD
Dim Sresult As String * 16 At &H64 Overlay
Dim Result(16) As Byte At &H64

Ddrd.5 = 0                             'PD5 als Eingang setzen

Declare Sub Anzeige
Tuer_1 = 0
Tuer_1_status = 0
Tuer_1_zaehler = 0

'---------------------------------------------------------------------
'LCD Anzeige
'---------------------------------------------------------------------

Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.3 , Db6 = Portb.2 ,
Db7 = Portb.1 , E = Portd.6 , Rs = Portb.0
Cursor Off Noblink                      ' Cursor aus
'-------------------
Anzeige:
Home Upper                                 'in die obere zeile gehen
 Cls : Lcd "Anzahl: " + Str(tuer_1_zaehler)    'Anzahl Türöffnungen
Home Lower                                 'in die untere zeile gehen
Lcd "Uhrzeit: ??? :-)"


'Return
                                            ' wichtig

'---------------------------------------------------------------------
'            Zaehlen:
'---------------------------------------------------------------------


    Portd.5 = 1                           'D5 auf 1 setzen
     Do


     Tuer_1 = Pind.5              ' Pin für Tür festlegen

  If Tuer_1 =1 and Tuer_1_status = 0 Then  ' Tür wurde aufgemacht
   Incr Tuer_1_zaehler        ' Zähler um 1 erhöhen,
   Tuer_1_status = 1          ' Status OFFEN eintragen
   Gosub Anzeige              ' Änderung anzeigen
end if
if tuer_1 = 0 then Tuer_1_status = 0 ' Tür zu, status zuweisen
Waitms 100



Loop                       ' Endlosschleife

von Tobias Blome (Gast)


Lesenswert?

Ich hab versucht über 18 hinaus zu zählen aber auch wenn ich "Dim
Tuer_1_zaehler As word" eingebe funzt das nicht es sieht so aus als
wenn ich da einen Speicherüberlauf habe!
Aber ein Byte hat doch 256 Möglichkeiten oder stimmt das nicht?

Tobias

von harry (Gast)


Lesenswert?

doch stimmt. hast du mal eine einfache zählschleife ausprobiert?
was macht dein display damit

dim x as byte

for x = 0 to 1000
   cls : lcd x
   wait 1
next

von Tobias Blome (Gast)


Lesenswert?

jaaa,
ich musste bis auf 255 runter gehen wegen byte=256
UND ER HAT AUCH BIS 255 GEZÄHLT!!!:-)


For X = 0 To 255
   cls : lcd x
   Waitms 300
next

von harry (Gast)


Lesenswert?

gut, dann ist dein display schonmal ok. normalerweise sollte das teil ab
255 wieder von vorn anfangen zu zählen, is hier aber egal. kannst ja
auch mal x = word vorgeben, dann sollters bis 65535 machen. so, un
jetzt sukzessive den restlichen code dazu, dann kriegste ja mit, ab
wann der avr tilt.

von Tobias Blome (Gast)


Lesenswert?

???????????????????????????????????????????????????????????????????????? 
????????????????????????????????????????????????????????????????????
jetzt bin ich ganz verwirrt: es geht in diesem zustand:

'---------------------------------------------------------------------
'            Zaehlen:
'---------------------------------------------------------------------


    Portd.5 = 1                                             'D5 auf 1
setzen
     Do


     Tuer_1 = Pind.5                                        ' Pin für
Tür festlegen

  If Tuer_1 = 1 And Tuer_1_status = 0 Then                  ' Tür
wurde aufgemacht
   Incr Tuer_1_zaehler                                      ' Zähler
um 1 erhöhen,
   Tuer_1_status = 1                                        ' Status
OFFEN eintragen
   'Gosub Anzeige                                            '
Änderung anzeigen
End If
If Tuer_1 = 0 Then Tuer_1_status = 0                        ' Tür zu,
status zuweisen
Waitms 100

For X = 0 To 20
   'Cls : Lcd "Anz: " + Str(x)
'Anzahl Türöffnungen

   Home Upper                                                  'in die
obere zeile gehen
 Cls : Lcd "Anzahl: " + Str(tuer_1_zaehler)                 'Anzahl
Türöffnungen
Home Lower                                                  'in die
untere zeile gehen
Lcd "Uhrzeit:" + Str(x)


   Waitms 10

Next

Loop                                                        '
Endlosschleife

von Tobias Blome (Gast)


Lesenswert?

??????????
also jetzt geht das ganze prog.!!!!!!!!!
ich hab nurr den befehl für das lcd von oben nach unten verschoben aber
in die loop-Schleifer gepakt - und es funzt!!!

DANKE!!!!!!!!!!!!

so und nun zu meiner Zeit:
ich hab gelesen das es da eine Systemzeit gibt?!

Target = SysSec(bSecMinHour)

wie genau funzt das?
und ist das genauer als ein zähler? weil der zähler ist ja von der
zykluszeit abhängig.

Tobias

von harry (Gast)


Lesenswert?

na klasse, wenn funzt immer gut.
das mit der systemzeit wird meines wissen auch über 'nen timer
gemacht, einen realtime-baustein hat der avr ja nich onboard.
in den timer musste dich reinlesen, hab ich bis jetzt noch nie
gebraucht. die genauigkeit der uhrzeit ist schon zyklusabhängig, wenn
du die cpu-clock meinst. mit 'nem quarz und etwas feinschliff kriegste
das teil auf +- 10 sec/monat hin, ich hab für'n freund mal so 'ne alte
bahnhofsuhr mit avr 'befeuert', ging ganz gut.
genauer als ein zähler is ansonsten nur das referenzteil, aus dem das
dcf77-signal abgeleitet wird. ein zähler is nich ungenau, nur die
zeitbasis und damit der takt kann ungenau sein.

gruss, harry

von Tobias Blome (Gast)


Lesenswert?

wie meinst du das: mit 'nem quarz ?
muss ich da noch nen quarz anschließen oder meinst du den quarz den ich
sowieso schon dran hab?

Tobias

von harry (Gast)


Lesenswert?

ich mein' den, der ohnehin schon dran is.

von Tobias Blome (Gast)


Lesenswert?

gut, ich probier´s

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.