Hallo,
Ich habe die 1-Wire Routinen von Peter Dannegger auf einen PIC24F32KA302
portiert. Die Bitbanging-Variante funktioniert einwandfrei. Dann habe
ich die Lowlevel-Routinen Reset & BitIO auf UART umgestellt (TX über
Diode entkoppelt), was soweit auch funktioniert, aber:
Jegliche Änderungen am Bus (z.B. hinzufügen eines Sensors oder abklemmen
eines Sensors) bringt die UART-Variante aus dem Tritt und erfordert
einen Reset (Neustart). Die Bitbanging-Variante war hier robuster. Der
UART-Code basiert auf den AppNotes von ATMEL, Maxim und natürlich auf
der Originalroutine von Peter.
Vielleicht fällt jemandem ja der Grund für die "Empfindlichkeit" bzgl.
Busänderungen auf, ich sehe gerade den Wald vor lauter Bäumen nicht.
1 | uint8_t OneWire_Reset()
|
2 | {
|
3 | uint8_t result = 0;
|
4 |
|
5 | // UART mit 9600 Baud initialisieren
|
6 |
|
7 | U2MODEbits.BRGH = 1; // 16bit Baudrate Generator
|
8 | U2BRG = 415; // 9600 Baud bei FOSC 32MHz
|
9 | U2MODEbits.UEN = 0; // Keine HW Flusskontrolle
|
10 | U2MODEbits.UARTEN = 1; // UART einschalten
|
11 | U2STAbits.UTXEN = 1; // UART Transmitter einschalten
|
12 |
|
13 | U2TXREG = 0xF0; // Reset senden
|
14 |
|
15 | while(!U2STAbits.URXDA); // RX Puffer einlesen
|
16 | do
|
17 | {
|
18 | result = U2RXREG;
|
19 | } while (U2STAbits.URXDA);
|
20 |
|
21 | if ((result & 0xF0) == 0xF0) // 1Wire: No presence
|
22 | return 1;
|
23 | else
|
24 | return 0;
|
25 | }
|
26 |
|
27 | uint8_t OneWire_BitIO(uint8_t b)
|
28 | {
|
29 | uint8_t result = 0;
|
30 |
|
31 | // UART auf 115200 Baud
|
32 |
|
33 | U2MODEbits.BRGH = 1; // 16bit Baudrate Generator
|
34 | U2BRG = 33; // 115200 Baud bei FOSC 32MHz
|
35 | U2MODEbits.UEN = 0; // Keine HW Flusskontrolle
|
36 | U2MODEbits.UARTEN = 1; // UART einschalten
|
37 | U2STAbits.UTXEN = 1; // UART Transmitter einschalten
|
38 |
|
39 | if (b) // 1 senden
|
40 | {
|
41 | U2TXREG = 0xFF; // 0xFF ist 1 auf Bus
|
42 | while(!U2STAbits.URXDA);// RX Puffer lesen
|
43 | do
|
44 | {
|
45 | result = U2RXREG;
|
46 | } while (U2STAbits.URXDA);
|
47 | }
|
48 | else
|
49 | {
|
50 | U2TXREG = 0x00; // 0x00 ist 0 auf Bus
|
51 | while(!U2STAbits.URXDA);// RX Puffer lesen
|
52 | do
|
53 | {
|
54 | result = U2RXREG;
|
55 | } while (U2STAbits.URXDA);
|
56 | result = 0;
|
57 | }
|
58 |
|
59 | if ((result & 0xFF) == 0xFF) // 0xFF entspricht 1
|
60 | return 1;
|
61 | else // alles andere 0
|
62 | return 0;
|
63 | }
|