Pkwarn0003, går ej att lösa meha av andra trådar (PIC prog)
Re: Pkwarn0003, går ej att lösa meha av andra trådar (PIC pr
En närmast perfekt förklaring:)
Jag har lärt mig oerhört mkt och det viktigaste: det var en rolig upplevelse! Och det kommer bli fler projekt i framtiden:)
Jag har lärt mig oerhört mkt och det viktigaste: det var en rolig upplevelse! Och det kommer bli fler projekt i framtiden:)
Re: Pkwarn0003, går ej att lösa meha av andra trådar (PIC pr
Nästan inget av strulet i den här tråden har ju handlat om programmeringen, det har ju handlat om oförmåga att förstå hur elektronik fungerar.
Vad får man för nivå på en ingång när två olika utgångar försöker driva den samtidigt till varsin nivå?
Vad händer med en utgång från en krets (programmeraren) när den kretsen inte har nån matning?
Vad får man för nivå på en ingång när två olika utgångar försöker driva den samtidigt till varsin nivå?
Vad händer med en utgång från en krets (programmeraren) när den kretsen inte har nån matning?
Re: Pkwarn0003, går ej att lösa meha av andra trådar (PIC pr
Nu har jag kommit långt, har bara ett litet problem kvar:
Jag kollar olika nivåer från avståndsmätaren ( mha spänning) och det är så att när ingenting är i vägen visar den 0.23-0.3V, dvs under 300mV.
I min kod har jag skrivit att om det är ADC_read är mindre än 400 mV så ska bara en port lysa. Problemet blir att den snabbt alternerar mellan en som lyser och alla lyser (dvs ser ut som om den blinkar med alla dioder och en.
Någon som har en aning om varför det kan vara så?
(Har två avståndsmätare så att ni inte blir förvirrade, j'm,för de så att programmet vet vilken den skall arbeta med.
Jag kollar olika nivåer från avståndsmätaren ( mha spänning) och det är så att när ingenting är i vägen visar den 0.23-0.3V, dvs under 300mV.
I min kod har jag skrivit att om det är ADC_read är mindre än 400 mV så ska bara en port lysa. Problemet blir att den snabbt alternerar mellan en som lyser och alla lyser (dvs ser ut som om den blinkar med alla dioder och en.
Någon som har en aning om varför det kan vara så?
(Har två avståndsmätare så att ni inte blir förvirrade, j'm,för de så att programmet vet vilken den skall arbeta med.
Kod: Markera allt
void main() {
unsigned long ADC_niva;
unsigned long ADC_niva0;
unsigned long ADC_niva1;
[b]TRISA = 0xFF; // PortA - input
TRISB = 0x00; // PortB - output
TRISC = 0x00; // PortC - output[/b] Jag vet att jag inte borde skriva så här. skall ändras snart
ANSEL = 1; // AN pinnarna görs analoga
ANSELH = 1;
C1ON_bit = 0; // Avaktivera comparatorerna
C2ON_bit = 0;
while (1) {
ADC_niva0 = ADC_Read(0); //Läser värde från 'AN0'
ADC_niva1 = ADC_Read(1); //Läser värde från 'AN1'
if (ADC_niva0 >= ADC_niva1 ) {
ADC_niva = (488*ADC_niva0)/100; //Får spänning i mV
}
if (ADC_niva1 >= ADC_niva0 ) {
ADC_niva = (488*ADC_niva1)/100; //Får spänning i mV
}
if (ADC_niva >= 400){
PORTB = 0x00; // Initial state
PORTC = 0x01;
} else if (ADC_niva >= 2300) {
PORTB = 0x00;
PORTC = 0x01; // step 1/7
} else if (ADC_niva >= 1630) {
PORTB = 0x00;
PORTC = 0x03; // step 2
} else if (ADC_niva >= 1340) {
PORTB = 0x00;
PORTC = 0x07; // step 3
} else if (ADC_niva >= 1130) {
PORTB = 0x10; // step 4
PORTC = 0x07;
} else if (ADC_niva >= 990) {
PORTB = 0x30; // step 5
PORTC = 0x07;
} else if (ADC_niva >= 640) {
PORTB = 0x70; // step 6
PORTC = 0x07;
}
Re: Pkwarn0003, går ej att lösa meha av andra trådar (PIC pr
Om jag inte ser fel lite snabbt så kommer den aldrig att utföra de övriga
if'arna om värder är > 400. Ska inte den fösta vara "< 400" ??
Och vad ska hända om ADC_niva0 = ADC_niva1 ?
Varför inte :
Sen så kan man ju köra med ADC värdena direkt utan omräkning i mV vilket bara ger
en tidsödande division. Alltså :
Och sedan testa mot ADC_niva med motsvarande ADC värden.
Alltså 82, 471, 334, 274, 231, 202 och 131 istället för de omräknade mV-värderna.
OK, det kanske blir lite enklare att läsa mV-värderna i själva koden. Det beror också
på hur ofta detta körs. Notera att med divisionen så kommer den att ta väldigt
mycket mer tid än resten i den visade koden. Har du räknat på det? Och tagit
ställning till om det är OK eller inte?
if'arna om värder är > 400. Ska inte den fösta vara "< 400" ??
Och vad ska hända om ADC_niva0 = ADC_niva1 ?
Varför inte :
Kod: Markera allt
if (ADC_niva0 > ADC_niva1 ) {
ADC_niva = (488*ADC_niva0)/100; //Får spänning i mV
}
else {
ADC_niva = (488*ADC_niva1)/100; //Får spänning i mV
}
en tidsödande division. Alltså :
Kod: Markera allt
while (1) {
ADC_niva0 = ADC_Read(0); //Läser värde från 'AN0'
ADC_niva1 = ADC_Read(1); //Läser värde från 'AN1'
if (ADC_niva0 >= ADC_niva1 ) {
ADC_niva = ADC_niva0;
}
else {
ADC_niva = ADC_niva1;
}
Alltså 82, 471, 334, 274, 231, 202 och 131 istället för de omräknade mV-värderna.
OK, det kanske blir lite enklare att läsa mV-värderna i själva koden. Det beror också
på hur ofta detta körs. Notera att med divisionen så kommer den att ta väldigt
mycket mer tid än resten i den visade koden. Har du räknat på det? Och tagit
ställning till om det är OK eller inte?
Re: Pkwarn0003, går ej att lösa meha av andra trådar (PIC pr
Om de är lika triggas båda vilket gör att man får två uträkningar, varv en som kastas direkt.
Fast det största problemet tycker jag är nästa harrang av kod
Om ADC_niva är 400 eller över kommer den första ifsatsen att triggas, annars händer inget. Alla else if är helt onödiga och kommer aldrig triggas.
Fast det största problemet tycker jag är nästa harrang av kod
Kod: Markera allt
if (ADC_niva >= 400){
PORTB = 0x00; // Initial state
PORTC = 0x01;
} else if (ADC_niva >= 2300) {
PORTB = 0x00;
PORTC = 0x01; // step 1/7
} else if (ADC_niva >= 1630) {
PORTB = 0x00;
PORTC = 0x03; // step 2
} else if (ADC_niva >= 1340) {
PORTB = 0x00;
PORTC = 0x07; // step 3
} else if (ADC_niva >= 1130) {
PORTB = 0x10; // step 4
PORTC = 0x07;
} else if (ADC_niva >= 990) {
PORTB = 0x30; // step 5
PORTC = 0x07;
} else if (ADC_niva >= 640) {
PORTB = 0x70; // step 6
PORTC = 0x07;
}
Re: Pkwarn0003, går ej att lösa meha av andra trådar (PIC pr
> Om de är lika triggas båda vilket gör att man får två uträkningar, varv en som kastas direkt.
Ja, det är ju fullständigt uppenbart bara genom att läsa koden.
Det var inte det jag frågade om, jag frågade vad som *SKA* hända.
Det vet ju varken du eller jag, bara den som har tänkt ut det. Min
gissning är att koden inte ser ut som det hela var "tänkt"...
else'arna är ju lite tokiga, ja.
Ja, det är ju fullständigt uppenbart bara genom att läsa koden.

Det var inte det jag frågade om, jag frågade vad som *SKA* hända.
Det vet ju varken du eller jag, bara den som har tänkt ut det. Min
gissning är att koden inte ser ut som det hela var "tänkt"...
else'arna är ju lite tokiga, ja.
Re: Pkwarn0003, går ej att lösa meha av andra trådar (PIC pr
Förlåt, den första delen av if-satsen är bara jag som testade en grej, det som är programmerat är:
Alltså när ingenting är framför avståndsmätaren så får jag 0.3 V ungefär från sensorerna.
Men den alternerar då med att lysa en diod (vilket är rätt) och alla (vilket är feeeel).
Skall testa det där med att ändra så att om de är lika så skall jag göra något. Men kan det vara det som spökar?
Kod: Markera allt
if (ADC_niva <= 400){
PORTB = 0x00; // Initial state
PORTC = 0x01;
} else if (ADC_niva >= 2300) {
PORTB = 0x00;
PORTC = 0x01; // step 1/7
} else if (ADC_niva >= 1630) {
PORTB = 0x00;
PORTC = 0x03; // step 2
} else if (ADC_niva >= 1340) {
PORTB = 0x00;
PORTC = 0x07; // step 3
} else if (ADC_niva >= 1130) {
PORTB = 0x10; // step 4
PORTC = 0x07;
} else if (ADC_niva >= 990) {
PORTB = 0x30; // step 5
PORTC = 0x07;
} else if (ADC_niva >= 640) {
PORTB = 0x70; // step 6
PORTC = 0x07;
}
Men den alternerar då med att lysa en diod (vilket är rätt) och alla (vilket är feeeel).
Skall testa det där med att ändra så att om de är lika så skall jag göra något. Men kan det vara det som spökar?
Re: Pkwarn0003, går ej att lösa meha av andra trådar (PIC pr
Vad är det som går fel ?
Vilke värden på portarna ska du inte få ?
Vilke värden på portarna ska du inte få ?
Re: Pkwarn0003, går ej att lösa meha av andra trådar (PIC pr
Då det inte är någonting i vägen för avståndsmätarna så skall bara en lysdiod lysa. Men det som händer är att mina sju portar som är utgångar till lysdioder blinkar.
Rättare sagt, lysdioden lyser som den ska RC0 (Port C = 0x01). Men sedan sp blinkar resten av dioderna, de går av och på. Tänkte först att det kanske är så att det avståndsmätarna ger ut ligger på gränsen till 400mV, men de ger ju ut 0.28-0.32 så jag har lagt på med marginal (samma sak händer då jag provade att lägga ADC_nivå <= 600.
Kan det vara att multimetern medelvärdesräknar och inte visar det riktiga värdet ut från avståndsmätaren? (Har ju fungerat bra med de andra gränserna).
Jag har inga fler ideer på vad det kan vara som ger detta oönskade resultat.
Kod: Markera allt
if (ADC_niva <= 400){
PORTB = 0x00; // Initial state
PORTC = 0x01;
Kan det vara att multimetern medelvärdesräknar och inte visar det riktiga värdet ut från avståndsmätaren? (Har ju fungerat bra med de andra gränserna).
Jag har inga fler ideer på vad det kan vara som ger detta oönskade resultat.
Re: Pkwarn0003, går ej att lösa meha av andra trådar (PIC pr
Med vilken frekvens?
Stämmer blinkfrekvensen överens med något annat i koden?
Har du WDT avstängt?
> Kan det vara att multimetern medelvärdesräknar och inte visar det riktiga värdet ut från avståndsmätaren?
Visst *kan* det vara så. Enklast kollas det med ett oscilloskop eller om databladet
säger något specifikt om utsignalen. Den kan bara stämmer vid en viss tidpunkt
eller något sådant. Triggas sensorn på något speciellt sätt eller är den "free-running"?
> Jag har inga fler ideer på vad det kan vara som ger detta oönskade resultat.
Nej, och har mna slut på idéer så är det bar att sätta igång och undersöka praktiskt...
Mäta, mäta och mäta igen.
Stämmer blinkfrekvensen överens med något annat i koden?
Har du WDT avstängt?
> Kan det vara att multimetern medelvärdesräknar och inte visar det riktiga värdet ut från avståndsmätaren?
Visst *kan* det vara så. Enklast kollas det med ett oscilloskop eller om databladet
säger något specifikt om utsignalen. Den kan bara stämmer vid en viss tidpunkt
eller något sådant. Triggas sensorn på något speciellt sätt eller är den "free-running"?
> Jag har inga fler ideer på vad det kan vara som ger detta oönskade resultat.
Nej, och har mna slut på idéer så är det bar att sätta igång och undersöka praktiskt...

Mäta, mäta och mäta igen.
Re: Pkwarn0003, går ej att lösa meha av andra trådar (PIC pr
^^ Du definierar hela PORTA som ingång, precis som tidigare i tråden.tecno skrev:Ingångar som flyter?
Har du pulldown på pinnarna?
Re: Pkwarn0003, går ej att lösa meha av andra trådar (PIC pr
Herregud just det, glömde ingångarna. Ska ändra så att det verkligen är RA0 och RA1 som är öppna.
Ändrade till TRISA = 0x03 så att bara RA0 och RA1 är öppna. Dock så får jag samma blinkning. asså det är mer flimmer. Det som bör hända är som sagt att en lysdiod skall lysa. Men resten flimmrar också. (dock så lyser en lysdiod konstant vilket skall hända, det är flimmret som är problemet.
sodjan, hur menar du om det överenstämmer med annat i koden. Jag har inget som ska blinka i koden, eller det kanske inte är det du menade?
Ändrade till TRISA = 0x03 så att bara RA0 och RA1 är öppna. Dock så får jag samma blinkning. asså det är mer flimmer. Det som bör hända är som sagt att en lysdiod skall lysa. Men resten flimmrar också. (dock så lyser en lysdiod konstant vilket skall hända, det är flimmret som är problemet.
sodjan, hur menar du om det överenstämmer med annat i koden. Jag har inget som ska blinka i koden, eller det kanske inte är det du menade?
Re: Pkwarn0003, går ej att lösa meha av andra trådar (PIC pr
Nej, det kanske inte finns något som ska blinka *avsiktligt* i koden,
men ändå gör den ju det!
Det är bara att felsöka enligt metod 1A. Skala av och skala av funktioner tills
det fungerar (eller i alla fall blinkningen slutar). Någonstans där har du orsaken.
Lägg en LED som blinkar till enbart vid reset, för att kolla om processorn
startas om hela tiden. Den ska alltså vara släckt hela tiden utom just
vid en reset.
Vilken frekvens är det på "flimmret"?
men ändå gör den ju det!
Det är bara att felsöka enligt metod 1A. Skala av och skala av funktioner tills
det fungerar (eller i alla fall blinkningen slutar). Någonstans där har du orsaken.
Lägg en LED som blinkar till enbart vid reset, för att kolla om processorn
startas om hela tiden. Den ska alltså vara släckt hela tiden utom just
vid en reset.
Vilken frekvens är det på "flimmret"?
Re: Pkwarn0003, går ej att lösa meha av andra trådar (PIC pr
Vet du vad dessa två rader kod gör mer exakt? Är det fortfarande PIC16f690 du kör?fireas skrev:Kod: Markera allt
ANSEL = 1; // AN pinnarna görs analoga ANSELH = 1;