1-Wire med PIC

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
ankan
Inlägg: 1091
Blev medlem: 12 november 2004, 01:50:35

1-Wire med PIC

Inlägg 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]
ankan
Inlägg: 1091
Blev medlem: 12 november 2004, 01:50:35

Inlägg av ankan »

Såg att det var for-loopen som var felskriven.
ankan
Inlägg: 1091
Blev medlem: 12 november 2004, 01:50:35

Inlägg 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.
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg 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);
ankan
Inlägg: 1091
Blev medlem: 12 november 2004, 01:50:35

Inlägg 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.
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg 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.
ankan
Inlägg: 1091
Blev medlem: 12 november 2004, 01:50:35

Inlägg 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
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg 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'.
Senast redigerad av Icecap 20 mars 2007, 17:27:19, redigerad totalt 1 gång.
ankan
Inlägg: 1091
Blev medlem: 12 november 2004, 01:50:35

Inlägg 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?
ankan
Inlägg: 1091
Blev medlem: 12 november 2004, 01:50:35

Inlägg av ankan »

Det var fel i Header filen..
Skriv svar