Antworten

Einschränkungen: 8 pro Beitrag (8 verbleibend), maximale Gesamtgröße 8,79 MB, maximale Individualgröße 1 MB
Entfernen Sie den Haken der Dateianhänge, die gelöscht werden sollen
Klicken Sie hier oder ziehen Sie Dateien hierher, um sie anzuhängen.
Anhänge und andere Optionen
Verifizierung:
Bitte lassen Sie dieses Feld leer:
Geben Sie die Buchstaben aus dem Bild ein
Buchstaben anhören / Neues Bild laden

Geben Sie die Buchstaben aus dem Bild ein:

Tastenkürzel: Alt+S Beitrag schreiben oder Alt+P für Vorschau

Zusammenfassung

Autor Ottmar
 - 12.07.2024, 17:34:30 CEST
Hallo
Indem ich gerade beim vorangegangenen Thema war, habe ich mir auch gleich noch den Capture-Mode angeschaut.

Capture Mode
Dieser bietet die Möglichkeit 1, 4 oder 16  ansteigende Flanken einer Impulsfolge "einzufangen". Eine fallende Flanke ist nur als Einzelereignis zu erfassen. Will man nur die Zeit für High oder Lowpegel erfassen, kann zwischen den unterschiedlichen Flanken umgeschaltet werden.

Bei der Erfassung von 4 und 16 rising edges erhält man nach 2maligem, bzw. 4maligem  Rechtschieben von CCPR1H:L die durchscnittliche Periodendauer und damit eine verbesserte Genauigkeit.
Beiliegende Codebeispiele zeigen die Initialisierung des Capture-Mode (CCP1).
vgl. Anlage 05 Code-Auszug Capture & C1.pdf

Vorverstärker/Comparator C1 für Analogsignale
Um die Schaltung universeller zu verwenden, wurde der unabhängige interne Comparaor C1 des PIC16F1827 so beschaltet und programmiert, daß dieser auch niedrigere Eingangspegel von Anlogsignalen auf TTL-Niveau umformt und so deren Periodendauer messbar macht.
Je nach Beschaltung ist die erforderliche Hysterese und der Triggerpegel in weitem Bereich durch die Beschaltung einstellbar (siehe Schaltplan)

Ein wenig Fleißarbeit ist es, die Zuordnung der invertierenden und nicht invertierenden Eingänge zu den Portpins herauszufinden. Hinweise auf die Seite im Datenblatt erfolge z.B. so: >DS.185<.

Bilder:
01 Ausgabe von Capture(4,16 )Rising Edge (verschieden Modi). Das "H" in Zeile 2, ganz rechts bedeuted, daß der Programmlauf angehalten wurde um auch die letzte, sstets wechselnde Stelle
ablesen zu können
02 Osziilogram Sinus 500mV/Teil, Rechteck 1,44V/Teil  mit deutlicher 
      Hysterese  (DeltaY = 0,51V)
03 LTspice Schaltung, mit OPA TS812 als Beispiel
04 Signalverlauf mit LTspice. die grüne Linie (Vout) liegt etwa in der
      Größenordnung von Uf der Schutzdiode am Eingang unter dem 0V-Niveau.
     grün: Vout Vp 5V
     blau: Input Sinus Vpp 4V,
     gelb: Triggerschwelle
     lila: Sinus und Hysterese direkt am nicht invert. Eingang, entsprechend, dem dortigen Spannungsteiler 
          10k-10k. Siehe dazu das "echte"Oszillogram Bild 2
05 Code-Auszug Capture & C1.pdf
Autor Ottmar
 - 07.07.2024, 12:28:05 CEST
@picass

Zitat von: picass in 30.06.2024, 10:42:35 CESTDie Länge der 2 Haupt-Impulse stellt die Größe der Temp oder der Pegelhöhe dar. Siehe Bild.
Das wäre eine Anwendung für Komparatoren und Timer.
Grüße, picass
Dein Lieblingspic 18F14K22 hat zwar kein Timer1 Gate-Modul, dafür aber Capture, das wohl auch für diesen Zweck eingesetzt werden kann. Auch hier kann der TIMER1-Count zwischen zwei Flanken erfasst werden.
0100 = Capture mode, every falling edge
0101 = Capture mode, every rising
vgl. Datenblatt zu  18F14K22 "13.0 ENHANCED CAPTURE/COMPARE/PWM(ECCP) MODULE

mfg Ottmar
Autor Ottmar
 - 06.07.2024, 15:45:37 CEST
Hallo piicass
habe erst jetz Deinen Beirag richtig gelesen. Das von mir beschriebene TIGM köönte doch hilfreich sein:
Die Startsequenz aussortieren, dann die beiden Pulse als Gate verwenden und die
Zählimpulse während der Gatephase ins Verhältnis zu Ölstand und Öltemperatur setzen....?
TIMER1-Zähltakt kann ja mit dessen Vorteiler an die Gate-Zeiten angepasst werden.

mfG Ottmar

Autor Ottmar
 - 06.07.2024, 15:25:33 CEST
Mein Projekt "TMR1-Gate Modul (T1GM)" ist us meiner Sicht fertig und ich fasse mal zusammen:

Mit dem T1GM kann man
a) die Dauer zwischen zwei Flanken-Ereignissen messen
b) Ereignisse in einem bestimmten Zeitbereich zählen.
Als Timer1-Taktquelle und/oder Flankenereignisse können sowohl interne Ereignisse,als auch von außen zugeführte Ereignisse verwendet werden.

Die Messgenauigkeit ist sogar mit meinem bescheidenen Steckbrettaufbau und der Verwendung des internen Oszillators (4MHz) recht gut. Kommt es auf den letzten Zählimpuls an, benötigt man quarzstabilisierte Impulsfolgen  für den TIMER1 und/oder das Gate.

Mit dem 16bit-Timer1 und der von mir gewählten Impuls-/Flankenquellle, sind Pulsweiten HIGH oder LOW, sowie Periodendauer bis max 2^16us recht genau messbar. Der Timer verfügt über einen internen Vorteiler bis 16:1 und unter Verwendung des TMR1-Überlaufflag kann eine fast beliebige Erweiterung der Bitbreite /des Zählbereiches vorgenommen werden.

Bedenkt man, daß nicht nur der Arbeitstakt (fosc/4)sondern auch der Oszillatortakt (fosc) für die Zählimpulse des TIMER1 verwendet werden kann und daß der PIC16F1827 bis fosc 32MHz verwendbar ist, eröffnen sich sehr kurze Zeitspannen für Messungen.

Die Initialisierung des T1GM für Pulsdauer und Periode ist einfach, wie nachstehender Beispielcode zeigt.

Hauptprogramm
main:
   CALL     TM1G_Pulse_HIGH      ;22382wc (22.382ms) TMR1G-Routinen
   CALL     TM1G_Pulse_LOW
   CALL     TM1G_Periode  
   CALL     TM1G_Frequenz
   CALL     TM1G_DutyCycle 
   ;
   btfss    KeyPress,KEY1      ;wurde Taste gedrückt?
   CALL     HoldCurrentState   ;Ja Programm anhalten
   GOTO     main

Initialisierung TMR1-Gate-Modul
TM1G_Pulse_HIGH:              ;Debug 1739ms=0x06CB
   movlw    b'00000000'       ;clock fosc/4, Presc.1:1,TMR1 OFF
   movwf    T1CON  
   movlw    b'11010000'       ;TMR1G enabled,activ HIGH,sgl.puls mode,
   movwf    T1GCON            ;TMR1 Gate source TMR1 input pin RB0
   CALL     TMR1_Gate

TM1G_Periode:                 ;Debug 8251us=0x203B
   movlw    b'00000000'       ;clock fosc/4, Presc.1:1,TMR1 OFF
   movwf    T1CON  
   ;
   movlw    b'10110000'       ;enabled,activ LOW,sgl.puls mode,
   movwf    T1GCON            ;TMR1 Gate source TMR1 input pin RB0
   CALL     TMR1_Gate

TMR1_Gate: 
   clrf     TMR1H             ;vlear TIMER 1
   clrf     TMR1L
   bsf      T1CON,TMR1ON   ;b0=1 Start TMR1
   bsf      T1GCON,T1GGO   ;b3=1 Gate startbereit wartet auf Flanke
   btfsc    T1GCON,T1GGO   ;Gate geschlossen? T1GGO=0? 
   GOTO     $-1
   copy     TMR1H,tmpTMR1H  ;TMR1:H in Arbeitsvariable kopieren 
   copy     TMR1L,tmpTMR1L
   RETURN

Interne Komparatoren - Verwendung von C2 Als astabiler Multivibrator

Die Komparatoren C1,C2 lassen sich unabhänging betreiben und können rasch programmiert werden. Die Impulse meines mit dem C2 aufgebauten AMV haben eine Flankensteilheit (1-90%) von ca. 68ns.
Mt 2 Widerständen und einem Kondensator lassen sich, wie die unten stehende Tabelle zeigt, variable Frequenzen erzeugen.

Ebenso einfach ist die Initialisierung des Komparators C2:
   BANKSEL  TRISA          ;bank1
   clrf     TRISA
   bcf      TRISA,RA4      ;(03) Comparator2 C2OUT 
   bsf      TRISA,RA3      ;(02) "           C2IN-
   bsf      TRISA,RA2      ;(03) "           C2IN+
   BANKSEL  ANSELA         ;bank3
   clrf     ANSELA         ;RB7:0 digital IO
   bsf      ANSELA,RA3     ;(02) Comp.2 analog  C2IN-
   bsf      ANSELA,RA2     ;(03) "    " "       C2IN+   

;--Komparator C2
   BANKSEL  CM2CON0        ;bank2 S.162ff, 170
   movlw    b'10100000'    ;vgl. MACROS.INC
   movwf    CM2CON0
   bsf      CM2CON0,C2HYS   ;Hysterese 65mV
   ;
   movlw    b'00000011'     ;11 = C2VN connects to C12IN3- pin RA3
   movwf    CM2CON1

Die Bauteile in der von mir am 26.6. mitgeeiltenSchaltung können weitgehend veränert werden und erlauben eine vielfältige Variation der Pulsbreiten bzw. der Periode.

Allgemeines zum C2-Komparatormodul
Die Komparatoren C1,C2 lassen sich unabhänging betreiben und können rasch programmiert werden. Die Impulse meines mit dem C2 aufgebauten AMV haben eine Flankensteilheit (1-90%) von ca. 68ns. 

Nachstehend eine Übersicht zu den Ergebnissen bei unterschiedlicher Bemessung von C1 (Schaltung aus meinem Beitrag vom 26.06.2024).
C1           2,2uF  680nF 100nF  22nF  1nF    Cx*
fmin (Hz)ca. 15     34    377	 675   15800  ?
fmax (Hz)ca. 18     60    418	 1180  27700  460kHz
Cx* C1 ist die parasitäre Kapazität zwischen  benachbarten 
Steckbrettkontakten.

mfG Ottmar
Autor picass
 - 30.06.2024, 10:42:35 CEST
Hallo Jungs!
Ihr merkt schon daran, dass ich etliche Tage hier nicht reingeschaut hatte, dass bei mir Land unter ist und das ist auch sofort meine Reaktion auf das Angebot einer Beteiligung.
Leider! :'(
Das Land steht tief unter Wasser. Erstmal sowieso: es ist Sommerzeit und mein altes, geerbtes Haus versinkt im Sanierungs-Rückstau, da muss es weiter gehen. Dann steht der Sommerurlaub vor der Tür, will sagen, mit dem Auto nach Italien. Aber das Auto ist - nicht ganz so wie ich - alt und hat sich aktuell eine Altersschwäche zugelegt: die Luftfederung will nur teilweise federn, weil sie hinten irgendwo ein Löchlein hat. Wo ist umbekannt. Weil das in der orig Audi-Werkstatt zu Rep-Preisen führen kann, welche den Zeitwert des Wagens übersteigen, muss ich da ran. Tut mir sehr leid, aber ich muss präferieren.

Einziger Beitrag wird wohl sein, eine Anregung für einen sinngebenden Einsatz zu bieten. In meinem Dicken - was mein Auto ist - sitzt leider keine orig verbaute Öltemperatur-Anzeige. Eine solche hatte ich vor Jahren selbst erstellt - is klar: mit PIC drin - und die funktioniert auch immer noch gut. Aber für deren Betrieb ist ein spezieller Öl-Temperatur-Sensor in der Ölablassschraube notwendig. Wie gesagt: alles da, alles funktioniert. Aber theoretisch möglich und technisch eleganter wäre es, das Signal eines orig verbauten Doppelsensors auszulesen und für die Anzeige der Öltemp zu nutzen. Dieser Orig-D-Sensor misst gleichzeitig die Temp und die Pegelhöhe des Motoröls und gibt die beiden Ergebnisse zusammengemischt in einem seriellen Signal aus. Das wird dann natürlich später in einem Steuergerät zerlegt und verwertet, nur nicht angezeigt.

Der Sensor ist von Hella, den habe ich auch als Gebraucht-Gerät in meinem Arbeits-Keller und es gibt auch ein orig Bild der Signal-Zusammensetzung. Die Länge der 2 Haupt-Impulse stellt die Größe der Temp oder der Pegelhöhe dar. Siehe Bild.
Das wäre eine Anwendung für Komparatoren und Timer.
Grüße, picass
hella-signal.jpg
Autor ^Cobra
 - 28.06.2024, 12:28:45 CEST
Tut mir leid, für Praktisches beschäftigen mangelt es grade an einer gescheiten Umgebung. :(
Autor Ottmar
 - 28.06.2024, 10:55:39 CEST
Hi
Das kleine DSO138 von JYETech (Bausatz damals ca. 25€) mißt bis weniger als 100kHz recht gut, hat unterhalb dieses Bereichs keine bemerkenswerten Abweichungen zu meinem Siglent. Das letzte Digit sollte man wohl bei meinem Steckbrettaufbau und dem  RC-Oszillator auch nicht sonderlich bewerten.

Die 2-Wire LCD-Init-Datei ist nicht bemerkenswert größer als eine für 4/8-Digit. Zumal bei der LCD-Ausgabe Zeit kaum eine Rolle spielt. Kann man doch wie beim 16F1827 bis zu 32MHz beim internen Takt gehen.  
Der Unterschied zum 4Bit-Interface besteht nur darin, daß die Bits für jede Übertragung eines Byte 6x durch das Schieberegister geschoben und dann von diesem und nicht von der MCU, paralle, alsl 4Bit LCD-Data + 2Bit (RS,Enable), ins LCD übertragen werden.
Dazu kann das LCD an 2 beliebige, gerade unbenutzte Pins für Data und CLK angeschlossen werden. Das gibt Freiheit in der Nutzung der Portpins, überhaupt wenn z.B. beim TIMER1 nur RB6 als externer Zähleingang (T1CKI) vorhanden ist.

Eigentlich hatte ich ja gehofft, dass sich jemand die gleiche Aufgabe stellt und sich aktiv  und praktisch mit dem T1GM beschäftigt, Na ja, warten wir mal ab.

mfG Ottmar
Autor ^Cobra
 - 27.06.2024, 21:18:32 CEST
Ja das 2 wire für das lcd ist natürlich sehr schick bei so kleinen pics. Wobei es dann etwas mehr Code sein dürfte.

Wenn ich das richtig verstehe misst dein pic 2750us und der oszi 2753us.
Hört sich für mich erstmal nach ein brauchbaren Ergebnis an.

Autor Ottmar
 - 27.06.2024, 18:28:09 CEST
Hi,
Wegen dem Speicherplatz braucht man sich bei diesem PIC noch keine Gedanken zu machenderzeit: 
Program Memory Words Used:  243          
Program Memory Words Free:  3383

Wenn ich bei mir noch noch nicht geläufigen Modulen  Ports initialisiere, ziehe ich es vor, zunächst mal so wie bei dem C2-Port-Beispiel zu initialisieren, gibt mehr Platz für Kommentare und m.E. eine besere Übersicht.

Mein Assemblerwissen gründet sich ebenfalls auf die Webseite www.sprut.de. Allerdings habe ich spruts LCD-Initialisierung ergänzt, so dass ich inzwischen meist nur noch mein 2Wire-interface verwende. Auch habe ich Anpassungen an andere, nicht mit dem HD44780-Standard kompatible LCDs vorgenommen. Na ja, hab' beim letzten Beitrag die Codeschnitzel einfach so aus meiner Versuchs-ASM rauskopiert,die wohl schon etwas zerfledert war und wieder sauber in Ordnung gebracht werden musste. Hab' eben schon reichlich darin rumgespielt. Davon kommt es auch, dass das Modul im letzen Beitrag wiederholt mit anderen Werten initialisiert dargestellt worden ist.

Jetzt sieh das so aus, habe auch schon eine erste Ausgabe im LCD:
main:
   bsf      INTCON,GIE     ;interrupt EIN
   movlw    b'00000000'    ;b7-6=00/01 Tmr1 clock 1/4MHz       DS.185
   movwf    T1CON          ;b0=0 STOP
   ;                       
   movlw    LINE2+.17      ;Ausgabeadress ins DDRAM
   CALL     OutDDRAM_Addr
   movlw    "1"            ;1 MHz 
   CALL    OutLcd_Data     ;TMR1 input Frequenz ausgeben  
                              
main_loop:
   CALL     Key_Fosc       ;Tastenabfrage,Ausgabe fosc 1 oder 4 MHz
   ;                       ;T1CON,TMR1CS1:0 einstellen.
   movlw    b'11010000'    ;b4=0 single pulse, Gate aktiv HIGH
   movwf    T1GCON         ;b5=0 Toglemode disabled für single pulse  

   CALL     TMR1_Gate
   copy     tmpTMR1H,H_Puls1  ;verwendet für Duty Cycle
   copy     tmpTMR1L,H_Puls0
   movlw    LINE1+.7         ;Ausgabe im LCD
   movwf    T1G_Addr
   CALL     Out_TMR1GM     ;fos->fosc/4D zu Dezima, LCD-Ausgabe  
   ;
   movlw	.10            ;1s waren bis zur nächsten Messung
   CALL     Delay100ms
goto main_loop:

Diese zittert in der letzten Stelle (us), liegt wohl am Aufbau und am simplen C2-Oszillator
TMR1 clock ist  fosc/4,  Interner Oszillator  fosc 4MHz 
Gate-Takt ist fout des als AMV beschalteter  C2 ( jedoch C1=100nF).
Ich lege mal dazu Bilder bei und vielleicht interessiert auch das 2-Wire-Interface.

mfG Ottmar
Autor ^Cobra
 - 27.06.2024, 14:42:24 CEST
Moin,
versuche eig. einmal am Tag hier zu schauen ob sich was gerregt hat :P

Also zum Thema LCD: Ich habe mal von Sprut mir das genommen und ehrlich gesagt auch nie weiter damit befasst. Habe
immer den 4 Wire Mode genutzt, so initialisiert wie es Sprut gemacht hat und das wars. :(
Ich Träume zwar davon mir mal ein Grafik Display zu ordern und dieses über I2C oder SPI anzusteuern,
da wollte ich ein Pic als 'Grafikkarte' nutzen sodas ein andere Pic nur ASCII zeichen senden müsste und die Position/Größe und der Pic am Display würde die Pixel berechnen und zum Display schicken. Aber dies ist noch sehr weit in der Zukunft gesehen. (Eventuell auch ein nettes Projekt was man im Forum diskutieren kann)

eine Anmerkung zu dein bereitgestellten Code:

du lädst eine Konstante um das Modul einzustellen, und hinterher setzt du nochmal einzelne Bits. Ich würde entweder alles in der Konstante packen
oder alles einzelt setzen ( Dies würde ich bevorzugen da ich finde es ist lesbarer/verständlicher wenn man eine Zeile für jedes Config bit hat und man ein Kommentar hat was da passieren soll).
also Statt:
movlw    b'10110000' ;b5=0 single pulse

würde ich so schreiben:
  bsf      T1GCON,TMR1GE  ;Timer Gate Funktion einschalten 
  bcf      T1GCON,T1GPOL  ;Gate High-Low Aktive
  bcf      T1GCON,T1GTM   ;Toggle mode aus
  bsf      T1GCON,T1GSPM  ;Single Pule mode ein
  bcf      T1GCON,T1GGO   ;fertig meldung ablöschen
  bcf      T1GCON,T1GVAL  ;Status ablöschen
  bsf      T1GCON,T1GSS0  ;siehe auch T1CON
  bsf      T1GCON,T1GSS1  ;Timer1 Gate Source is (SYNCC2OUT
ausnahme wäre nur wenn aus Speicherplatzgründen man nicht so viele Befehle nutzen will/kann.
Dann würde ich beim Kommentar aber jedes Bit beschreiben.

Similar topics (1)