Forum: Mikrocontroller und Digitale Elektronik CCP Programmierung


von Herbert K. (herbert90)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Herbert K. (herbert90)


Lesenswert?

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 .

von Peter (Gast)


Lesenswert?

@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/

von Karl H. (kbuchegg)


Lesenswert?

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!

von Karl H. (kbuchegg)


Lesenswert?

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 :-)

von Karl H. (kbuchegg)


Lesenswert?

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)

von Herbert K. (herbert90)


Lesenswert?

hallo

Ja genau das wollen erreichen.

Wir probieren das jetz mal mit polling

von MeinerEiner (Gast)


Lesenswert?

Capture Compare gibts u.a. bei den C166(V2); korrekt heissts da 
"Capture/Compare Unit"

von Karl H. (kbuchegg)


Lesenswert?

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 :-)

von Herbert K. (herbert90)


Lesenswert?

Es wird im Programm MPlab programmiert, und es wird der Pic 18F4550 
verwendet.

von Peter D. (peda)


Lesenswert?

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

von Herbert K. (herbert90)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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

von Ich (Gast)


Lesenswert?

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 ;-)

von Herbert90 (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Herbert90 (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

Seufz. Ich geb auf.
Man kriegt einfach keine vernünftige verwertbare Information aus dem 
Fragesteller raus.

von Herbert90 (Gast)


Lesenswert?

Ja was brauchst denn für infos ?

von Herbert90 (Gast)


Lesenswert?

>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
Noch kein Account? Hier anmelden.