PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
ankan
Inlägg: 1091 Blev medlem: 12 november 2004, 01:50:35
Inlägg
av ankan » 20 mars 2007, 09:38:06
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 » 20 mars 2007, 09:46:56
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 » 20 mars 2007, 10:04:18
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.
Icecap
Inlägg: 26659 Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark
Inlägg
av Icecap » 20 mars 2007, 10:11:30
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 » 20 mars 2007, 10:16:44
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.
Icecap
Inlägg: 26659 Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark
Inlägg
av Icecap » 20 mars 2007, 10:29:30
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 » 20 mars 2007, 11:27:43
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
Icecap
Inlägg: 26659 Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark
Inlägg
av Icecap » 20 mars 2007, 12:16:30
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 » 20 mars 2007, 14:12:46
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 » 20 mars 2007, 14:18:00
Det var fel i Header filen..