Hallo an Alle, kann sich mal jemand mein Testprogramm für eine Uhr anschauen? Die Interrupt-Routine scheint nicht zu funktionieren. Alle weiteren Funktionen (Tasterabfragen, Anzeige der Uhrzeit usw.)funktionieren fehlerfrei.Die Uhr bleibt beim Startwert stehen und nichts weiter passiert. Gruß Uhrenbastler
Versuchs mal so: volatile char SEKE=0; //Zähler für Arrays SEKUNDEN EINER volatile char counter = 0; //Überlaufzähler Timer0 mit Startwert 0
Hallo Holger, leider kein Erfolg. Danke für die schnelle Antwort. Dieser PIC, den ich hier benutze, hat ewig Schwierigkeiten bereitet, bis er überhaupt beschrieben werden konnte. War ewig "schreibgeschützt" und nach vielen Versuchen ging es dann (Brenner = SPRUT BrennerMini8P).PIC ne Macke? Die Hardware ist auch getestet, mit Multimessgerät und Oszilloskop, alles okay. Am PORT RA4 kommt auch der Takt (3,2768MHz) an. Gruß Uhrenbastler
Hey, vielleicht hilft: erst timer off setzen, dann Timer0 initialisieren und zum schluss Timer0 auf on setzen: T0CONbits.TMR0ON=0; T0CON = 0b01110111; ^ T0CONbits.TMR0ON=1; und neben INTCON auch INTCON2bits.TMR0IP=0; falls nicht auf null gesetzt. Gruß
achso und grad gesehen, in deiner Interruptauswertung steht: if(INTCONbits.INT0IF==1) //Wenn Timer0-Interruptflag gesetzt hier fragst du aber das external int0 interruptflag ab, aber nicht das Timer0 Interruptflag. Wenn ich deinen Kommentar richtig deute müsste es: if(INTCONbits.TMR0IF==1) //Wenn Timer0-Interruptflag gesetzt heißen. Vielleicht führt das ja schon zum erfolg. Gruß
Hallo Markus, Danke für Deine schnelle Hilfe. Dieser Fehler mit "if(INTCONbits.TMR0IF==1) //Wenn Timer0-Interruptflag gesetzt" ist mir noch gar nicht aufgefallen, habs gerade bereinigt. Leider tickt die Uhr noch nicht, schade. Gruß Uhrenbastler
und die anderen Sachen die ich im Post davor erwähnt habe? Gruß
Habe auch die anderen Tips im Post 1 umgesetzt. Mein Bauchgefühl sagt, der PIC ist defekt - oder? Siehe oben.Solche Probleme hat noch kein PIC gemacht.Ich werde mich schon mal um Ersatz kümmern, leider liegt nur ein 18F2550 rum, der nützt mir aber nichts (Pin 14).Danke. Gruß Uhrenbastler
Die Warscheinlichkeit eines defekten PICs ist weitaus geringer als meist genommen. Da muss man schon ordentlich Mist bauen, um ihn zu töten. Poste doch mal bitte dein ganzes Projekt, samt Config-Bits, etc. Hast du es mal durch einen Simulator laufen lassen?!
Also einen defekt des PICs würde ich an dieser Stelle auch ausschließen. Ich hab mal deinen Code mit MPLAB versucht ein wenig nachzuvollziehen. Ich denke nicht das dieser Code geeignet ist wirklich ne Uhr darzustellen, bzw. die Zeiten so genau einzuhalten, das es am ende wirklich eine Uhrzeit wird. Nichtsdestotrotz konnte ich ein paar Dinge feststellen. 1) die Änderungen, die ich schon genannt habe 2) irgendwie funktionierte bei mir das Interrupt Vector Mapping nur mit dem High Vector und GOTO wird da Groß geschrieben! 3) Irgendwas setzt das GIEH-Bit im INTCON Register zurück nach dem ersten Interruptaufruf, deswegen musste ich übelst fuschen indem ich in der while-Schleife das ständig gesetzt habe 4) die delay-Routinen sind komisch, ich hatte es des öfteren, dass er dort irgendwo hängen blieb 5) das TMR0IF im INTCON-Register wird bei der Initialisierung auf 0 gesetzt 6) für diesen Code brauchst du die stdio und stdlib Header Files nicht und würde sie weglassen Wie gesagt, für ne Uhr find ich den Code etwas komisch, aber evtl. helfen dir ja die Dinge. Gruß und gn8
Liegt evtl. an der Taktsynchronisation: The synchronization of T0CKI with the internal phase clocks is accomplished by sampling the prescaler output on the Q2 and Q4 cycles of the internal phase clocks. Therefore, it is necessary for T0CKI to be high for at least 2 TOSC (and a small RC delay of 20 ns) and low for at least 2 TOSC (and a small RC delay of 20 ns). ------------------------------------------------------------------------ K.A. warum du Timer 0 nimmst, bei diesem PIC ist doch beim Timer 1 alles für eine RTC vorbereitet. Da steht sogar ein Codebeispiel im Kapitel 12.7 des Datenblatts. Ist zwar Assembler aber das kann man ja einfach in C umsetzen. Brauchst nur einen Uhrenquarz anschliessen (Figure 12-3).
Multiplexen in der Mainloop ist ganz großer Mist. Das gehört in einen Timerinterrupt (etwa 100Hz * Digitanzahl). Das Tastenabfragen ist auch sehr suboptimal. Da ist ein Timerinterrupt (~10ms) mit Entprellung die beste Lösung. Man kann natürlich alle 3 Timerfunktionen (Multiplexen, Entprellen, Uhr) mit einem Timerinterrupt erschlagen. Peter
Hallo Xavier, Markus,Scotty und Peter. Danke für Euer Interesse und die zahlreichen Tips und Ratschläge. Ich antworte mal der Reihe nach: @Xavier: Im Anhang ist das Projekt gepackt (7z und zip), Stand gestern Abend. Durch einen Simulator lief das Programm noch nicht, mit MPLAB-Sim muß ich mich erst mal beschäftigen. Eine andere Möglichkeit kenne ich noch nicht. @Markus: Werde mich noch mal hinsetzen, Deine Ratschläge annehmen und das Programm überarbeiten. Wenn schon die Initialisierung nicht stimmt, macht es ja auch keinen Sinn, ins Detail zu gehen. @Scotty: Warum Timer0? Habe gedacht, der ist am besten geeignet für das Projekt, da RA4 zur Verfügung steht und ich mal testen wollte, ob ich die Uhr so zum Laufen bekomme. Sieht erst mal noch nicht so aus, d.h. ohne Interrupt läuft sie schon. Zur Zeit geringste Abweichung von ca.2 sec/24h. Ist aber mühsam, mit Nop und delay.h das hinzukriegen. So soll aber die Uhr nicht laufen, Interrupt muß schon sein. Die Platine liegt aber nun mal schon vor mir und ich würde gern, ohne Änderungen (wenn möglich), eine funktionierende Uhr basteln. @Peter: Klingt verlockend, alle wichtigen Funktionen in einen Interrupt zu packen. Ich wäre aber schon froh, wenn wenigstens der erste Interrupt richtig tickt. Da muß ich noch Einiges lernen. So konnte ich wenigstens bis jetzt die Hardware testen, sehen das die Arrays funktionieren und die Uhr schon mal richtig zählt, zu stellen geht und der Summer scheppert. Also heißt es für mich jetzt, Programm überarbeiten, Eure Tips beachten und hoffen, es klappt dann besser. Gruß Uhrenbastler
Mike Riedel schrieb: > Ich wäre aber schon froh, wenn wenigstens der erste Interrupt > richtig tickt. Da muß ich noch Einiges lernen. Das Geheimnis liegt darin, schrittweise vorzugehen. Zuerst machst Du mal ne Blink-LED mit Interrupt (1s). Dann einfach die Frequenz höher drehen und Multiplexen (100Hz * Digitzahl). Die 7S-Muster liegen dazu in einem RAM-Array (1 Byte je Digit). Später macht man eine Routine, die Zahlen in 7S wandelt und dort ablegt. Usw. Die Timerwerte, um auf die gewünschte Frequenz zu kommen, schreibt man nicht als magische Zahlen hin. Der Compiler kann leichter Konstanten ausrechnen, als Du. Man definiert also nur die Quarzfrequenz und schreibt dann die Formel hin, die man ausrechnen würde. Peter
Hallo Peter, dann werde ich mich erst mal hinsetzen und mir das Datenblatt vornehmen. Die Grundeinstellungen sollten ja erst mal stimmen, damit später auch alles funktionieren kann. Vielleicht sollte ich mir mal ne kleine Testplatine basteln, damit ich die Programme auch mal mit Hardware testen kann. PIC drauf, paar Taster und LEDs, Schnittstelle und Spannungsversorgung - fertig. Gibt es eigentlich ne Software, mit der man Simulationen durchführen kann? MPLAB-Sim muß ich mir erst mal anschauen, wie es funktioniert. Dann werde ich mal loslegen, bis später. Gruß Mike
Hallo, ich habe mir mal einen Schaltplan für eine Testplatine (Anhang) erstellt. Gibt es eventuell Vorschläge, was unbedingt noch geändert werden sollte? Da ich meine weiteren Projekte mit diesen beiden PICs verwirklichen will, habe ich die Konfiguration so gewählt, das es für Diese passt. Gruß Uhrenbastler.
Hallo, habe noch eine kleine Änderung an den Tastern vorgenommen, jetzt low-active. Gruß Uhrenbastler
Hi, am DP-Pin der 7Segment würde ich zu Pin RA5 des PIC noch ein Widerstand setzen. Außerdem solltest du die Standard 100nF zwischen Vdd und Vss an den Pics nicht vergessen. Zu guter letzt würde ich nachsehen, ob das Programmieren mit dem Brenner8 und den LEDs an den Clk/Data Leitungen möglich ist. Gruß
Ich würde keine 7S-Dekoder mehr einsetzen. Nimm den 74HC595, dann kannst Du auch Sonderzeichen anzeigen. Bzw. gleich 2 74HC595 kaskadiert für die Anzeige und die LEDs. Nur ein Digit erscheint mir etwas wenig, ich würde mindestens 4 Digits vorsehen. Peter
Hallo Markus und Peter, vielen Dank für Eure guten Tips und Ratschläge. @Markus Den Widerstand und den Kondensator habe ich übersehen und ergänzt. Den Anschluß für den Brenner8 haben wir in der Umschulung so bekommen, unser Ausbilder hat noch einige Veränderungen gemacht. Das Programmierkabel ist jetzt so gefertigt und ich muß darauf achten, auf meinen Platinen immer diesen Anschluß vorzusehen. @Peter Die Idee mit dem 74HC595 ist interessant, den und das Kaskadieren schau ich mir mal genauer an. Für Neues habe ich immer ein offenes Ohr. Leider habe ich immer noch keinen Erfolg mit dem Interrupt in meiner Uhr, aber das wird schon noch klappen. Um wenigstens das Grundprogramm mit der Zeitanzeige und dem Wecker zu testen, läuft jetzt alles in einer Schleife. Und die Abweichung wird auch immer geringer - doch mit Interrupt ist es besser. Gruß Uhrenbastler
Hallo, der Interrupt funktioniert jetzt und der Sekundentakt sieht auch sehr gut aus. Doch ein längerer Dauertest wird erst zeigen, wie genau er ist. Mal ne Frage zum Interrupt: Zitat Peter : <Multiplexen in der Mainloop ist ganz großer Mist. Das gehört in einen Timerinterrupt (etwa 100Hz * Digitanzahl). Das Tastenabfragen ist auch sehr suboptimal. Da ist ein Timerinterrupt (~10ms) mit Entprellung die beste Lösung. Man kann natürlich alle 3 Timerfunktionen (Multiplexen, Entprellen, Uhr) mit einem Timerinterrupt erschlagen.> Die Tasterabfragen durch die if-Anweisung sind unglücklich gewählt? Wäre die Variante mit einer switch-Anweisung (war schon im Programm) besser und wenn, warum? Das Multiplexen der Anzeigen könnte der Interrupt auch steuern? Im Moment wäre ich bei 50 Hz, Prescaler und counter anpassen - 100Hz. Dazu muss ich aber die Zählroutine von der Anzeigeroutine trennen. Werde mal paar Tests machen. So wie es jetzt ist, stört es mich auch. Dieses Entprellen der Taster taucht auch immer wieder mal auf, bis jetzt hatte ich noch keine schlechten Erfahrungen mit Tastern gemacht. Im Schaltplan sieht man ,wie bei mir die Taster geschalten sind und ich bin der Meinung, das die saubere High -und Lowpegel bringen. Gruß Uhrenbastler
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.