Sida 1 av 1

1-Wire med PIC

Postat: 20 mars 2007, 09:38:06
av ankan
Hur vet man vilken tid som man behöver vänta innan man ska läsa av och varför fungerar inte FOR loopen?

Kod: Markera allt

  while(1){
    Ow_Reset(&PORTA,1);                    // RESET
    Ow_Write(&PORTA,1,0xCC);               // SKIP_ROM
    Ow_Write(&PORTA,1,0x44);               // CONVERT_T
    Delay_us(120);

    Ow_Reset(&PORTA,1);                    // RESET
    Ow_Write(&PORTA,1,0xCC);               // SKIP_ROM
    Ow_Write(&PORTA,1,0xBE);               // READ_SCRATCHPAD
    Delay_ms(400);

/*
    for (i=1;i>=0;i++) {
      ROM_data[i] = Ow_Read(&PORTA,1);     // Spara temperaturen
      Usart_Write(ROM_data[i]);
    }
*/

    j = Ow_Read(&PORTA,1);     // Get temperature LSB
    temp = Ow_Read(&PORTA,1);  // Get temperature MSB
    temp <<= 8; temp += j;     // Form the result
    Usart_Write(temp); // Format and display result on LCD

    Delay_ms(1000);
[/i]

Postat: 20 mars 2007, 09:46:56
av ankan
Såg att det var for-loopen som var felskriven.

Postat: 20 mars 2007, 10:04:18
av ankan
Vad är det för fel på denna loop då?

Kod: Markera allt

    for (i=1;i>=0;i--) {
      ROM_data[i] = Ow_Read(&PORTA,1);     // Spara temperaturen
    }
Vill fylla Arrayen på pos 0 och 1 men den fastnar där och loopar hela tiden.

Postat: 20 mars 2007, 10:11:30
av Icecap
Antagligen är i en unsigned variabel vilket gör att den räknar 0-- vilket ger 255 vilket är >=0 vilket alltså är sant.

Dessutom är det en del overhead med bara 2 platser, alltså är det snabbare och "billigare" (räknat i minne) att göra:
ROM_data[1] = Ow_Read(&PORTA,1);
ROM_data[0] = Ow_Read(&PORTA,1);

Postat: 20 mars 2007, 10:16:44
av ankan
Ska jag göra i till en signed?

I detta fall så blev det till att göra direkt som du skrev men jag tänkte för andra loopar som jag vill få till som ska räkna längre baklänges.

Postat: 20 mars 2007, 10:29:30
av Icecap
Det kan vara en lösning att göra den till en signed men man kan även ha kriterian: i < 255 eller om du vill vara HELT säker: i < 128.

Postat: 20 mars 2007, 11:27:43
av ankan
Fick bli så här i stället:

Kod: Markera allt

  for (i=8;i>0;i--)
    ROM_nummer[i-1] = Ow_Read(&PORTA,1);     // Spara ROM nummer

Postat: 20 mars 2007, 12:16:30
av Icecap
for(i=8;i>0;) ROM_nummer[--i] = Ow_Read(&PORTA,1); // Spara ROM nummer

Denna version gör exakt det samma fast lite optimerat.
'--i' gör att i dekrementeras FÖRST och resultatet används SEDAN, på detta sätt sparar du CPU-tid vid att spola 'i-1'.

Postat: 20 mars 2007, 14:12:46
av ankan
Får bara Routine ow_get_id signature do not match routine call signature när jag anropar nedanstående rutin:

Kod: Markera allt

unsigned short * ow_get_id() {

  signed short i;
  unsigned short ROM_id[8];

  Ow_Reset(OW_PORT,OW_PIN);                      // RESET
  Ow_Write(OW_PORT,OW_PIN,0x33);                 // READ_ROM
  Delay_us(120);                           // pause
  for (i=0;i<=7;i++)
    ROM_id[i] = Ow_Read(OW_PORT,OW_PIN);     // Spara ROM nummer

  return ROM_id;
  
}
Vad kan vara fel?

Postat: 20 mars 2007, 14:18:00
av ankan
Det var fel i Header filen..