Forum: Mikrocontroller und Digitale Elektronik PIC18F2520 Interruptroutine fehlerhaft?


von Mike R. (uhrenbastler)


Angehängte Dateien:

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

von holger (Gast)


Lesenswert?

Versuchs mal so:

volatile char SEKE=0;              //Zähler für Arrays SEKUNDEN EINER
volatile char counter = 0;              //Überlaufzähler Timer0 mit 
Startwert 0

von Mike R. (uhrenbastler)


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

von Markus F. (affe55)


Lesenswert?

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ß

von Markus F. (affe55)


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ß

von Mike R. (uhrenbastler)


Lesenswert?

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

von Markus F. (affe55)


Lesenswert?

und die anderen Sachen die ich im Post davor erwähnt habe?
Gruß

von Mike R. (uhrenbastler)


Lesenswert?

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

von Mike R. (uhrenbastler)


Lesenswert?

Dann bis später,Gruß Uhrenbastler

von Xavier Lander (Gast)


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?!

von Markus F. (affe55)


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

von Scotty (Gast)


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).

von Peter D. (peda)


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

von Mike R. (uhrenbastler)


Angehängte Dateien:

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

von Peter D. (peda)


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

von Mike R. (uhrenbastler)


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

von Mike R. (uhrenbastler)


Angehängte Dateien:

Lesenswert?

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.

von Mike R. (uhrenbastler)


Angehängte Dateien:

Lesenswert?

Hallo,
habe noch eine kleine Änderung an den Tastern vorgenommen, jetzt 
low-active.
Gruß Uhrenbastler

von Markus F. (affe55)


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ß

von Peter D. (peda)


Lesenswert?

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

von Mike R. (uhrenbastler)


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

von Mike R. (uhrenbastler)


Angehängte Dateien:

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

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.