klein is fijn.nl
PIC vs AVR
Elke keer als iemand wil beginnen met microcontrollers laait de discussie weer op, wat is het beste?
Ik heb alle verschillen die ik kon bedenken maar eens op een rijtje gezet om mensen een beeld te geven welke controllers handig zijn voor welke dingen.

Als iemand toevoegingen heeft voor dit lijstje en/of fouten ziet dan hoor ik het graag via de email.

PIC AVR
asm instructies PIC's hebben een basisset van ongeveer 33 asm instructies. Door dit kleine aantal is het zeer makkelijk om asm voor PIC's te leren. Binnen een paar uur kan je al werkende programma's schrijven in asm. De instructieset voor AVR's bestaat uit ruim 100 asm instructies. Het is niet makkelijk om te leren en zit hier en daar onlogisch in elkaar.
overige talen Zoals voor iedere microcontroller zijn er meerdere compilers voor meerdere programmeertalen. Het is onmogelijk om alle tools te bespreken, ik hou het even bij de meest gebruikte Basic compilers.

Proton Development suite wordt veel gebruikt om PICbasic te schrijven. Proton heeft een geheel eigen systeem voor signed en unsigned variabelen. Zo missen de long en de int volledig, de enige signed integer is een dword die meteen 4 bytes nodig heeft. De kristalfrequentie moet in het programma opgegeven worden in MHz, en er zijn geen kommagetallen mogelijk.
De prijs van de volledige versie van Proton wisselt een beetje, maar ligt tussen de 150 en 200 euro. De demoversie is beperkt tot 50 regels code.

Een andere basic compiler is Oshonsoft. Dit programma ondersteunt duidelijk minder functies, en de demoversie is gelimiteerd tot 30 keer opstarten. De volledige versie kost echter minder dan 50 euro. Het programma heeft ook een zeer goede simulator aan boord en uitgebreide asm mogelijkheden.

Naast basic compilers zijn er ook C compilers te vinden voor PIC's, bijvoorbeeld SDCC.
De meest gebruikte Basic compiler voor AVR's is Bascom. Bascom heeft een uitgebreide instructieset, veel types variabelen en een logische opbouw van code.
Het programma heeft hier en daar een aantal eigennaardigheden. Om als voorbeeld het rnd(x) (random) commando te nemen: Het getal op de plek van x geeft niet het hoogst gegenereerde getal aan, maar net 1 hoger. Om maximaal 1023 te krijgen moet je 1024 invullen. Deze plus nog een aantal andere vreemde dingen maken Bascom een flinke doordenktaal.
Negatieve getallen op LCD's zetten, meerdere LCD's aan 1 AVR en configuratie van hardware zijn voorbeelden van dingen die weer heel simpel zijn gemaakt in Bascom.
De demoversie van Bascom is beperkt tot 4kB aan gecompileerde code. De volledig versie kost ongeveer 85 euro.

Ook voor AVR's zijn er verschillende C compilers, waaronder AVR-GCC.
programmeren PIC's worden gewoonlijk met een high voltage programmer geprogrammeerd, deze zet 12V op de reset pin. Hierdoor maakt de status van de reset pin niets meer uit, deze kan zonder problemen worden ingesteld als uitgang.
De fuse bits van een PIC worden ingesteld in de software, hetgeen het lastig maakt om een paar fuses te verzetten als je alleen een hex file hebt.
De snelheid van de PIC heeft geen invloed op de programmeersnelheid.
High voltage programmers voor AVR's zijn zeldzaam, daarom zit je meestal met een groot probleem als je perongeluk de reset hebt uitgezet.
De fuses van een AVR worden los van de software ingesteld.
De programmeersnelheid hangt af van de kloksnelheid van de AVR, op lagere frequenties kan dit met grote programma's een behoorlijk lange programmeertijd opleveren.
Goedkope zelfbouw programmers voor AVR's gebruiken vaak de parallelle poort, hetgeen problemem kan geven op oudere computers.
snelheid De meeste PIC's doen 4 klokpulsen over 1 instructie. Er zijn echter PIC's met een interne pll waarmee de klokfrequentie vermenigvuldigd kan worden. AVR's doen 1 clockcycle over 1 instructie, op een aantal branch instructies na.
interne RC oscilator Interne RC oscilators van PIC's zijn behoorlijk nauwkeurig. Genoeg om zonder problemen IR overdracht te kunnen doen zonder timing problemen. Een behoorlijk aantal PIC's mist de interne RC oscilator echter volledig, en bij een groot deel is er maar 1 keuze wat betreft frequentie. Vergeleken bij PIC's zijn ze onnauwkeurig. Alleen te gebruiken in gevallen waar timing niet belangrijk is. Je moet al vrij snel een kristal bij een AVR zetten als je iets met communicatie wilt doen. Wel heeft iedere AVR een RC oscilator aan boord met meestal meerdere keuzes.
I/O's PIC's hebben het beruchte RMW probleem, maar daarnaast hebben ze nog een minpunt. Veel PIC's hebben een aantal IO's die alleen maar kunnen sinken. De PIC18F serie heeft overgens geen last meer van het RMW probleem omdat deze net als AVR's twee verschillende registers heeft voor lees en schijfbewerkingen.

PIC's hebben een logisch TRIS register om pinnen als in- of output in te stellen, 1 in input en 0 is output.
AVR's omzeilen het RMW probleem omdat ze verschillende registers hebben om data naar pinnen te schrijven en om pinnen uit te lezen. Dat levert wel weer op dat je even beter moet opletten tijdens het typen van je code, voordat je het weet probeer je een port register uit te lezen ipv een pin register.

Het Data Direction Register (DDR) van een AVR zit ook onlogisch in elkaar, 1 is output en 0 is input.
ADC's De interne weerstand van de ADC van een PIC levert al vrij snel problemen op, het wordt aangeraden om de impedantie van de spanningsbron die eraan hangt onder de 2.5kΩ te houden. Dit heeft als gevolg dat een 10kΩ potmeter al logaritmische effecten gaat vertonen.
In een PIC staat de ADC standaard aan, als je hem niet wilt gebruiken moet je het ding uitzetten en de desbetreffende ADC registers op 0 zetten. Al deze extra registers geven wat extra foutmogelijkheid tijdens het programmeren.
De ADC van een AVR is traag vergeleken bij een PIC, maar er is wel een interrupt on conversion ready mogelijkheid. Het grootste pluspunt is de ingangsweerstand, die minimaal 50MΩ is. Bij een 1MΩ potmeter als spanningsdeler aan de ADC geeft dit nog geen 2% afwijking op de liniariteit. Nadat de ADC aangezet is hoeft alleen maar de pin als input ingesteld te zijn, de pin input registers en de analoge ingang hangen hard aan elkaar. Beide kunnen dus ook afwisseld uitgelezen worden zonder dat er veranderingen in registers gedaan hoeven te worden.
interrupts Meerdere interrupts in een PIC is lastig. Er is maar 1 interrupt handler, je moet zelf uitzoeken welke interrupt er precies afging. Meerdere interrupts in een AVR is makkelijk omdat iedere interrupt z'n eigen interrupt vector heeft. Als je twee interrupts wilt gebruiken schrijf je ook twee interupt handlers. De volgorde waarop verschillende interrupt afgewerkt worden staat vast.
behuizingen PIC's kunnen heel klein zijn, de 10F2xx serie zit in SOT23-6 behuizing. Als je weinig plek hebt en weinig rekenkracht nodig hebt dan zijn dit soort mini uC's ideaal. Ook AVR's zijn tegenwoordig in SOT23-6 te krijgen, bijvoorbeeld de ATtiny4. Het aantal features wat in de chip zit (ADC, timers, etc) is vergelijkbaar tussen AVR en PIC bij dit type behuizing.
prijs PIC's zijn over het algemeen iets duurder dan soortgelijke AVR's, maar dat hangt ook sterk af van de winkel. Dat neemt niet weg dat de goedkoopste uC's nog steeds PIC's uit de 10F2xx serie zijn, met een prijs van onder 1 euro per stuk. AVR's zijn goedkoper, je krijgt gemiddeld meer voor dezelfde prijs.
Zoals je ziet zijn beide controllers redelijk aan elkaar gewaagd. Wat je ook kiest, de geschreven code heeft vaak een grote impact dan het soort controller. Blijft weg van floating point getallen, doe was leuks met timers en verban de case structuren uit je basic code.