Hallo Leute,
Habe ein Problem. Ich will mit einem PIC ein OPEL TID Display ansteuern.
Das Interface ist ein abgewandelter I2C Bus.
Das größte Problem ist, das ich einen Quellcode gefunden habe, welchen
ich annähernd lesen kann.
Aber eben nur annähernd.
C kann ich gar nicht.
Das Programm soll aber mal auf Mikrobasic basierend sein.
Eine komplett neue Sprache zu lernen fällt flach, wegen Zeitmangel.
Ich habe folgenden Code in C:
1 | uint8_t tid_send_byte(uint8_t byte)
|
2 | {
|
3 | // assuming SDA and SCL low
|
4 | uint8_t mask = (1 << 6); // MSB first
|
5 | uint8_t ack; // TID ack value
|
6 | for(; mask != 0x00; mask = (mask >> 1)) // shift towards LSB
|
7 | {
|
8 | if(mask & byte)
|
9 | TID_SDA_1();
|
10 | else
|
11 | TID_SDA_0();
|
12 | delay_us(45);
|
13 | TID_SCL_1();
|
14 | loop_until_bit_is_set(TID_PIN,TID_SCL); // IMPORTANT!
|
15 | delay_us(50);
|
16 | TID_SCL_0();
|
17 | delay_us(5); // Th
|
18 | }
|
19 | if(!parity_even_bit(byte & 0x7F)) // odd partition
|
20 | TID_SDA_1();
|
21 | else
|
22 | TID_SDA_0();
|
23 | delay_us(45);
|
24 | TID_SCL_1();
|
25 | loop_until_bit_is_set(TID_PIN,TID_SCL); // IMPORTANT!
|
26 | delay_us(50);
|
27 | TID_SCL_0();
|
28 | TID_SDA_1(); // we will read ack
|
29 | delay_us(50);
|
30 | TID_SCL_1();
|
31 | loop_until_bit_is_set(TID_PIN,TID_SCL); // IMPORTANT!
|
32 | // read ack byte, 0 means acknowledged - data OK
|
33 | if(bit_is_set(TID_PIN,TID_SDA))
|
34 | {
|
35 | ack = 1;
|
36 | }
|
37 | else
|
38 | {
|
39 | ack = 0;
|
40 | }
|
41 | delay_us(50);
|
42 | TID_SCL_0();
|
43 | delay_us(50);
|
44 | TID_SDA_0();
|
45 | delay_us(50);
|
46 | return ack; // 0 == ok
|
47 | }
|
Nun möchte ich ihn in Mikrobasic umwandeln:
1 |
|
2 | Sub function tid_send_byte(byval ByteToSend as byte) as byte 'Gibt Ack zurück
|
3 | ' assuming SDA and SCL low
|
4 | dim i as integer 'Zählervariable
|
5 |
|
6 | for i = 0 to 6
|
7 | if ByteToSend.i = 1 then
|
8 | TID_SDA_1()
|
9 | else
|
10 | TID_SDA_0()
|
11 | end if
|
12 | delay_us(45)
|
13 | TID_SCL_1()
|
14 | do
|
15 | NOP
|
16 | loop until TID_SCL = 1
|
17 | delay_us(50)
|
18 | TID_SCL_0()
|
19 | delay_us(5)
|
20 | next i
|
21 | if TestParityBit(ByteToSend) = 0
|
22 | TID_SDA_0()
|
23 | else
|
24 | TID_SDA_1()
|
25 | end if
|
26 | delay_us(45)
|
27 | TID_SCL_1()
|
28 | Do
|
29 | NOP
|
30 | Loop until TID_SCL = 1
|
31 | delay_us(50)
|
32 | TID_SCL_0()
|
33 | TID_SDA_1() ' we will read ack
|
34 | delay_us(50)
|
35 | TID_SCL_1()
|
36 | do
|
37 | NOP
|
38 | loop until TID_SCL = 1
|
39 | ' read ack byte, 0 means acknowledged - data OK
|
40 | if TID_SDA = 1 then
|
41 | tid_send_byte = 1
|
42 | else
|
43 | tid_send_byte = 0
|
44 | end if
|
45 | delay_us(50)
|
46 | TID_SCL_0()
|
47 | delay_us(50)
|
48 | TID_SDA_0()
|
49 | delay_us(50)
|
50 | End sub
|
Wo liegt mein Problem:
Ich kapieren nicht die Schleife in C nicht.
läuft die von 0 bis 6 , von 1 bis 7 ????
Habe ich diese richtig umgesetzt?
Wie funktioniert das Schieben?
Habe ich das Schieben in meiner Schleife richtig nachgestellt?
Über die Performance des Quelltextes soll hier nicht gestritten werden.
Genausowenig über die Sinnhaftigkeit von Basic.
Würde mich über eine Erklärung freuen.
mfG