PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Hilfe: Porterweiterung mit 5 74HC573 macht was es will :-(



Hei.Mor
16.08.2004, 23:19
Hallo Ihr,
nachdem ich das super Forum hier gesehen habe, habe mich erstmalig an die AVRs rangewagt. Als Programmiersprache habe ich Bascom ausgewählt.
Habe mir den Programmieradapter mit 74244 gebaut und aus Verzweiflung 2 Boards gebaut. Eins mit dem 2313 und eins mit Atmega8, aber beide mit dem selben Fehler.
Ich hatte vor mir so eine Rheinturmuhr zu bauen (Lauflicht). Dazu habe ich mir die Porterweiterung aufgebaut, so wie unter
http://www.roboter-projekte.de/porterweiterung.htm
beschrieben mit 5x74HC573.
Alles funktioniert im Prinzip, nur macht die "Zehner"-Anzeige der Stunden was sie will.
Mal zählen die einer Std bis 9 und anstelle die erste Zehner h angeht, geht die zweite h an.
Mal zählen die einer h bis 9 hoch, obwohl beide zehner h an sind.
Soll ja nur bis 24 anzeigen......
Ich weiss nicht wo der Fehler liegt, das kann nach Prog. nicht sein!

Ich hoffe ihr könnt einem Anfänger den Frust nehmen....hänge schon seit Wochen hier dran.

Programm hier als Anhang.


Grüße
Heinz

fzehner
17.08.2004, 10:46
als erstes würde ich bei

Portd.X = 1
' Waitms 0.5
Portd.X = 0

Waitms 1 einfügen, damit das Latch auch die Daten richtig übernehmen kann, dann würde ich bei jeder Änderung der Stunde mit Print mir die aktuellen Werte anzeigen lassen, dazu sollte die Uhr natürlich etwas schneller laufen.

Hei.Mor
17.08.2004, 10:50
Hallo,

danke für die Antwort.
Das mit dem Warten zur Übernahme habe ich bis zu 5ms ausprobiert, aber da treten dann andere Probleme auf. Ich nehme an das dann wieder der Interrupt ausgelöst wird bevor die Anzeige Routine zu beendet ist.

Wie meinst du das mit Print?
Wohin kann ich mir denn die Werte senden lassen?

Gruß
Heinz

fzehner
17.08.2004, 12:38
Unter Bascom kannst Du mit Print die Werte über die serielle Schnittstelle ausgeben. Die serielle Schnittstelle des MCs kannst Du über einen Pegelwandler an die serielle Schnittstelle Deines PCs anschließen. Die Werte werden dann in einem Terminalprogramm angezeigt.

fzehner
17.08.2004, 15:19
Hallo Heinz,

kannst Du bitte mal testen, ob das Programm funktioniert? Habe es eben mal schnell im Editor geschrieben. Bin am überlegen, ob ich die Uhr nicht nachbaue sieht garantiert super in einem schwarzen Alurohr aus.

Gruss Frank

Hei.Mor
17.08.2004, 18:35
Hallo,
habe Dein Progr nicht übertragen können.
Bascom macht mir überall bei den Zeilen mit Shift verschiedene
Fehlermeldungen.

Ansonsten probiere ich das gerne wieder aus.

PS: Sieht ja professioneller aus als mein Prog :-)

fzehner
18.08.2004, 01:56
Hallo Heinz,

ich habe die Fehler im Programm korrigiert, das Programm wird jetzt ohne Fehler compiliert. Gleichzeitig habe ich die Routinen für die Aktualisierung der Zeit und der Anzeige aus der Interrupt-Routine herausgenommen und in ein Unterprogramm gepackt, damit die Interrupt-Routine möglichst kurz ist.

Gruss Frank

P.S. danke für die Blumen, Dein Ansatz zur Lösung ist aber auch nicht schlecht, er benötigt nur mehr Speicher

Hei.Mor
18.08.2004, 22:24
Hallo Frank,

also, es funktioniert auch nicht so ganz.
Sek: Einer und Zehner ist ok,
Min: Einer zählen bis 9 hoch , wechsel auf Zehner ist ok,
wenn aber die 5te Zehner angehen soll, (49 Min) stimmt die Anzeige gar nicht mehr,
Std: Zählen nur bis 8 hoch


Aber: Wo ist denn der Fehler in meinem Programm mit der Stundenanzeige? Meine Stundenanzeige geht ja mal und mal nicht, d.h. der erste Durchlauf funktioniert nicht, der 2te geht.
Sonst funktioniert ja alles.

fzehner
19.08.2004, 00:07
If Std_e >= 4 Then
If Std_z = 2 Then
Std_e = 0
Std_z = 0
For X = 0 To 10
S_std_e(x) = 1
Next X
For X = 0 To 3
S_std_z(x) = 1
Next X
Set S_std_z
End If
End If

Wofür verwendest Du Set S_std_z? Das ist der einzige Befehl, der mir etwas spanisch vorkommt.

Weiter würde ich in der Initialisierung die Werte für Sec_e, Sec_z ... gleich 0 setzen. Bei den meisten Werten ist das zwar egal, weil spätestens nach dem 2. Durchlauf Dein Programm die Werte richtig gesetzt hat, aber gerade bei Std_z spielt es eine große Rolle, wenn durch Zufall Std_z größer 2 ist, dann wird ein ganzer Programmteil nie ausgeführt, die Stunden zählen von 0 bis 9 durch und bei den Zehnern tut sich nichts.

Mit diesen Änderungen müsste Dein Programm funktionieren.

Hei.Mor
19.08.2004, 23:18
Hallo Frank,

ich verzweifel bald, es geht immer noch nicht.
Aber danke für die Hilfe.
"Set" war ein Versehen...schon mal gut das andere draufschauen..man wird ja doch Betriebsblind :-)

Grüße

fzehner
20.08.2004, 00:47
Geht mir ähnlich, ich kann auch keinen direkten Fehler entdecken.

Die Bedingung "If Std_z < 2 Then" bei den zehner Stunden kannst Du weglassen, da sie immer wahr ist.

Was mich besonders verwundert ist, dass nur der erste Durchlauf fehlerhaft ist, wenn sich der Fehler bei jedem Durchlauf zeigen würde, dann würde ich sagen, dass Du eventuell etwas falsch verkabelt hast.

Hast Du die Variablen mal mit einem Wert vorbelegt?

Werde die Schaltung in den nächsten Tagen/Wochen die Schaltung nachbauen, dann kann ich Dein Programm auch besser testen.

Hei.Mor
20.08.2004, 15:47
Hallo Frank,

ja, das hatte ich auch probiert, brachte aber nichts.
Ich habe auch mal die Zehner-Anzeige auf die Ports der Sekunden ausgegeben, um zu testen ob die Schaltung Probleme mit Leitungslängen etc hat, gleicher Effekt.

Kann das mit den Tastern zusammenhängen?
Die werden ja nur im Sekundentakt (bei jedem Interrupt) abgefragt, daher dachte ich eine Entprellung brauche ich nicht.
Aber wenn ich den Taster für die Min Einstellung bzw. Std. Einstellung benutze um die Zeit einzustellen, habe ich den Fehler.
(Taster verbinden den Port mit Masse, wenn betätigt, daher auch der Pull-up Wiederstand intern auf 1)

Ich habe jetzt die Uhr mal ohne Einstellung gestartet, mal sehen was in den nächten 24 Std passiert.

Wenn du auch so eine Uhr in der Art, mit der Schaltung aufbaust wäre das natürlich klasse wenn du mir weiter Nachricht "Nachhilfe" geben würdest.
Ich dachte eigentlich, fürs erste Probieren mit AVR klappt ja alles super mit den Schaltungen, Timer und Interrupts aber ....

Wie kann man denn so was im AVR-Studio simulieren?
Man müsste ja die Zustände die an die Ports ausgegeben werden dann auch sehen oder?

Fragen über Fragen von einem Anfänger... wie lange bastelst du schon mit AVR?


Grüße
Heinz


PS: Die 74HC573 sind auch preiswert, kosten bei uns hier (Ddorf) 33ct

fzehner
20.08.2004, 19:07
Hallo Heinz,

ich glaube nicht, dass es mit den Tasten zusammenhängt, da ja maximal nur ein Impuls pro Sekunde ausgelöst werden kann. Eine prellende Taste ist nur kritisch, wenn Du sofort mit der Erhöhung eines Wertes auf die Taste reagierst. Durfte das Prellen von Tasten mal an einem Speicheroszi untersuchen.

Ich werde Dein Programm einfach mal testen ohne Hardware, statt auf die Ports schreibe ich die Werte einfach über die serielle Schnittstelle auf den PC.

Mit AVRs bastele ich erst seit einem Monat :-) Ich habe aber vor rund 20 Jahren angefangen und einen meiner ersten Computer selber zusammengelötet. Die Kiste hatte damals gerade mal 1k Speicher mit einer Speichererweiterung kam ich auf 16k, da sind die heutigen AVRs geradezu Luxus.

Gruss Frank

P.S. Du musst Zeit oder viel Geduld haben, dass du 24 Stunden auf die Uhr wartest. Zum Testen würde ich die Uhr schneller laufen lassen :-)

P.P.S. die Elektronik ist nich das Problem, nur will wenn ich das Ganze aufbaue gleich eine "Designeruhr" bauen, die dann entweder in meinem Büro oder in meinem Wohnzimmer hängt und das dauert halt etwas.

Hei.Mor
20.08.2004, 20:55
Hallo Frank,

habe gar nicht erst 24 Std abwarten brauchen.
Wieder der selbe Fehler, nach 9 Std geht die 2.te Zehner LED an, nicht die 1.te Zehner.
Komisch ist, dass nach weiteren 4Std die Anzeige wieder gelöscht wird, d.h. die SW meint es sind schon 24 STd vergangen, obwohl nur 14 Std vergangen sind, aber die 2te Zehner ist an und die 1te. Zehner nicht...

Liegt also auch nicht an den Tastern.

20 Jahre Erfahrung ist nicht schlecht....Du bist ja dann der erfahrene Hard"werker". Alle Achtung.

Meinte mit den Bauteilpreisen eigentlich nur, dass die Ansteuerung so sehr einfach (wenns denn mal funktionieren würde) und preiswert ist, im Gegensatz zu I2C Porterweiterungen, von denen ich ja schon mal gar keine Ahnung habe O:)

Grüße
Heinz

fzehner
23.08.2004, 00:13
Hallo Heinz,

ich glaube ich habe den Fehler gefunden. Er tritt aber nicht erst nach 9 Stunden auf, sondern direkt nach 10 Sekunden.
For X = 0 To 10
S_sec_e(x) = 1
Next X
in dieser Anweisung liegt der Fehler (scheiss Basic-Dialekte). Bei Bascom beginnen die Arrays mit 1. Das hat zur Folge, dass Du mit S_sec_e(0)=1 (X=0) den Wert für Std_z =1 setzt, da er direkt vor dem Array liegt. Wird nach 10 Stunden der Stunden wert erhöht, dann nicht von 0 auf 1, sondern gleich von 1 auf 2, die zweite LED wird eingeschaltet.
Genaugenommen sind auch die anderen For X=0 To ... Schleifen fehlerhaft, hier werden aber keine Variablen angesprochen, die im Programm verwendet werden bzw die sowieso schon den Wert 1 haben.

Das Problem ist / war, dass bei unterschiedlichen Basic-Versionen Arrays mal mit 0 und mal mit 1 beginnen. Bei Visual Basic kann man sogar durch einen Befehl den Beginn von Arrays festlegen. Bedingt durch den kleinen Speicher prüft Bascom nicht, ob Array-Grenzen überschritten werden.

Gruss Frank

Hei.Mor
23.08.2004, 20:02
O:) O:) O:)

Super Frank, das war es !!

Vielen Dank für die Hilfe.


(Mist Basic ! Wenn das Array erst ab 1 beginnt, sollte es auch nicht ab 0 zu Programmieren sein)

fzehner
24.08.2004, 00:58
Na ja, Basic ist nicht unbedingt das Problem. Es gibt Basic-Compiler, die zusätzlichen Code für die Prüfung von Array-Grenzen erzeugen, diese Prüfung kann nur zur Laufzeit erfolgen. Bei Bascom wird dieser Code nicht erzeugt, wodurch die Programme natürlich auch deutlich kleiner bleiben. Ich sehe die verschiedenen Dialekte als Problem, da hierdurch die Fehlersuche erheblich erschwert wird. Auf dem einen System funktioniert das Programm, auf dem anderen nicht, dass ist ärgerlich.