Konstigt fel: Nu med LED-problem. *Löst*

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
JimmyAndersson
Inlägg: 26579
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Konstigt fel: Nu med LED-problem. *Löst*

Inlägg av JimmyAndersson »

Jag ser ut som ett stort :?: just nu.

Hade programmerat en PIC12F675 i MikroBasic och "tankat över" till PIC-kretsen. Ändrade lite och tankade över igen. Höll på så 4-5 gånger. Allt fungerade som det skulle. Sedan kodade jag så att 3st lysdioder visade var i programmet den var. Lysdioderna var kopplade på GPIO0 - 2.

Flyttade över hex-filen från datorn till datorn som är kopplad till Wisp-programmeraren och knappade in samma rad som tidigare: xwisp2w go flakts~1. Resultat?

Kod: Markera allt

C:\XWISP2170\12F675>xwisp2w go flakts~1
 XWisp2 version 1.6.01 (Aug 14 2005, Open Watcom C 1.30)
File FLAKTS~1.Hex loaded and is Intel Hex format conforming
Programmer Wisp628, firmware version 1.09
Target not found in configuration table
Target not auto-detected, please specify on commandline!
XWisp2 failed after 1.86 seconds, rc 23! 
Vad nu?
Jag har inte ens rört en sladd från gångerna då det fungerat.
Testade med en annan (likadan) PIC-krets, rensade labbplattan och kopplade om igen (på ett annat ställe). Har startat om labbagget flera gånger, mätt spänning, bytt avkopplings/"filter"-kondensatorer. Ingen skillnad alls. Det blir samma meddelande som ovan ändå.

Vad kan ha hänt?


Det enda som är kopplat till PIC-kretsen (förutom MCLR-motstånd) var från början 1st lysdiod med 220-ohms motstånd. Sedan kopplade jag in 2st motstånd och lysdioder till. Det fungerade fortfarande då. Sedan ändrade jag lite i koden (bara så att lysdioderna skulle tändas i början och slutet av koden) och sedan dess har jag bara fått felmeddelandet som visas ovan.

Det fungerar inte heller om jag plockar bort lysdioder och motstånd.




**EDIT**

Testade med en 3e PIC-krets (av samma sort) med bara programmeraren och MCLR-motstånd. Då fungerar det.

Det verkar som om något grillade den förra PIC-kretsen. Men vad? Den andra och tredje PIC'en var oanvänd.

GPIO0 - 2 (GP0 - GP2) var satta som utgångar. Till dessa hade jag som sagt kopplat 220ohms-motstånd och lysdioder ner till jord. GPIO0 och GPIO1 "extraknäcker" även som ICSPDAT och ICSPCLK för programmeraren, men det kan väl inte ha ställt till något?

Vill ju inte att detta händer igen....


Koden:

Kod: Markera allt

'INTRC_OSC_NOCLKOUT ska vara satt i Project -> Edit -> Device Flags.

'GPIO.0 = LED 0   visar bit0
'GPIO.1 = LED 1   visar bit1
'GPIO.2 = LED 2   visar bit2
'GPIO.4 = Från TempKoll (Analog in. Det blir AN3)
'GPIO.5 = PWM ut

symbol LED0 = GPIO.0   ' Visar bit0
symbol LED1 = GPIO.1   ' Visar bit1
symbol LED2 = GPIO.2   ' Visar bit2

dim ntc_lo as byte ' Låga delen av NTC-värdet
dim ntc_hi as byte ' Höga delen av NTC-värdet
dim ntc as word  'Hela NTC-värdet (10bit används) Förväntar spänning mellan 2.3V och 4.4V

sub procedure Init
   TRISIO = %00011000 ' Utgångar överallt, förutom GP4 (AN3) som är ingång. GP3 är alltid ingång.
   IOC = %00000000 ' Interrupt on change - Disabled
   VRCON = 0 ' VoltRef (Comparator) off
   T1CON.TMR1ON = 0 ' Stoppar timern

   'AD-omvandling initiering
   ADCON0.ADFM = 1 ' Högerjusterad
   ADCON0.VCFG = 0 ' VDD som referens
   ADCON0.CHS1 = 1 ' AN3 som ingång
   ADCON0.CHS0 = 1 ' AN3 som ingång
   ADCON0.1 = 0' GO/DONE - Sätt den här hög för att starta en AD-omvandling
   ADCON0.ADON = 1 ' AD-modulen är igång
   ANSEL.ADCS2 = 1  ' FOSC/64 (blir 62.5kHz samplingfrekvens)
   ANSEL.ADCS1 = 1  ' FOSC/64 (blir 62.5kHz samplingfrekvens)
   ANSEL.ADCS0 = 0  ' FOSC/64 (blir 62.5kHz samplingfrekvens)
   ANSEL.ANS3 = 1  ' AN3 som analog in
   ANSEL.ANS2 = 0  ' Digital I/O
   ANSEL.ANS1 = 0  ' Digital I/O
   ANSEL.ANS0 = 0  ' Digital I/O
   
   'Interrupt initiering
   INTCON.GIE = 1 ' Global interrupt enable
   INTCON.PEIE = 1 ' Peripheral Interrupt Enable  (AD t.ex)
   PIE1.ADIE = 1 ' AD-omvandlare ger interrupt
   PIR1.ADIF = 0 ' Clearat interruptet
   
   ntc = 0 ' Nollställer NTC-värdet
   LED0 = 0
   LED1 = 0
   LED2 = 0
end sub


sub procedure ntc_reader
   'Ett interrupt har hänt:
   if TestBit(PIR1, ADIF) = 1 then
      ClearBit(PIR1, ADIF)
        'Läsa av AD-omvandlaren:
        ntc_lo = ADRESL
        ntc_hi = ADRESH
        ntc = (word(ntc_hi << 8)) OR ntc_lo
   end if

SetBit(ADCON0, ADON) 'Gör klart för en ny omvandling
SetBit(ADCON0, 1) 'GO/DONE
end sub


main:
  init
  
  while true

LED2 = 1
LED1 = 1
LED0 = 1
delay_ms(500)
LED2 = 0
LED1 = 0
LED0 = 0
delay_ms(500)

  wend

end.
GPIO.4 är satt som analog in. Det står även "GPIO.5 = PWM ut". Den sistnämnda kopplades aldrig till något. Den förstnämnda var i de första lyckade testerna kopplad till en spänningsdelare med ett motstånd och en pot. Sedan kopplade jag bort det. Då fungerade det fortfarande. Senare skulle det ersättas av en annan krets. Bara så ni vet vad de raderna gör där... :)


Sedan en fråga: LED1 (kopplad till GP1) lyser aldrig. Jag har med andra ord missat något i koden, men vad? Jag är 10000% säker på att jag kopplat rätt. En lysdiod är ju inte direkt svår att koppla in.. :)
Senast redigerad av JimmyAndersson 15 maj 2006, 20:51:12, redigerad totalt 2 gånger.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Ext/int MCLR ??
Användarvisningsbild
Icecap
Inlägg: 26650
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

"En lysdiod är ju inte direkt svår att koppla in..."

Nja... efter vad jag har läst här och i andra forum finns det ett antal som har allvarliga problemer med även den biten.....

Du har 220 ohm motstånder mellan pinne o LED.... de _kan_ belasta så pass att nivåerna inte uppnås, det kan vara värd att testa att koppla loss LED'na _som_enda_ändring_.

WISP'en är annars mycket säker i sin sak...
Användarvisningsbild
JimmyAndersson
Inlägg: 26579
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

Extern MCLR.
MCLRE_ON i Project -> Edit -> Device Flags.
Det ska innebära samma sak som MCLRE = 1 i config (Register 9-1)
Dvs "GP3/MCLR pin function is MCLR"


edit: Bra idé (som vanligt) Icecap! :)

""En lysdiod är ju inte direkt svår att koppla in..."
"Nja... efter vad jag har läst här och i andra forum finns det ett antal som har allvarliga problemer med även den biten....."

Det har du rätt i. :)

edit 2: Testade att plocka bort LED0 och LED2 (de som blinkade) och alltså bara köra med "problem-LED'en" med motstånd. När jag startade labagget så blinkade den till lite svagt, men sedan var den lika släckt som innan. Men jag ska komma ihåg det till en annan gång när det inte vill vara med.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Extern MCLR.

OK.
Och du är helt säker på att ingen HEX fil byggdes med MCLRE_OFF ??

220 ohm är i minsta laget om Wisp628 ska driva dom samtidigt som
programmeringspinnarna.

Behöver du verkligen 220 ohm för att se lysdioderna ?
Prova med 1 kohm eller mer.

> Sedan ändrade jag lite i koden [.....] och sedan dess har jag bara fått
> felmeddelandet som visas ovan.

Och det fungerar det fortfarande med den gamla koden ?
Eller inte med den heller ?

> Bara så ni vet vad de raderna gör där...

Om de inte behövs för att visa problemet, så bör de bort
från "test-caset"...
Användarvisningsbild
JimmyAndersson
Inlägg: 26579
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

"Och du är helt säker på att ingen HEX fil byggdes med MCLRE_OFF ??"

Nu i efterhand är jag inte helt säker: Som en anteckning (på papper) hade jag skrivit "Sätt MCLRE_OFF". Det är inte omöjligt att jag testade med det i stundens hetta, men i mina koder i datorn har jag inte hittat någon version där jag byggde en fil med MCLRE_OFF. Motståndet mellan MCLR-pinnen och +5V är på 10k.


Jag behöver inte 220 ohm för att se lysdioderna, de lyser bra med 1kohm. Testade med det, men LED1 visar ändå inget livstecken. För att förtydliga: Jag kör med en ny PIC-krets som jag är HELT säker på att den inte varit utsatt för några felkonfigureringar/kopplingar av MCLRE.


> Och det fungerar det fortfarande med den gamla koden ?
> Eller inte med den heller ?

Bortser man från LED1 så fungerar fortfarande den gamla koden, och den nya. LED1 har jag aldrig lyckats tända i någon version av koderna eller på någon av de PIC-kretsar av den här sorten som jag testat.


Har även testat nedanstående kod (utan någon skillnad i resultat).

Kod: Markera allt

'Använder interna oscillatorn.
'INTRC_OSC_NOCLKOUT ska vara satt i Project -> Edit -> Device Flags.
'MCLRE_ON ska också vara satt. (Datablad sid 52. sid 54 enligt Acrobat.)

'GPIO.0 = LED 0   visar bit0
'GPIO.1 = LED 1   visar bit1
'GPIO.2 = LED 2   visar bit2

symbol LED0 = GPIO.0   ' Visar bit0
symbol LED1 = GPIO.1   ' Visar bit1
symbol LED2 = GPIO.2   ' Visar bit2

sub procedure Init
   TRISIO = %00001000 ' Utgångar överallt, förutom GP3 som alltid är ingång.
   IOC = %00000000 ' Interrupt on change - Disabled
   VRCON = 0 ' VoltRef (Comparator) off
   T1CON.TMR1ON = 0 ' Stoppar timern

   ANSEL.ANS2 = 0  ' Digital I/O
   ANSEL.ANS1 = 0  ' Digital I/O
   ANSEL.ANS0 = 0  ' Digital I/O

   LED0 = 0
   LED1 = 0
   LED2 = 0
end sub


main:
  init

  while true
    LED2 = 1
    LED1 = 1
    LED0 = 1
    delay_ms(500)
    LED2 = 0
    LED1 = 0
    LED0 = 0
    delay_ms(500)
  wend

end.

Märkte även ett annat fenomen med både koden i förra inlägget och denna kod: Lysdioderna ska ju lysa i 500ms och vara släckta i 500ms och sedan börja om. Det ser snarare ut såhär:

Tända i 500ms
Släckta i 500ms
Tända i 1000ms
Släckta i 500ms
och så håller det på. Det är alltså LED0 och LED2 som blinkar. LED1 är släckt hela tiden.

Kan det ge någon ledtråd?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

OK, så nu har vi bara ett LED problem, inget Wisp628 problem !!??

Prova med t.ex delay_ms(1) mellan varje ändring av LEDx.
T.ex :

Kod: Markera allt

  while true
    LED2 = 1
    delay_ms(1)
    LED1 = 1
    delay_ms(1)
    LED0 = 1
    delay_ms(500)
    LED2 = 0
    delay_ms(1)
    LED1 = 0
    delay_ms(1)
    LED0 = 0
    delay_ms(500)
  wend
om det hjälper så har du read-modify-write problem.

Fungerar följande ? :

Kod: Markera allt

  while true
    LED1 = 1
    delay_ms(500)
    LED1 = 0
    delay_ms(500)
  wend
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 7476
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Inlägg av Marta »

GPIO 0 och 1 (pinne 7/6) är data respektive klocka i programmode. Använd andra pinnar, du skall inte lägga tung last på dessa om det skall gå att programmera PIC på plats i kretsen. Alternativt buffra Dina LED's

Kretsen läser pinnens nivå, inte något outputregister. Är den överlastad så läses den också fel.
Användarvisningsbild
JimmyAndersson
Inlägg: 26579
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

sodjan:
Sant, Inget Wisp628-problem, bara LED-problem. Ska ändra rubriken. :)

Med den första koden reagerar LED1, men den lyser bara (uppskattningsvis) 1ms, sedan slocknar den tills nästa gång den ska tändas och det är likadant varje gång. Varannan gång blinkar LED1 två gånger. De andra lysdioderna visas som de ska.

Den andra koden fungerar fint, bortsett från den lilla detaljen som även uppstår med övriga lysdioder:

Tända i 500ms
Släckta i 500ms
Tända i 1000ms <----
Släckta i 500ms
osv.. Dvs varannan gång en (eller flera) lysdioder tänds så är den tänd dubbelt så länge mot gången innan den var tänd.

Det är precis som om den hoppar till början igen mitt i delayet...


Men vad kan det bero på att den andra koden fungerar, men inte den första?

Testade med andra pinnar och GP4 uppför sig precis likadant som GP1.

Marta:
Nu har jag visserligen inte ens ett års erfarenhet av PIC-kretsar, men Wisp'en brukar klara sånt här utan problem. På en PIC18F2320 kör jag en LCD-display på samma port som programmeraren. Men det är sant, man ska inte dra för mycket kraft från PIC-kretsar.
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 7476
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Inlägg av Marta »

En spänningssatt LCD-modul är en lätt last som knappast märks, går inte alls att jämföra med en direktdriven LED.

Efter att Du har försökt tända Din LED, gör programmet något mera med samma port? Om inte compilern automatiskt skapar ett shadowregistr utan gör direkta logiska operationer mot porten så kommer LED att slockna eftersom de läses noll och sedan skriv tillbaka som nolla om den drar ner porten tillräckligt hårt. Även om en annan LED fungerar med samma inkoppling är det ingen garanti för att alla gör det ifall Du är nära gränsen.
Användarvisningsbild
JimmyAndersson
Inlägg: 26579
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

LCD'n var visserligen bara ett exempel, men jag har kopplat 8st lysdioder till andra PIC-kretsar. Nog borde den här klara 1st LED på vilken utgång som helst?

Gjorde ett annat test:

Kod: Markera allt

  while true 
    LED2 = 1 
    LED1 = 1 
    LED0 = 1 
    delay_ms(500) 
    LED2 = 0 
    LED1 = 0 
    LED0 = 0 
    delay_ms(500) 
  wend
LED0 och LED2 lät jag vara kvar på pinnar GP0 och GP2. Flyttade däremot LED1 till GP5 och ändrade i koden. Då kan alla tre blinka samtidigt. Det är något speciellt med GP1 och GP4 som jag har missat. Kan inte se något gemensamt med dem som de andra pinnarna saknar.

Hittade en grejj i databladet som jag tolkat fel och skrev därför in:

Kod: Markera allt

   CMCON.CM2 = 1 ' Comparator OFF
   CMCON.CM1 = 1 ' Comparator OFF
   CMCON.CM0 = 1 ' Comparator OFF
Då fungerar det med LED1 kopplad till GP1. Alla tre blinkar samtidigt. :)
Lägger då till ANSEL.ANS3 = 0 och testar med LED1 kopplad till GP4 och då fungerar även den. (Med "kopplad" menar jag både rent fysiskt och med symbol LED1 = GPIO.4 i koden.)

Lösningen var egentligen fullständigt logisk, men det vet man ju inte innan man upptäckt den. :D
Det är alltid nyttigt när man får lite input från er eftersom man då ser problemet på ett annat sätt. :)

Nu ska jag koda det jag *egentligen* skulle ha gjort. :D
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 7476
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Inlägg av Marta »

så porten stod i analogt läge och lästes noll, eller vad var det som hände? Det trodde jag givetvis att compilern tog hand om själv. Annars är det ju precis som assembler att man måste tänka på allt själv.
Användarvisningsbild
JimmyAndersson
Inlägg: 26579
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

Jag kan ha fel, men jag tror att comparator-delen "tog över" så att det jag skickade ut på GP1 aldrig kom fram. Väldigt enkelt uttryckt.

Det är helt klart så att man måste tänka på allt själv även i Basic. Kodar man fel så blir det fel. Eller, egentligen blir det ju rätt. Processorn gör ju bara det man har sagt åt den. :)
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

CMCON, det borde jag ha sett... :-)
Det är ju faktiskt ganska tydligt på sidan om GPIO,
en grå ruta med "Note:" i ... :-)

En analog pinne läses alltid som en "nolla" om man läser den "digitalt".
Däremot kan man skriva 1 eller 0 till den och det kommer ut på
pinnen (om den är satt som utgång, vilket inte är normalt för en
analog ingång, så klart).

D.v.s att följande händer :

LED2 = 1 ; Samtidigt sätts LED1 = 0 eftersom den läses som en nolla.
LED1 = 1 ; Går som förväntat LED1 sätts = 1.
LED0 = 1 ; Samtidigt sätts LED1 = 0 eftersom den läses som en nolla.

Detta har med att göra att när man sätter en bit i ett register (vilket som
helst, t.ex GPIO) så läses först *hela* registret, sedan justeras den
aktuella biten och *hela* registret skrivs till sist tillbaka.

> så att det jag skickade ut på GP1 aldrig kom fram.

Jo, det gjorde det alltså, men den blev "nollad" direkt igen av de
kommandona för de *andra* LED'sen.

>Nog borde den här klara 1st LED på vilken utgång som helst?

Det var nog inte så mycket vad PIC'en klarar, utan mer att utgångarna
på Wisp628 kan bli för hårt lastade.
Användarvisningsbild
JimmyAndersson
Inlägg: 26579
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

Mycket intressant!

Du har inte funderat på att skriva en bok? :)
Skriv svar