Pkwarn0003, går ej att lösa meha av andra trådar (PIC prog)

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
fireas
Inlägg: 204
Blev medlem: 26 januari 2009, 12:44:25

Re: Pkwarn0003, går ej att lösa meha av andra trådar (PIC pr

Inlägg av fireas »

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:)
Nerre
Inlägg: 27235
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: Pkwarn0003, går ej att lösa meha av andra trådar (PIC pr

Inlägg av Nerre »

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?
Användarvisningsbild
fireas
Inlägg: 204
Blev medlem: 26 januari 2009, 12:44:25

Re: Pkwarn0003, går ej att lösa meha av andra trådar (PIC pr

Inlägg av fireas »

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.

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;

           }
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Pkwarn0003, går ej att lösa meha av andra trådar (PIC pr

Inlägg av sodjan »

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 :

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
          }
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å :

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;
          }
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?
Pajn
Inlägg: 1160
Blev medlem: 6 juni 2008, 19:14:29
Ort: Nyköping
Kontakt:

Re: Pkwarn0003, går ej att lösa meha av andra trådar (PIC pr

Inlägg av Pajn »

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

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;

           }
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.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Pkwarn0003, går ej att lösa meha av andra trådar (PIC pr

Inlägg av sodjan »

> 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. :roll:
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.
Användarvisningsbild
fireas
Inlägg: 204
Blev medlem: 26 januari 2009, 12:44:25

Re: Pkwarn0003, går ej att lösa meha av andra trådar (PIC pr

Inlägg av fireas »

Förlåt, den första delen av if-satsen är bara jag som testade en grej, det som är programmerat är:

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;

           }
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?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Pkwarn0003, går ej att lösa meha av andra trådar (PIC pr

Inlägg av sodjan »

Vad är det som går fel ?
Vilke värden på portarna ska du inte få ?
Användarvisningsbild
fireas
Inlägg: 204
Blev medlem: 26 januari 2009, 12:44:25

Re: Pkwarn0003, går ej att lösa meha av andra trådar (PIC pr

Inlägg av fireas »

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.

Kod: Markera allt

if (ADC_niva <= 400){
             PORTB = 0x00; // Initial state
             PORTC = 0x01;
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.
Användarvisningsbild
tecno
Inlägg: 27254
Blev medlem: 6 september 2004, 17:34:45
Skype: tecnobs
Ort: Sparreholm, Södermanland N 59° 4.134', E 16° 49.743'
Kontakt:

Re: Pkwarn0003, går ej att lösa meha av andra trådar (PIC pr

Inlägg av tecno »

Ingångar som flyter?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Pkwarn0003, går ej att lösa meha av andra trådar (PIC pr

Inlägg av sodjan »

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.
Pajn
Inlägg: 1160
Blev medlem: 6 juni 2008, 19:14:29
Ort: Nyköping
Kontakt:

Re: Pkwarn0003, går ej att lösa meha av andra trådar (PIC pr

Inlägg av Pajn »

tecno skrev:Ingångar som flyter?
^^ Du definierar hela PORTA som ingång, precis som tidigare i tråden.
Har du pulldown på pinnarna?
Användarvisningsbild
fireas
Inlägg: 204
Blev medlem: 26 januari 2009, 12:44:25

Re: Pkwarn0003, går ej att lösa meha av andra trådar (PIC pr

Inlägg av fireas »

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?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Pkwarn0003, går ej att lösa meha av andra trådar (PIC pr

Inlägg av sodjan »

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"?
Kaggen
Inlägg: 432
Blev medlem: 29 januari 2005, 03:06:02

Re: Pkwarn0003, går ej att lösa meha av andra trådar (PIC pr

Inlägg av Kaggen »

fireas skrev:

Kod: Markera allt

     ANSEL = 1;    // AN pinnarna görs analoga
     ANSELH = 1;
Vet du vad dessa två rader kod gör mer exakt? Är det fortfarande PIC16f690 du kör?
Skriv svar