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
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
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ß
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
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
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
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
Ach so, aber wenn ich nicht "multiplexe" kann ich doch keine 4 Anzeigen/Schalter ansteuern (mit 15 Ports) - oder doch? Tobias
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
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
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...
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
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
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
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
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
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
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
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
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
@Tobias Blome welche transistoren verwendest du denn zur bearbeitung der 7segmentanzeigen in deiner skizze? bc546 oder bc559?
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
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
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
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
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
Jip, aber du kannst bestimmt auch (beliebig) andere nehmen, weil die hier ja nur als Schalter genutzt werden. Tobias
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
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
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
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
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
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
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
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
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
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
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
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.
???????????????????????????????????????????????????????????????????????? ???????????????????????????????????????????????????????????????????? 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
?????????? 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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.