PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PIC16F876 - Störung des Programms durch Rechteckimpulse ?



Semmelchen
01.03.2006, 19:15
Hi, ich hab den PIC in Assembler programmiert und folgendes Problem:

Wenn am PortC-Pin 1 oder 2 (=CCP1/CCP2)
ein Rechteck-Signal mit etwa 10-100kHz angelegt wird,
stürzt das Programm ab.

Zum Test hab ich das Prog. auf folgende Schleife sinngemäß reduziert:

1. Initialisierung mit gesperrten Interrupts
2. Warteschleife mit: decfsz zähler,f (=255 Durchläufe)
3. bsf PortC,0
4. Warteschleife wie oben
5. bcf PortC,0
6. goto 0000 (=Anfang)

Ohne die Impulse an CCP1/CCP2 kommt das saubere Rechtecksignal raus.
Mit den Impulsen kommt es zu Störungen und verzögerten Flanken,
sogar das Programm scheint abzustürzen...

Ich bitte um Hilfe, da mein Studienabschluß davon abhängt..

bitte, bitte bitte...

Fritzli
02.03.2006, 08:43
Hallo

Hast Du irgendwelche CCP-Interrupts nicht abgestellt?
Sind C1 und C2 als Outputs definiert? (da hat dann der Pin-Treiber ein Problem, und das kann zu allem Moeglichen fuehren)

Kannst Du das Problem auf ein kleines Testprogramm reduzieren und das dann hier posten?

Gruess
Fritzli

Semmelchen
02.03.2006, 14:53
..dass ich alle Config-Register richtig gesetzt habe.

Ich bin alle extra nochmal durchgegangen und hab alles auf
Null bzw. "aus" gesetzt.
CCP1/2 sind als Eingang definiert, da ich auch die CCP-Funktion
im richtigen Programm benötige. Aber solange nicht einmal das kleinste Programm
richtig sauber läuft, komm ich nicht weiter..

Quelltext mach ich heut noch rein...

Semmelchen
02.03.2006, 14:59
#include P16F876A.INC
zaehler equ 0x70
code 0x00
null
NOP
clrf pclath ;programmspeicher seite0
clrf STATUS ;wähle bank0
goto weiter
reset
org 0x04
bcf portc,7 ;Reset-modus an
goto reset
weiter
movlw 0x00
movwf intcon ;interrrupts aus
movlw 0x00
movwf pir1 ;mögliche interrupts setzen
movwf PIR2 ;ebenfalls
movlw 0x01
movwf t1con ;timer1
movlw 0x00
movwf t2con ;Timer2
movlw 0x04
movwf ccp1con ;CCP1
movwf ccp2con ;ccp2
movlw 0x00
movwf sspcon ;serial port
movlw 0x80
movwf adcon0 ;ad-wandler

bsf status,rp0 ;bank 1
movlw 0x3f
movwf option_reg ;timer0 und portb
movlw 0x00
movwf pie1 ;interrupts setzen
movlw 0x00
movwf pie2 ;interrupts setzen
movlw 0x03
movwf pcon ;reset-merker
movlw 0x00
movwf cvrcon ;comparator aus
movlw 0x3f
movwf trisa ;porta=analoge eingänge
movlw 0xff
movwf trisb ;portb=TTL-eingänge
movlw 0x06
movwf trisc ;portc
movlw 0xf9
movwf pr2 ;Timer2 Periode
movlw 0x00
movwf sspstat ;serial port
movlw 0x00
movwf sspcon2
movlw 0x00
movwf txsta
movlw 0x00
movwf rcsta
movlw 0xc0
movwf adcon1 ;ad-wandler
bcf status,rp0 ;bank0
;---------------------------------------------------------
movlw 0x00
movwf intcon ;interrrupts aus


bsf portc,0 ;1 ausgeben

eins
decfsz zaehler,f
goto eins

bcf portc,0 ;0 ausgeben

zwei
decfsz zaehler,f
goto zwei

goto null

end

Semmelchen
02.03.2006, 15:01
Sorry, dass es nicht so schön übersichtlich geworden ist..

Als Interruptroutine hab ich hier noch eine
"Falle" eingebaut, so dass ich also sehen würde, wenn ein IRQ
"durchkommt".

Fritzli
02.03.2006, 17:04
Hallo

Was passiert, wenn Du die ganzen Initialiserungen weglässt (bis auf die CCP inits und ein CLRF INTCON)? Der grosse Teil ist irrelevant oder sowieso default.

Was ist denn das für ein Signal, bzw Amplitude > Vcc?
Wie schaut die Hardware so aus?

Gruess
Fritzli

Semmelchen
02.03.2006, 18:53
Das störende Signal ist in der Amplitude ein normales TTL-Signal
mit 0 Volt bzw. 5 Volt.

Inzwischen bin ich etwas schlauer und habe herausgefunden, dass es wohl
von der Anstiegsgeschwindigkeit der Flanken abhängt:

Je steiler das Signal ansteigt, um so weniger Störungen gibt es.
Im Gegensatz dazu also, je schräger bzw. verschliffener die Flanken,
um so mehr Störungen.

Außerdem habe ich per Speicheroszilloskop das per Software erzeugte
Rechtecksignal beobachtet. Mitten im Verlauf bleiben dann ca. 2 Low- bzw. High-
Impulse aus. Das Signal bleibt dann also zeitweilig auf 0 oder 1-Pegel.

Hat jemand von euch mal an Microchip gemailt, antworten die oder wird man da mit
Standard-Antworten oder gar Schweigen abgespeist ?

Bezüglich der Hardware: MCLR-Pin ist über 1kOhm auf 5 Volt gezogen.
Festspannungsregler mit 2 Elkos sitzt neben dem PIC.
Der Oszillator mit 20MHz hat 2 Scheibenkondensatoren, ich glaube 22pF nach Masse.
Aufgebaut auf Lochrasterplatine, der Rest der Schaltung hat m.E. keinen Einfluss.
Betriebsspannung und Taktfrequenz erscheinen im Oszilloskop sauber und flackerfrei.

Könnte es sein, dass der PIC intern etwas "wackelig" bei 20MHz arbeitet ?
Gelegentlich ist es passiert, dass die Stromaufnahme der Schaltung sich fast verdoppelte
und dann in dem Zustand verharrte ( welcher Zustand das auch immer war..).

Ich könnte mir vorstellen, dass es zu Eigenschwingungen oder so kommt, verursacht durch die
langsam ansteigenden Flanken an CCP1/CCP2.....

Fritzli
02.03.2006, 19:52
Gelegentlich ist es passiert, dass die Stromaufnahme der Schaltung sich fast verdoppelte
und dann in dem Zustand verharrte ( welcher Zustand das auch immer war..).

Das tönt aber eher nach Hardware-Problem (Latch-Up?)

20MHz: Solange der Chip auf das spezifiziert ist, sollte das eigentlich problemlos laufen.

Ich hab bisher gute Erfahrungen mit dem Microchip-Support gemacht, aber ich würd das Problem eher mal im dortigen Forum posten: http://forum.microchip.com/

Andre_S
02.03.2006, 19:57
Hallo,

mal unabhängig das Dein Programmausschnitt wirklich etwas wirr aussieht und Deine sogenannte "IRQ-Falle" recht "aufhängend" wirkt wundert mich aber doch das Du ständig neu Initialisierst.
Also laut Deinem obigen Programm startest Du jedesmal mit der gesamten Initalisierung aufs neue, ist das wirklich so gewollt oder nur ein Schreibfehler? Kann mir vorstellen, das dies dem PIC nicht so bekommt während Du mit Deinem "Rechteck-Signal mit etwa 10-100kHz" am Eingang hängst.

Ein Pic, der wie Du schreibst ("intern etwas "wackelig"ist") ist mir noch nicht unter gekommen.


Gruß André

Semmelchen
02.03.2006, 20:46
Sorry, aber das progrämmchen ist etwas hektisch zusammengestrickt.

Die Falle für IRQ ist gewollt, da ich vermutet hatte, dass das Maskieren der Interrupts
nicht richtig lief, war aber nicht so und nun stehts halt noch mit drin.

Das ständige Initialisieren ist auch noch der "Rest" vom Probieren,das andere Programm mit nur
einmaligem Initialisieren lief genauso, ohne unterschied zu diesem hier..

Andre_S
02.03.2006, 21:21
mmh,...

schau Dir mal das an:
http://www.sprut.de/electronic/pic/fallen/fallen.html#inout

Gib doch mal Dein Rechtecksignal auf einen anderen PORT aus.


Gruß André

Semmelchen
03.03.2006, 19:23
Das mit der IO-Falle hatte ich auch schon überprüft und als nicht zutreffend abgetan.
Grund: beim stupiden Setzen/Löschen eines Pins kann es nicht am gesetzten Pin zu dem Fehler kommen, nur an
den mitgelesenen Pins.

Inzwischen scheint das Problem gelöst zu sein:
Das Signal wurde von einem 74LS240 geliefert und traf am PIC etwas verschliffen ein.
Unter bestimmten Bedingungen schien es wohl zu Störungen dadurch zu kommen.

Nun habe ich das mit 74HC240 und 74HCT240 überprüft, welche wesentlich steilere Flanken liefern
und somit das Ganze weniger verschliffen am PIC eintrifft.
Folge: mit HC/HCT ist es mir nicht mehr möglich, das Problem zu erzeugen, da kann ich am Frequenzgenerator
drehen, wie ich will.

Etwas komisch das Ganze, mein Lehrer meint, es würde mit TTL/CMOS zu tun haben:
der PIC ist CMOS und mag eine TTL-Ansteuerung nicht so richtig, so dass es zu Problemen durch den
hochohmigen PIC-Eingang an TTL-Ausgängen kommen kann.

Danke euch allen, die sich mit mir den Kopf zerbrochen haben, ich werd in nächster Zeit noch des Öfteren
hier vorbeischauen.

Andre_S
03.03.2006, 19:44
Hallo,

interessant,....
aber Du hast schon bewußt den PORTC, mit Schmitt Trigger Eingang gewählt und nicht etwa die, mit TTL Eingang?


Gruß André

Semmelchen
04.03.2006, 11:52
Hallo,

ich habe nicht direkt irgend einen Port gewählt, sondern die Pins der CCP-Module,
da mein Hauptprogramm u.a. dazu dient, die exakten Zeitpunkte der
Impulse an CCP1 und CCP2 zu messen.

Davon mal abgesehen (hab grad im Datenblatt nachgeschaut) ist doch eigentlich ein
Schmitt-Trigger ideal, wenn das Signal langsam ansteigt oder verrauscht ist. Die
normalen TTL-Anschlüsse haben doch da ein Problem. Und PortC ist ja fest als ST, also
war ich von Angfang an auf der sicheren Seite. Und damit machts erst Recht keine Sinn,
dass das dann Ärger gab....
Oder hab ich dich jetzt falsch verstanden, und du fragst, ob ich PortB eingespeist hatte?
Keine Sorge, es waren nur CCP1/2 betroffen, kein anderer Port und auch keine anderen Pins von PortC.

Andre_S
04.03.2006, 12:40
nein, nein,...

ist schon richtig mit Deinen ST.

Ich hatte diese Probleme halt bei unseren Steuerungen noch nicht gehabt. Kann sein, das ich da was falsches wiedergebe, aber mein Techniker meinte, (ich prog. nur) Widerstand parallel zum Eingang bei starker Störung wäre günstig und üblicherweise sollte die steigenden und fallenden Impulsflanken auch nicht größer als, ca. 10us sein und irgendwas war noch mit Spannungspegeln.

Na egal, Haupstache es geht,....


Gruß André