µC för nybörjare

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
sodjan
EF Sponsor
Inlägg: 43249
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: µC för nybörjare

Inlägg av sodjan »

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... :-)
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: µC för nybörjare

Inlägg av Magnus_K »

Det var bra tips!

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

Re: µC för nybörjare

Inlägg av sodjan »

> 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.
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: µC för nybörjare

Inlägg av Magnus_K »

Sånt här tycker vi (jag) om. Tack sodjan!
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: µC för nybörjare

Inlägg av Magnus_K »

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

Re: µC för nybörjare

Inlägg av sodjan »

Kanske att den funktionen byter firmware, vet inte.
Man följ instruktionerna för att ladda om firmware...
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: µC för nybörjare

Inlägg av Magnus_K »

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...

Kod: Markera allt

//*******************************************************//
//  Microcontroller: PIC18F690                           //
//  Program function: Blink LED 1 at power up            //
//  Pin assignment:                                      //
//           RC0 = LED 1                                 //
//                                                       //
//*******************************************************//

void init() {
     TRISC.B0 = 0;         // Define PORT RC0 as output
     TRISC.B1 = 0;         // Define PORT RC1 as output
     TRISC.B2 = 0;         // Define PORT RC2 as output
     ANSEL.B5 = 0;         // Define PORT RC0 as digital (non-analog)
     ANSEL.B6 = 0;         // Define PORT RC1 as digital (non-analog)
     ANSEL.B5 = 0;         // Define PORT RC2 as digital (non-analog)
     CCP1CON = 0;          // Disable Capture/Compare/PWM module
     CM1CON0 = 0;          // Disable comparator 1
     CM2CON0 = 0;          // Disable comparator 2
     PCON.B5 = 0;          // Disable ULPWU (bit 5)
                           // Don't think ICSPDAT needs to be disabled since
                           // "other" conditions will not be met.
}

void main() {
     init();
     while(1){
              PORTC.RC0 = 1;
              PORTC.RC1 = 1;
              PORTC.RC2 = 1;
              Delay_ms(250);
              PORTC.RC0 = 0;
              PORTC.RC1 = 0;
              PORTC.RC2 = 0;
              Delay_ms(250);
     }
}
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: µC för nybörjare

Inlägg av Magnus_K »

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

Re: µC för nybörjare

Inlägg av sodjan »

> ...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:

Kod: Markera allt

...
     while(1){
              PORTC = 255;
              Delay_ms(250);
              PORTC = 0;
              Delay_ms(250);
     }
Det sätter om alla pinnarna samtidigt.
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: µC för nybörjare

Inlägg av Magnus_K »

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:

Kod: Markera allt

void main() {

     init();

     while(1) {

     PORTC.RC0 = 1;
     Delay_ms(1);
     PORTC.RC1 = 1;
     Delay_ms(1);
     PORTC.RC2 = 1;
     
     Delay_ms(250);
     
     PORTC.RC0 = 0;
     Delay_ms(1);
     PORTC.RC1 = 0;
     Delay_ms(1);
     PORTC.RC2 = 0;
     
     Delay_ms(250);

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

Re: µC för nybörjare

Inlägg av sodjan »

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

Re: µC för nybörjare

Inlägg av sodjan »

Kod: Markera allt

     ANSEL.B5 = 0;         // Define PORT RC0 as digital (non-analog)
...
     ANSEL.B5 = 0;         // Define PORT RC2 as digital (non-analog)
*Båda* dessa rader kan inte vara korrekta...
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: µC för nybörjare

Inlägg av Magnus_K »

Usch vad pinsamt.
Har nu lärt mig den hårda vägen att aldrig mer kopiera liknande rader för att vinna tid...

Kod: Markera allt

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

Re: µC för nybörjare

Inlägg av sodjan »

Om du i alla fall inte ska ha några analoga funktioner så är det enklare med:

Kod: Markera allt

ANSEL  = 0;
ANSELH = 0;
Då sätts *alla* pinnar till digital I/O.
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: µC för nybörjare

Inlägg av Magnus_K »

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?
Skriv svar