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
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?
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
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
unterschiedlicher tackt? "topologie" des kabels? fehler im code? ...?
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.
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
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.
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.
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
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.
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 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.
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...)
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.