Helt rätt, fuses/config är ju en lite annan sak...
> Tänkte mer om det fanns några direkta no-no's...
- Köra en LED direkt eftersom "pinnen i alla fall bara leverar 20 mA".
- Låta skyddsdioderna "klippa" en insignal med över/under spänning.
- Driva en power MOSFET direkt utan gatemotstånd.
- Låta en ingång "flyta".
Det är några saker som jag kommer på på rak arm.
Inte riktigt "till flera saker", men i alla fall...
För att försöka förstå bättre. Kan jag tänka så här? :
- Köra en LED direkt eftersom "pinnen i alla fall bara leverar 20 mA". Misstänker det är ganska givet att databladet specar detta.
- Låta skyddsdioderna "klippa" en insignal med över/under spänning. Förstår inte. Kan någon berätta vart jag kan läsa mer?
- Driva en power MOSFET direkt utan gatemotstånd. Visste inte, men efter ha läst ett datablad så förstår jag bättre. Bra tips där.
- Låta en ingång "flyta". Därom tvistar de lärda. Förslagsvis att sätta "alla" oanvända I/O's till outputs, samt/alternativt med ett pull up/down motstånd?
> Misstänker det är ganska givet att databladet specar detta.
Databladet säger vilken ström man max ska/bör dra från en pinne
(och för en port och för processorn totalt). Ström utöver det gör
att de inte länge garanterar funktionen.
> Förstår inte. Kan någon berätta vart jag kan läsa mer?
Det finns skyddsdioder på ingångarna för att skydda processorn mot överspänning.
Men det finns inga garantier att den fungerar normalt när dessa är i funktion.
Dioderna är för att skydda processorn, inte för att användas.
> Visste inte, men efter ha läst ett datablad så förstår jag bättre. Bra tips där.
Gate'n på en större MOSFET ser från processorn ut som en kondensator.
Vid snabba omslag uppstår det en strömrusning och pinnens max ström kan
lätt överskridas. Därav ett motstånd mellan, ca 50-100 ohm kan vara normalt.
Det är av en anledning det finns speciella "MOSFET-drivers" som kan momentant
köra in 1-2 A till gaten.
> Därom tvistar de lärda.
Inte att det är fel. Det finns i princip två alternativ som du säger.
Båda fungerar i princip lika bra, det beror lite på hur det ser ut
för övrigt i den aktuella kopplingen.
Hmm, var med om något märkligt innan. Det var givetvis jag som gjorde något men någon av er kanske kan förklara vad som hände..
Satt och programmerade mitt "low pin count dev board" med Pickit 2. Det enda jag ville göra var att tända och släcka 3 LED's som finns på kortet i olika ordning. Det fungerade fin fint.
Sen fick jag syn på "Programmer-to-go" funktionen och tänkte testa detta. Det var då det blev tok; Programmet som fanns i PIC'en var "rinna" dessa 3 LED's om och om igen. Programmet jag ville prova "to-go" funktionen med var helt enkelt att blinka alla 3 samtidigt.
Nej ingen direkt raketforskning men det skulle ge mig ett klart svar på att funktionen verkligen fungerade.
Nåja, följde instruktionerna (inkl bockade i att Pickit skulle ge Vdd) och "låtsades" programmera men allt som hände var att LED'arna blinkade till en gång snabbt och sen hände inget mer.
Ok, jag klantade mig tydligen men nu till den verkliga frågan. När jag nu kopplade in allt och startade alla program så kunde jag inte få PIC'en at reagera. Misstänkte då att jag överbelastar den med 3 LED's så jag skrev om programmet till att blinka 1 LED och tada, då hoppade det igång men med ett fel, dioden bredvid lös konstant, och det fanns inte ens med i koden.
Provade erase och programmera igen men ingen skillnad. Till slut löste det sig genom att jag fick i programmet sätta den utgången till 0, programmera om, för att sen radera det från koden och programmera igen.
Utifrån den här historien, finns det någon rimlig förklaring?
Fasen också vad frustrerande.
Provade att köra in ny firmware i Pickit'et men det blev ingen skillnad.
Funderade på om jag gör något fel i koden som inte visat sig innan...
I nedan exempel (i MikroC Pro) så vill jag bara blinka 3 LEDS. När jag laddat det här programmet så blinkar bara RC1 och 2, inte RC0.
Om jag sedan kommenterar bort RC1 och 2 så blinkar RC0 och 1 & 2 lyser konstant...
Tror jag "löste" det.
Lite klantigt så förutsatte jag att Pickit 2'an skulle kunna förse alla LED's på kortet med ström nog men i noten i databladet så ska man inte överskrida 25mA när man matar från programmeraren utan extern supply.
Nu vet jag inte vilka LED'ar som sitter på kortet men visst brukar det ligga kring 20 mA per LED?
Nåja, nu har jag dom "rinnande" och fungerar utmärkt.
> ...men visst brukar det ligga kring 20 mA per LED?
Det beror ju fullständigt på hur det är kopplat!
Om du kollar på schemat för kortet (finns i "Low Pin Count Demo Board
User’s Guide") så ser du att det är 470 ohm i serie med varje motstånd.
En röd LED har väl ca 2V framspänningsfall och det är 5V matningsspänning.
(5-2)V / 470 ohm ger ca 6 mA per LED. Fullt tillräckligt för att synas.
Bara för skoj skull, prova att lägga en "Delay_ms(1);" mellan varje "PORTC.RC0 = ...".
Dina symtom låter som typiska RMW problem. Eller prova med:
Otroligt snällt att du tar dig tid. Det där med att en röd LED hade ca 2V framspänningsfall hade jag inte en aning om men då har man lärt sig något nytt!
Hoppas jag förstod vad du menade i första förslaget. Så här provade jag:
Detta gjorde att RC0 blinkar till så snabbt så man knappt kan uppfatta det och RC1 & 2 blinkar som dom ska.
I ditt andra förslag att sätta alla PORTC till 255 så fungerar det utmärkt men för skoj skull så ändrade jag 255 till 1 och det resulterade i att enbart RC0 blinkar som det ska och RC1 & 2 är släckta.
Går det dra någon bra slutsats av detta?
Läste lite om RMW och jag förstår att du misstänker detta... Vet inte om jag söker efter rätt sak men jag verkar inte ha något LATx register i PIC16F690. Har sökt i databladet och kollat bland registren. Letar jag efter fel sak?
Notera att du alltså får detta om de analoga funktionerna inte är avslagna.
Jag vet vad det är för fel, det är bara slarvig kontrol av koden.
Kolla igen så hittar du det säkert, det är ganska uppenbart
om man bara tittar på rätt ställe...
ANSEL.B4 = 0; // Define PORT RC0 as digital (non-analog)
ANSEL.B5 = 0; // Define PORT RC1 as digital (non-analog)
ANSEL.B6 = 0; // Define PORT RC2 as digital (non-analog)
Detta gjorde susen och nu fungerar allt som det ska. Tack sodjan.
Jag var inne lite på det i början men du/ni kanske kan rätta mig om jag tänker fel här:
Min tanke var att på grund av att jag inte har något direkt projekt utan mest lekande med utvecklingsplattan så var planen att gå igenom pinne efter pinne och labba med dom olika funktionera, därmed också aktivera/deaktivera (säger man så?) dom olika registren.
Till slut borde jag få en lista med dom vanligaste pin-konfigurationerna med kommentarer som jag sedan lite lättare kan modifiera inför projekt.
Självklart falerar hela idén med slarv som tidigare men jag får hoppas att man lär sig av misstagen...
Låter det tokigt? Arbetar ni efter någon speciell metod eller är det projekt för projekt?