Hej! Till att börja med vill jag hälsa dig varmt välkomen till EF!
Vad det gäller mikrokontrollers/mikroprocessorer så finns det flera vägar att gå. Arduino har du redan stött på. Kort beskrivet så är en Arduino en mikrokontroller med lite kringutrustning som gör att det är väldigt enkelt att koppla ihop den med andra enheter såsom temperatursensorer, vinkelgivare, kompasser, tryckgivare, o.s.v. Följande är naturligtvis bara min åsikt: Det som är Arduinons styrka är att det finns väldigt många bibliotek med färdig kod. Det som är dess svaghet är att det finns väldigt många bibliotek med färdig kod. Med det menar jag att om man inte är intresserad av att förstå hur det fungerar på djupet så är en Arduino klockren, även en total nybörjare kan få "det" att fungera (nästan oavsett vad det är) med minimal egen insats. Det är jättebra om man bara vill skapa en funktion, men mindre bra om man faktiskt vill förstå vad det är som händer, varför det händer, och hur mikrokontrollern fungerar internt. Jag har själv aldrig använd en Arduino, så jag kan inte uttala mig om den har några direkta fysiska begränsningar jämfört med en "ren" mikrokontroller typ AVR eller PIC.
Själv föredrar jag PIC. Så länge man gör hyffsat enkla saker så tycker jag att de är lätta att jobba med (jag tror inte att det är svårare med AVR, vissa saker skiljer med i grund och botten är de väldigt jämförbara, väldigt lika). För ett år sedan hade jag t.ex. behov av en enkel frekvensgenerator som skulle ge mig en fyrkantsvåg (väldigt enkel fyrkantsvåg utan några krav alls på stigtider, och med väldigt små krav på frekvensomfång). Det slutade med en liten PIC som jag buffrade utgångarna på (buffring gör att den kan driva mer ström än om man kopplar den direkt). Koden, om man bortser från "standardkoden" som i princip alltid är densamma (också bortsett från själva initieringen där man bestämmer diverse olika parametrar), blev fyra rader lång:
Kod: Markera allt
#define _LEGACY_HEADERS
#include "Pulseout.h"
void main(void)
{
Init();
while(1)
{
}
}
void Init(void)
{
/*Comment out if using simulator, ICD2, or ICE2000*/
#asm
call 0x3FF //Load Factory Calibration Value Into OSCCAL
bsf _STATUS,5 //BANK1
movwf _OSCCAL
#endasm
ANSEL = 0b00010001; // Select AN0
ADCON0 = 0b00000001; //Configure A/D - Select AN0, Left justified & enables A/D
TRISIO = PulseTris; // GPIO 3 output, GPIO 0,1,2,4,5,6,7 inputs
OPTION = TMRPRESCALE; // Timer0 internal clock, Prescaler assigned to WDT
GPIO = Off;
CMCON = 0x07; // //Turn Off Comparator Peripheral
VRCON = CLEAR;
TMR0 = CLEAR; //Clear Timer0
IOCB3 = CLEAR; //GP3 Interrupt On Pin Changed Disabled
T0IE = SET; //Timer0 Overflow Interrupt Enabled
T0IF = CLEAR; //Clear Timer0 Overflow Interrupt Flag
GIE = SET; //Enable All Interrupts
return;
}
void interrupt Isr(void)
{
PULSEOUT = PULSEOUT ^ 1; // Toggle the output.
TMR0 = ADRESH; //Set TMR0 register to the value from the ADC.
T0IF = CLEAR; //Clear Timer0 Interrupt Flag
GODONE = SET; //When ADC > 252, one ADC conversion will be done every other interrupt. This does not matter.
return;
}
1: Växla utgången (om den var hög, gör den låg. Om den var låg, gör den hög)
2: Sätt registret TMR0 till ADC'ns (Analog to Digital Converter) mest signifikanta 8 bitar. TMR0-registret bestämmer hur många "varv" mikrokontrollern ska gå innan det skapas ett interrupt. När ett interrupt skapas går den in i rutinen Isr ovan, den enda rutinen som användes.
3: Sätt interrupt-flaggan för timer 0 till 0. Interrupt-flaggan är den som får manicken att gå till Isr-rutinen, nollas inte denna går den till Isr-rutinen på nästa "varv"
4: Starta en ny ADC-conversation. D.v.s. se till att den läser av det analoga värdet och gör det digitalt.
Alla namn i koden ovan kommer direkt från databladet. D.v.s. t.ex. registret "GODONE" (som sätts till en etta i punkt 4 ovan) är definierade i databladet. Man använder exakt samma namn/benämningar som i databladet. Just detta tycker jag gör det hela ganska enkelt. Det man måste kunna/förstå är grundläggande programmering, och det är en fördel om man kan C-syntax (det går även att programmera i assembler, det är lite av en smaksak. Personligen föredrar jag C, men för applikationen ovan hade assembler varit nästan lika enkelt).
Men kan man inte C-syntax, och inte vill lära sig, så är Arduino att föredra, just eftersom det finns så mycket färdig kod i bibliotek. Om du t.ex. kopplar in en DS1302 (realtidsklocka) till en Arduino så finns det både färdig kod och säkert även färdiga exempel på hur den ska kopplas. Till en PIC/AVR så finns det säkert kod att hitta online, men det brukar kräva att man tänker lite mer själv.
Jag tror att Arduino har vissa begränsningar som inte en ren AVR/PIC har, men jag kan på tok för lite om Arduino för att uttala mig om saken.
Men för att förstå hur en PIC/AVR fungerar på insidan så behöver man i princip bara läsa databladet. ALLT står där, bara man läser noga nog
