PIC18F2520 Interruptroutine fehlerhaft?

OP #2741081
Lesenswert?

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
Angehängte Dateien:
OP #2741145
Lesenswert?

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
#2741191
Lesenswert?

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ß
Gast #2741313
Lesenswert?

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?!
#2741355
Lesenswert?

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
Gast #2741598
Lesenswert?

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).
#2741613
Lesenswert?

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
OP #2742583
Lesenswert?

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
Angehängte Dateien:
#2743052
Lesenswert?

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
OP #2744103
Lesenswert?

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
#2749212
Lesenswert?

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ß
OP #2750001
Lesenswert?

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
OP #2752910
Lesenswert?

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
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren