Forum: Mikrocontroller und Digitale Elektronik PIC 18F2620 und PIC 16F690 verbinden


von Thomas W. (thomas0906)


Lesenswert?

Hallo

Ich möchte den Eingang INT0 eines 18F2620 mit dem Ausgang eines 16F690 
verbinden. Der 16F690 sendet Impulse von 70us und 250us Länge.

Ich habe die Pins direkt verbunden.

Funktioniert irgendwie nicht.
Am INT0 Eingang messe ich Impulslängen, die viel kürzer sind.

Müssen da noch Widerstände und Kondensatoren rein?
Wenn ja warum?
Wie schaltet man sowas zusammen?

Danke und Gruß
Thomas

von Wilhelm F. (Gast)


Lesenswert?

Thomas W. schrieb:

> Am INT0 Eingang messe ich Impulslängen, die viel kürzer sind.

Um welchen Betrag kürzer zu dem Wert, den sie haben müßten?

von Thomas W. (thomas0906)


Lesenswert?

Hi

Ich kann den erwarteten Code garnicht wiederfinden und die Impulse sind 
ca. 5 mal kürzer als sie sein müßten.
Pausen gibt es auch nicht.
Kann das ein Jitter oder sowas auf der Leitung sein?
Die Leitung ost ca. 40cm lang.

Ist schlecht rauszufinden ohne passende Meßgeräte.

Gruß
Thomas

von John B. (johnbauer)


Lesenswert?

Thomas W. schrieb:
> die Impulse sind
> ca. 5 mal kürzer als sie sein müßten

Kann es sein, dass für den 16F690 eine Taktfrequenz von 4MHz vorgesehen 
ist und Du betreibst ihn mit 20MHz?

Gruß
John

von Master S. (snowman)


Lesenswert?

unterschiedlicher tackt?
"topologie" des kabels?
fehler im code?
...?

von Lehrmann M. (ubimbo)


Lesenswert?

Thomas W. schrieb:
> Ich habe die Pins direkt verbunden.

Ganz schlecht. Pullup / Pulldownwiderstand verwenden.

Thomas W. schrieb:
> Müssen da noch Widerstände und Kondensatoren rein?
> Wenn ja warum?

Weil du sonst nicht unbedingt einen definiterten Pegel hast. 
Kondensatoren haben da allerdings nichts zu suchen. Beide PICs sind 
hoffentlich mit je einem 100nF Kondensator zwischen VCC und GND 
versehen.

Thomas W. schrieb:
> Am INT0 Eingang messe ich Impulslängen, die viel kürzer sind.

Bitte den Sourcecode herzeigen. Ist schon so Raterei genug, da 
unzureichend Infos.

Thomas W. schrieb:
> Die Leitung ost ca. 40cm lang.

Himmelsrichtungen sind bei Störungen dieser Art eher unerheblich.

John Bauer schrieb:
> Kann es sein, dass für den 16F690 eine Taktfrequenz von 4MHz vorgesehen
> ist und Du betreibst ihn mit 20MHz?

Wie gesagt poste Sourcecode von beiden PICs. Kannst du überprüfen, ob 
der PIC16F.. überhaupts das abschickt, was du dir erhoffst? Oszi oder 
so?

Master Snowman schrieb:
> unterschiedlicher tackt?

Das wort 'Tackt' gibt es nicht.

von Thomas W. (thomas0906)


Lesenswert?

Der 16F690 ist in einer getesteten Platine verbaut.
Die Software habe ich als HEX File eingespielt.
Er sendet die Impulse und arbeitet mit 8MHz intern.

Den 18F2620 habe ich programmiert.
Er enthält einfach nur einen HIGH PRIOR Interrupt, in dem ein Timer0 im 
8-bit Mode zurückgesetzt wird und bis zum nächsten INT0 Interrupt 
hochzählt.
Er ist auf 8 MHz intern engestellt.

Für eine erwartete Periode von 70us (entspricht einer "1" müßte mein 
Timer bis ca. 140 zählen. Für eine erwartete Periode von 500us 
(entspricht einer "0") müßte mein Timer überlaufen. Tut er aber nie!
Dazwischen müßte es Pausen geben von 200ms. Die gibt es aber nicht.

Das 16F690 HexFile auf Proteus simuliert sieht ok aus.
Eine "F7" z.B. hat kurz,kurz,kurz,kurz, lang, kurz,kurz,kurz als 
Impulse.

Das erwarte ich dann an meinem 18F2620 am Eingang wieder.

Der Timer0 zählt aber von 29 bis 68 immer was anderes.
Manchmal auch bis 200. Und überlaufen tut er nie.
Das verstehe ich nicht.

In einer anderen Schaltung habe ich gesehen, daß der Eingang INT0
mit einem C 47p nach Masse und parallel dazu ein 22k nach Masse und 
Richtung Eingang nochmal 22k angebracht sind. Aber wozu, kann es damit 
zu tun haben?

Gruß
Thomas

von gggggGast (Gast)


Lesenswert?

Thomas W. schrieb:
> verbinden. Der 16F690 sendet Impulse von 70us und 250us Länge.

Mit Software erzeugt oder über Timer?

>
> Ich habe die Pins direkt verbunden.

Das ist Ok so lange beide die gleiche Spannungsversorgung haben


>
> Funktioniert irgendwie nicht.
> Am INT0 Eingang messe ich Impulslängen, die viel kürzer sind.

Meist falsche Taktfrequenz.
Mach dir mal nen Takt vo 1 s un vergleich den mit ner Stopuhr.
Dann die Config Anweisung kontrollieren



>
> Müssen da noch Widerstände und Kondensatoren rein?
> Wenn ja warum?

Unnötig. Über die Tri-State Ausgangstreiber wird dein System niederohmig 
verbunden. Du solltest nur den Port immer als Ausgang belassen.

> Wie schaltet man sowas zusammen?

So wie du es gemacht hast.

Thomas W. schrieb:
> Der Timer0 zählt aber von 29 bis 68 immer was anderes.
> Manchmal auch bis 200. Und überlaufen tut er nie.
> Das verstehe ich nicht.

N dann löst er wohl nicht aus und du liest zufällig due Werte. Ursachen: 
Takt, Teiler Interrupt etc. Evtl. das Datenblatt nochmal lesen.

von Wilhelm F. (Gast)


Lesenswert?

Thomas W. schrieb:

> Wie schaltet man sowas zusammen?

Ich kenne deine PIC-Typen nicht konkret, und meine aber, daß sie 
Push-Pull-Outputs haben.

Aus dem Grunde, daß beide Pins, die man verbindet, nicht zufällig mal 
gleichzeitig auf Output stehen, und entgegen gesetzte Pegel haben 
(Kurzschluß), schaltet man da gerne mal einen Serienwiderstand von z.B. 
1kOhm in die Leitung. Sowas habe ich auf einem alten 
8051-Experimentierboard, um die Ports gegen Kurzschluß zu schützen.

Pullups sehe ich da nicht unbedingt als nötig an.

Was du ohne Meßinstrumente machen kannst:

Den µC extrem verlangsamen, wenn er auch niedrige Taktfrequenzen 
verträgt. Vielleicht kannst du mit dem 16F690 mal testweise einen 
Eingangstakt für den 18F2620 erzeugen, z.B. 800Hz. Und dort den 
8MHz-Quarz abschalten. Dann werden die Timings schon um den Faktor 10000 
langsamer, und du könntest die 70µS bzw. 250µs als 700ms und 2500ms an 
einer LED sichtbar machen.

An einen Pin, der ein gleichmäßiges periodisches Rechtecksignal ausgibt, 
kann man auch mal ein RC-Glied als Tiefpaß schalten, um die Spannung zu 
messen. Die Spannung ist dort proportional zum Tastverhältnis.

von Thomas W. (thomas0906)


Lesenswert?

Hi

Tja, dann muß ich wohl von Grund auf neu anfangen und erstmal nur 
Impulse einlesen.

Ich verstehe es nicht, da kann man doch nicht so viel falsch machen.

Ich habe es gerade mit Pulldowns und Serienwiderständen probiert.
Kein Unterschied.

Ich werde jetzt also einen Funktionsgenerator, den habe ich noch, 
anschließen und damit erstmal die Grundfunktionen beim EmpfangsPIC 
testen.

Man das wirft mich Tage zurück...

Danke für Tips
Thomas

von Chris (Gast)


Lesenswert?

was ist viel kürzer und was für einen Timer/Prescaler nimmst du ?
Nimmst du den internen OSC und lädst du den Calibrationswert (+-2%) oder
verwendest du ihn so (+-12%).  Welche Taktfrequenz hast du.
Angenommen du verwendest den internen osc mit 4Mhz und TM0 mit prescaler 
8.
Dann hast du eine Genauigkeit von 6+8=12uS sowie der Wert ist um 2uS zu
klein + kann da noch eine Differenz von Laufzeit zwischen auslesen und 
setzen
sein, was noch ein paar uS sind, welche gleich wie die 2uS korrigierbar
sind. Dann wären das anstelle von 70us 56uS die du messen könntest + 10%
osc error wenn du ihn nicht kalibriert hast, mit kalibration sind es 
dann
nur ein paar uS. Also anstelle von 70uS könnten es schon 50uS sein zu 
recht.
Ohne genauere Infos ist es schwer dir da weiterzuhelfen.

von Thomas W. (thomas0906)


Lesenswert?

Interner Osc 8MHz
Timer0 1:1 ohne Prescaler
also zählt Timer0 1us bei einem Takt.

Erwarte also 128us wenn Timer0 auf 255 gezählt hat.

Impulse von 70us Periode sollten also einen Wert von 140 an Timer0 
ergeben.
Er zählt aber zwischen 2 Flanken nur bis 29 oder manchmal auch mehr.
Einen Überlauf git es garnicht, d.h. die 500us Impulse werden überhaupt 
nicht erkannt.


Aber hier sollte es ja garnicht so weit gehen.
Meine allgemeine Frage war, ob man hardwaretechisch oder 
softwaretechnisch irgendwas beachten muß, wenn man von dem einen PIC ein 
Signal sendet, das an dem anderen PIC an INT0 einen Interrupt auslösen 
soll.
Und wodurch es da zu solchen Problemen, wie bei mir kommen könnte...

Gruß
Thomas

von Chris (Gast)


Lesenswert?

Von der HW-Seite der Pic könnte ein OC Signal senden, also solltest du
die internen Pull-up verwenden, nur um sicher zu sein.
Ansonsten einfach die Pins direkt verbinden bzw da es sich beim Pin um
C1OUT (Komparator) handelt, welches nach dem Reset aktiv ist, ist ein
Widerstand obligatorisch, ansonsten kannst du den Pin des anderen Pics 
zerstören. Für so eine Messung würde man eher, sofern nicht
anders gebraucht, den TMR1 nehmen, da abgesehen daß es ein 16bit Timer 
ist,
dieser einen externen Enable Pin (T1G) hat und somit die Sache 
vereinfacht.
Stolperfallen gibt es eine Menge. Ist die LVP ausgeschaltet. Ansonsten 
kann
dieses Feature (bug) den Timer natürlich anhalten. Sind Komparatoren und
ADC richtig initialisiert. Lädst du nach dem umprogrammieren des Option
Register das Port wieder ein ?. Löscht du den Interrupt richtig.
27 uS würden abgesehen vom LVP auf ein nicht richtiges Löschen des 
Interruptbits oder des Option Registers sowie Porthandling hindeuten.

von Thomas W. (thomas0906)


Lesenswert?

Hallo Chris

Der Tip mit TIMER1 war Gold wert!!!
Mit Timer1 funktioniert es genau wie es sein soll.

Jetzt erklär mir aber mal einer, wieso das mit Timer0 nicht 
funktioniert.
Was ist denn da der Untersched?
Dann kann man den ja garnicht verwenden!?!

Ich habe den Timer 1 genau so eingestellt wie den Timer 0.

T1G habe ich nicht verwendet.
LVP ist OFF
Ein OptionReg gibts bei dem PIC nicht.
Komparatoren und ADC hab ich hoffentlich alle abgeschaltet.
IR bits werden gelöscht.


Gruß
Thomas (wesentlich erleichtert...)

von Thomas W. (thomas0906)


Lesenswert?

Soooooooooo

Dieser Artikel hat mein Timer0 Problem gelöst.
Bzw. wie man es umgehen kann.

http://www.embeddedrelated.com/groups/piclist/show/9005.php

Solche Sachen hasse ich ja.
Der Fehler liegt bei Microchip.
Irgendwie kommt es auf die Reihenfolge der Aktivierung der Interrupts 
und die Initialisierung der Register an.
Ansonsten wird TIMER0IF und TMR0H nie richtig hochgezählt bzw der ganze 
Timer0 spinnt rum...
Bei Timer1 gibt es diese Probleme nicht.

Gruß
Thomas

von Chris (Gast)


Lesenswert?

Klar gibt es ein Option Register. Da du davon nichts weisst erklärt 
vielleicht auch das Problem. Nach einem Reset ist das Option-Reg so
geladen, daß der Timer0 vom INT0 Eingang getakted wird. Prinzipiell
müsste das dein Problem gewesen sein und das würde auch das Verschwinden
der langen Impulse erklären. Du sprachst vom Interrupt.
Im Interrupt müsste man die Flanke für den Interrupt im Option-Reg
ändern, Port neu einlesen sowie die Interrupt Flags erst jetzt klären,
aber erst nachdem man verifiziert hat, daß der Interrupt kein Fehlimpuls 
war. So kann man Impulse mit über 100khz noch messen.
Das nächste Mal aber bitte den Sourcecode für die Initialisierung und
Interrupt posten bei so einem Problem.

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.