Hallo! Haben eine Frage bezüglich der CCP Programmierung. Unser Code: for(i =0; i <47;i++){ void CCP1ISR() { Pin1 = Wert[i]; delay_ms(2); } } for (x=0; x<=47; x++) { tmp >>= 1; if (wert[x]==1) tmp |= 0x80; } Kann das prinzipiell funktionieren wenn wir den ccp eingang auf eine tankt legen und sozusagen immer bei RE eien wert von einer DAtenleitung abgreifen wollen .Anschließend wollen wir die aufgenommenen WErte ( wert[0]-wert[47]) als eine bin zahl darstellen können ! Ist monentan nur eine theorätische überlegung .. Also wären dankbar wenn uns jemad sagen kann ob das so funktionieren kann ! danke im voraus
Herbert Kn schrieb: > Hallo! > > Haben eine Frage bezüglich der CCP Programmierung. Was ist CCP Programmierung? (russisch? das wäre aber dann CCCP) > Unser Code: > > for(i =0; i <47;i++){ > > void CCP1ISR() > { > Pin1 = Wert[i]; > delay_ms(2); > } > } Weder in C noch in C++ kann man eine Funktion innerhalb einer anderen Funktion definieren. > > for (x=0; x<=47; x++) { Oben wars noch <, jetzt ist es plötzlich <= Was denn nun? > tmp >>= 1; > if (wert[x]==1) tmp |= 0x80; Wenn tmp gross genug ist, dass man sooft schieben kann. > > } > > Kann das prinzipiell funktionieren wenn wir den ccp eingang Was ist ein ccp Eingang? > auf eine > tankt legen Wohin? > und sozusagen immer bei RE eien wert Wobei? Bei RE? > von einer DAtenleitung > abgreifen wollen .Anschließend wollen wir die aufgenommenen WErte ( > wert[0]-wert[47]) als eine bin zahl darstellen können ! schön. Was hindert euch? > Also wären dankbar wenn uns jemad sagen kann ob das so funktionieren > kann ! Kommt drauf an, wie schnell das Signal ist. Ach ja. Die 2 Millisekunden bei _delay_ms sind eher so ein ungefährer Richtwert. Das heißt jetzt nicht, dass ihr alle 2 Millisekunden abtastet. Der Rest der Abtastschleife braucht ja auch seine Zeit. Besser ist es da, sich einen Timer einzurichten. Dann muss man auch nicht so aufpassen, dass man den Delay-Wert bei jeder Änderung in der Schleife anpassen muss. Der Timer löst alle 2 Millisekunden den Abtastvorgang aus. Dann ist es relativ egal was der µC in der Zwischenzeit macht und die Zeiten stimmen trotzdem ziemlich genau.
Also mal vorweg ... es ist Capture Compare gemeint ! Grundsätzlich ist unser probelm das wir nicht wissen ob > void CCP1ISR() > { > Pin1 = Wert[i]; > delay_ms(2); > } dieser teil funktioniert... das delay mal beiseite gelassen Also wir hier bei jeder steigenden Flanke die aktion ausgeführt? Sprich hierbei : Pin1 = Wert[i]; Also der ccp Eingang vom microcontroller liegt auf einem Takt. Wir wollen erreichen das mithilfe dieses Programmes bei jeder Steigenden Flanke ein Wert von einer Datenleitung abgegriffen wird . Die Datrenleitung soll mit Pin1 symbolisiert werden .
@Karl heinz Buchegger > Weder in C noch in C++ kann man eine Funktion innerhalb einer anderen > Funktion definieren. sicher? http://ridiculousfish.com/blog/page/4/
Herbert Kn schrieb: > Also mal vorweg ... es ist Capture Compare gemeint ! Was ist ein Capture Compare? Ich kenne Input Capture Ich kenne Output Compare Und ich kenne Output Compare Match Aber Capture Compare kenne ich nicht. >> void CCP1ISR() >> { >> Pin1 = Wert[i]; >> delay_ms(2); >> } > > > dieser teil funktioniert... das delay mal beiseite gelassen > > Also wir hier bei jeder steigenden Flanke die aktion ausgeführt? Nein. Warum sollte es? Woher soll der Prozessor wissen, dass ausgerechnet diese Funktion bei einer steigenden Flanke ausgeführt werden soll. Im übrigen: Was hilft es euch, wenn diese Funktion bei jeder steigenden Flanke aufgerufen wird? Einfach mal angenommen, dass das Signal die ganze Zeit auf 0 ist. Dann gibt es keine steigende Flanke :-) > Also der ccp Eingang vom microcontroller liegt auf einem Takt. Also jetzt muss ich fragen: Von welchem µC reden wir eigentlich? Offensichtlich redest du von einem anderen als ich!
Peter schrieb: > @Karl heinz Buchegger >> Weder in C noch in C++ kann man eine Funktion innerhalb einer anderen >> Funktion definieren. > sicher? > > http://ridiculousfish.com/blog/page/4/ Schön. Kannst du mir jetzt auch im C99 Standard besagte Stelle zeigen? Im Zweifel ist das die einzige Autorität die ich anerkenne :-)
Karl heinz Buchegger schrieb: > Im übrigen: Was hilft es euch, wenn diese Funktion bei jeder steigenden > Flanke aufgerufen wird? > Einfach mal angenommen, dass das Signal die ganze Zeit auf 0 ist. Dann > gibt es keine steigende Flanke :-) Ach jetzt verstehe ich! Ihr habt 2 Eingänge. Auf einem kommt ein Takt. Der andere Eingang liefert das Datensignal. Mit jeder steigenden Flanke auf dem Taktsignal soll der Zustand des Datensignals übernommen werden. Da gibt es mehrere Möglichkeiten * Auf einem INTx Eingang könnte man mit der steigenden Flanke einen Interrupt auslösen lassen * Wenn der Takt langsam genug ist, könnte man auch einfach pollen (also regelmässig nachsehen, ob die Flanke schon da war)
Capture Compare gibts u.a. bei den C166(V2); korrekt heissts da "Capture/Compare Unit"
MeinerEiner schrieb: > Capture Compare gibts u.a. bei den C166(V2); korrekt heissts da > "Capture/Compare Unit" Ja wenn er endlich mal von sich geben würde, um welchen Prozessor es eigentlich geht. Aber egal. Wenn er in seinem Programm auch so sorgfältig schreibt, wie hier bei seiner Fragestellung, werden wir sicherlich noch das eine oder andere mal von ihm hören :-)
Es wird im Programm MPlab programmiert, und es wird der Pic 18F4550 verwendet.
Herbert Kn schrieb: > Es wird im Programm MPlab programmiert, und es wird der Pic 18F4550 > verwendet. Och nö, doch schon jetzt rückst Du mit den wichtigsten Dingen raus. Schau dochmal, ob Dein PIC SPI kann. Denn das ist es, was Du machen willst. Und es ist Pfui-Bäh in C-Code Variablen ohne Deklaration zu verwenden. Du mußt es den Helfenden nicht absichtlich schwer machen. Alles, was Du verwendest, muß deklariert sein. Und wenn Du Interrupts verwendest, müssen sie erstmal initialisiert werden. Nur vom Hinschreiben des Handlers passiert genau 0,nix. Das ist dann nur toter Code. Peter
Hallo! So wir haben eine Schaltung mit einer Datenleitung und einer Taktleitung. Die Messung soll im Progamm beginnen wenn die Taktleitung auf 1 gesetzt wird. Auf der Datenleitung haben wir immer 2Byte zustände zusammen, dann wieder ne Pause dann wieder 2Byte usw. Wir haben aber herausgefunden das es immer Startbytes gibt. BSP: 1111101111111111 ----> Start 1111011100000000 ----> Info 1111110100010000 ----> Info 1111111010100100 ----> Info Jetzt haben wir uns gedacht das wir alle Byte-reihenfolgen erfassen, was wir auch scho gemacht haben. Jetz haben wir mal gedacht wenn wir alle werte in so eine Art tabelle (falls man sowas in MPlab machen kann) erzeugt. Wenn dann die Byte-information herein kommt weiß das programm was das für ein reihenfolge ist, und kann dies dann in eine Binärzahl wandeln, welche dann seriell´weiter gegeben werden muss. Oder braucht man keine Tabelle. Also ich mein das so wenn wir jetz einfach Byte-Information einlesen, und dann einen wert zuweißen ?? aber dann hab ich ja das problem das ich in diesem Moment nicht weiß welche reihenfolge es sein wird. Ich glaube dieser Text ist jetz ein bisschen ausführlicher geschrieben :) Vielleicht könnt ihr uns ja sagen wie man sowas am besten realisieren kann Danke
Herbert Kn schrieb: > > Ich glaube dieser Text ist jetz ein bisschen ausführlicher geschrieben > :) Ausführlich schon. Aber sehr konfus. Bin schon neugierig wer es schafft da einen Sinn reinzulegen. Ich schaffe es nicht :-) Zuerst redest du von 1 Datenleitung und 1 Taktleitung. Also auf Bitebene. Und dann geht es nur noch um Bytes
So mal nebenbei: CCP steht für Can Calibration Protocoll. Wir für Kalibrierung über Can eingesetzt. Mittlerweile ein Standard in der Automobilindustrie. Da ich eigentlich dieses Thema erwartet habe, war ich "fürchterlich" enttäuscht um was es hier geht ;-)
Ja 1Byte is ja 8Bit wenn ich das mal so verstehe. eine Codereihenfolge ist wie man oben sehen kann 2Byte also 16Bit. Also die Taktleitung liefert immer schon eine High Low Rechtecksignal. Die Datenleitung is unregelmäßiger aber das haben wir schon herausgefunden. Also wenn beide leitungen auf 1 sind, ist im code ein 1er und wenn nur der Takt auf high ist dann ein 0er. So ergebn sich diese Reihenfolgen.4 Ja und wir haben halt das Problem das die Aufnahme von den Codes erst beim Start Byte anfangen soll also bei 1111101111111111. Vielleicht hilft das weiter Danke
Herbert90 schrieb: > Ja 1Byte is ja 8Bit wenn ich das mal so verstehe. > eine Codereihenfolge ist wie man oben sehen kann 2Byte also 16Bit. Wo kann man das sehen? > Also die Taktleitung liefert immer schon eine High Low Rechtecksignal. > Die Datenleitung is unregelmäßiger aber das haben wir schon > herausgefunden. Logisch. > Ja und wir haben halt das Problem das die Aufnahme von den Codes erst > beim Start Byte anfangen soll also bei 1111101111111111. Ihr geht das völlig falsch an. Euer erstes Ziel ist es, mit der 1 Taktleitung und der 1 Datenleitung erst mal die Bits einzulesen und aus jeweils 8 Bit ein Byte zu machen. Dabei ist es völlig egal, was das Byte enthält. Das wird später ausgewertet. (Woran erkennt ihr eigentlich, wann ein neues Byte startet?) Oder habt ihr physikalisch gar nicht eine (1) Datenleitung sondern 16 und die Taktleitung sagt lediglich, wann der Zustand auf all den 16 Datenleitungen gültig ist.
Also wir haben da 2Byte hintereinander und dann eine lange zeit nichts und dann wieder 2Byte dann wieder lage zeit nichts dann wieder usw. Ja wir haben das mit einem Logikanalyser ausgemessen, deswegen wissen wir das. Danke
Seufz. Ich geb auf. Man kriegt einfach keine vernünftige verwertbare Information aus dem Fragesteller raus.
>Wo kann man das sehen? Am Logikanalyser >(Woran erkennt ihr eigentlich, wann ein neues Byte startet?) Also bei den ersten zwei Bytes erkennt man das nicht, nur nach den ersten zwei zu den nächsten zwei ist eine lange Pause. Ja wie kann ich denn die 8Bit einlesen wenn ich keine Grenze zwischen den ersten beiden Byte habe ?
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.