Hallo ich hab da ei kleines Problem ich benutze den C18 Compiler und 
beötige eine funktion vom CCS-Compiler.
Ich komme irgendwie nicht alleine daruf??
shift_left(address,bytes,wert);
Die Funktion verschiebt ein Bit in einem Array oder Struktur nach links. 
address kann ein Array oder eine Adresse zu einer Struktur (z.B. wie 
&data). bytes gibt an, mit wievielen Bytes gearbeitet. wert gibt den 
Inhalt des Bits an, entweder 0 oder 1.
Hier noch ein Beispiel zur Anwendung:
byte buffer[3];
for (i=0;i<=24;++i) {
// Wait for clock high
while (!input(PIN_A2));
shift_left(buffer,3,INPUT(PIN_A3));
// Wait for clock low
while (input(PIN_A2));
}
// reads 24 bits from pin A3, each
// bit is read on a low to high on pin // A2
Kann mir jemand die Funktionsbeschreibung geben??
Besten Dank im vorraus
MfG Helmut
  Also ich weiß nicht wie man das in C macht das man das Carry reinschiebt. Aber im Prinzip wird hier nur buffer einmal nach Links geschoben (jedes byte einmal deshalb die 3) und beim ersten byte eine 1 oder 0 reingeschoben. Ich würde das einfach so umschreiben:
1  | int buffer = 0;  | 
2  | for (i=0;i<=24;++i) {  | 
3  |  // Wait for clock high
 | 
4  | while (!input(PIN_A2));  | 
5  | buffer = (buffer << 1) | INPUT(PIN_A3));  | 
6  |  // Wait for clock low
 | 
7  | while (input(PIN_A2));  | 
8  | }
 | 
ggf könnte man auch ne Union nutzen wenn man auf die einzelnen bytes zugreifen will.
Da du in C an das Carry Bit des Prozessors so nicht vernünftig ran kommst, muss man das in Software simulieren
1  | void shift_left( byte* address, size_t bytes, byte wert )  | 
2  | {
 | 
3  | size_t i;  | 
4  | byte Carry;  | 
5  | byte PrevCarry = ( Wert != 0 );  | 
6  | |
7  | for( i = 0; i < bytes; ++i )  | 
8  | Carry = adress[i] & 0x80; // dieses Bit wird rausfallen, also  | 
9  |                                  // sichern, damit es beim nächsthöheren
 | 
10  |                                  // Byte eingesetzt werden kann
 | 
11  | adress[i] <<= 1;  | 
12  | adress[i] |= PrevCarry;  | 
13  | |
14  | PrevCarry = ( Carry != 0 );  | 
15  |   }
 | 
16  | }
 | 
Eine andere Möglichkeit wäre beim Höchstwertigen Byte mit der Schieberei anzufangen. Hier sind 2 Fälle zu unterscheiden: Das höchstwertige Byte wird einfach nur geschoben. Was links rausfällt, fällt raus. Bei allen anderen Bytes wird das Bit 7 in das nächsthöhere Byte übertragen.
1  | void shift_left( byte* address, size_t bytes, byte wert )  | 
2  | {
 | 
3  | size_t i;  | 
4  | |
5  | adress[ bytes - 1 ] <<= 1; // Höchstwertige Byte schieben  | 
6  | |
7  | for( i = bytes - 1; bytes > 0; --i ) {  | 
8  |                                 // muss eine 1 vom Bit7 zum Bit0 eine
 | 
9  |                                 // Stelle höher übertragen werden?
 | 
10  | if( adress[ i - 1 ] & 0x80 != 0 )  | 
11  | adress[ i ] |= 0x01;  | 
12  | |
13  |                                 // dieses Byte jetzt um 1 Position schieben
 | 
14  | adress[ i - 1 ] <<= 1;  | 
15  |   }
 | 
16  | |
17  | if( wert )  | 
18  | adress[0] |= 0x01;  | 
19  | }
 | 
Disclaimer: Ich habe keine der Funktionen getestet. Sie sollten aber zumindest keine gravierenden Fehler aufweisen.
Simon K. wrote:
> In dem ersten Code fehlt eine geschweifte geöffnete Klammer nach <for>
Merci.
Hätte es doch durch den Compiler laufen lassen sollen :-)
  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.