Sida 1 av 2
16F648A PWM MikroC
Postat: 13 augusti 2009, 22:41:46
av Pajn
Tänkte testa detta med pwm lite men det gick sådär
Det är koden som kommer från hjälpen (nästan iaf, nu med endast en pwm då 16f648a bara har en pwm)
Kod: Markera allt
unsigned short current_duty, old_duty;
void IO() {
TRISA = 0;
TRISB = 0b00000011;
PORTA = 0;
PORTB = 0;
PWM1_Init(5000);
}
void main() {
CMCON = 0x07;
IO();
current_duty = 16;
PWM1_Start(); // start PWM1
PWM1_Set_Duty(current_duty); // Set current duty for PWM1
while (1) { // endless loop
if (RB0_bit) { // button on RA0 pressed
Delay_ms(40);
current_duty++; // increment current_duty
PWM1_Set_Duty(current_duty);
}
if (RB1_bit) { // button on RA1 pressed
Delay_ms(40);
current_duty--; // decrement current_duty
PWM1_Set_Duty(current_duty);
}
Delay_ms(5); // slow down change pace a little
}
}
och här är problemet
Kod: Markera allt
0 1 mikroCPIC1618.exe -MSF -DBG -pP16F648A -DL -O11111114 -fo4 -N"C:\Users\Pajn\Pic\in out test c\iotc.mcppi" -SP"C:\Program Files (x86)\Mikroelektronika\mikroC PRO for PIC\defs\" -SP"C:\Program Files (x86)\Mikroelektronika\mikroC PRO for PIC\Uses\P16\" -SP"C:\Users\Pajn\Pic\in out test c\" "iotc.c" "__Lib_Math.mcl" "__Lib_MathDouble.mcl" "__Lib_System.mcl" "__Lib_Delays.mcl"
0 125 All files Preprocessed in 15 ms
0 121 Compilation Started iotc.c
8 324 Undeclared identifier 'PWM1_Init' in expression iotc.c
16 324 Undeclared identifier 'PWM1_Start' in expression iotc.c
17 324 Undeclared identifier 'PWM1_Set_Duty' in expression iotc.c
23 324 Undeclared identifier 'PWM1_Set_Duty' in expression iotc.c
29 324 Undeclared identifier 'PWM1_Set_Duty' in expression iotc.c
0 102 Finished (with errors): 13 aug 2009, 21:09:00 iotc.mcppi
Eller har jag missförstått databaldadet/hjälpen? databladet säger
Capture, Compare, PWM module:
- 16-bit Capture/Compare
- 10-bit PWM
och hjälpen säger
Requires: MCU must have CCP module.
CCP borde väl vara = Capture, Compare, PWM?
Re: 16F648A PWM MikroC
Postat: 13 augusti 2009, 23:13:54
av E85
Prova ta bort ettan ur dina funktionsanrop (PWM1_Init -> PWM_Init osv) eftersom den som sagt bara har en PWM.
Re: 16F648A PWM MikroC
Postat: 13 augusti 2009, 23:26:03
av sodjan
Är det av någon speciell anledning som du inte gör som manualen säger ?
Eller är det kanske bara lite RTFM som saknas ?
Re: 16F648A PWM MikroC
Postat: 14 augusti 2009, 09:42:24
av bos
"Undeclared identifier" betyder att kompilatorn inte hittade denna funktion någonstans i de bibliotek som länkats in. Nu använder jag inte MikroC och jag har ingen aning om hur det funkar, men ett tips är att du kollar i manualer om i vilket C-lib dessa funktioner ligger i och hur du ska få dem att länkas in, förslagsvis genom att läsa en (eller fler) header-filer där PWN-funktionerna finns.
Jag ser förresten ingen #include nånstans i din kod, och det verkar dåligt. Någon form av include-filer behöver du nog såvida inte MikroC include:ar allt möjligt själv och på måfå.
Re: 16F648A PWM MikroC
Postat: 14 augusti 2009, 10:09:34
av sodjan
Finns ingen anledning att spekulera.
Kapitlet "PWM Library" säger att PWM rutinerna behöver en
CCP modul med PWM utgångarna på RC1 och RC2, vilket det normalt
är på 28 pinnars och större. 16F648A har dom på RB-någonting.
Som vanligt så är Mikroelektronikas dokumentation inte alls speciellt bra.
Kraven för att använda PWM rutinerna borde vara mycket bättre angivna.
Enklast är att strunta i biblioteksrutinerna ock köra PWM modulen själv
så att man vet vad man gör. Det är ju väldigt enkelt att sätta upp PWM
modulen som man vill ha det. Att bara köra biblioteksrutiner "blint" utan
att vara helt säker på hur de fungerar är att be om problem.
Re: 16F648A PWM MikroC
Postat: 14 augusti 2009, 12:36:15
av Pajn
sodjan skrev:Kapitlet "PWM Library" säger att PWM rutinerna behöver en
CCP modul med PWM utgångarna på RC1 och RC2
Det var inte angivet i help>Help>mikroC PRO for PIC Libraries>PWM Library
@bos det ska inte behövas, antingen känner mikroc av vad som används (man väljer pic och config utanför koden) och inkluderar själv. Men Sodjan hittade felet.
Jag hittade lite asm kod som fungerar perfekt efter en lättare modifiering
Kod: Markera allt
void IO() {
TRISA = 0;
TRISB = 0b00000011;
PORTA = 0;
PORTB = 0;
}
void main() {
CMCON = 0x07;
IO();
asm {
BSF PCON,3// ; clear bit 3 of pcon (OSCF) for 4 kHz operation.
MOVLW 0xFF //;PWM value
MOVWF PR2 //Denna förstår jag inte riktigt men jag tror den väljer pwm modulen, rätt?
MOVLW 230 //; ~10% (låg är aktiv)
MOVWF CCPR1L
//;note, I'm ignoring the duty cycle LSBs at CCP1CON<5:4>
BCF TRISB,3// ;make CCP1 an output
BSF T2CON,2// ;enable timer 2
BSF T2CON,1// ;1:16 prescaler
BSF CCP1CON,3
BSF CCP1CON,2 //;configure CCP1 for PWM
}
}
3 funderingar MOVWF PR2, vad gör denna?
MOVLW 230 //; ~10% (låg är aktiv) Men om jag ändrar till 255 borde lysdioden vara släkt, eller? Den lyser iaf. lite grann
//;note, I'm ignoring the duty cycle LSBs at CCP1CON<5:4> Vad jag förstår av databladet har man CCP1CON<5:4> för att sätta upp pwm, men det är som sagt skippat?
Re: 16F648A PWM MikroC
Postat: 14 augusti 2009, 12:43:08
av bos
Titta i databladet, sida 58 och 59, under "9.3.1 PWM Period". Tabell 9-3 är också till hjälp.
Re: 16F648A PWM MikroC
Postat: 14 augusti 2009, 12:58:01
av sodjan
> MOVWF PR2, vad gör denna?
Vad är det du inte förstår ?
Vad MOVWF i sig gör ? Vad PR2 är ? Eller varför man gör så där just där ?
Det första och andra framgår av databladet och det tredje framgår av sammanhanget (och databladet).
> Denna förstår jag inte riktigt men jag tror den väljer pwm modulen, rätt?
Nej.
> Men om jag ändrar till 255 borde lysdioden vara släkt, eller? Den lyser iaf. lite grann
Kan hänga ihop med din tredje fråga. Eftersom de två lägsta bitarna i duty-cycle
andrig sätts (till t.ex '0') så kan du få en liten rest där. Prova att lägg till
"BCF CCP1CON, CCP1X" och "BCF CCP1CON, CCP1Y" så får du se vad som händer.
Re: 16F648A PWM MikroC
Postat: 14 augusti 2009, 13:33:03
av Pajn
Okej, jag tror att jag börjar förstå nu. Tack för all hjälp.
EDIT: Om jag vill ha fler pwm utgångar, åtta kanske. Finns det då några externa moduler som man kan programmera på ett enkelt sätt?
Re: 16F648A PWM MikroC
Postat: 14 augusti 2009, 14:53:43
av victor_passe
Du kan ha mjukvaru PWM, du får dock inte lika hög frekvens men du kan få många fler kanaler.
Eller så kan man, som du säger köpa färdiga moduler/kretsar som gör jobbet.
Det beror ju på vad målet är.
Re: 16F648A PWM MikroC
Postat: 14 augusti 2009, 14:56:45
av sodjan
Du kan i princip ha lika många PWM "kanaler" som du har I/O pinnar.
Det beror enbart vilka krav du har och vad PWM kanalerna ska driva.
Är det t.ex dimning/styrning av LEDs så finns det ju speciella
kretsar för just det...
Re: 16F648A PWM MikroC
Postat: 14 augusti 2009, 16:24:27
av Pajn
Jag ska ha en styrning för rgb leds vilket är tre kanaler med rätt hög upplösning. Frekvensen på dem borde väl räka om den ligger på 100Hz, lite lägre tom (över 50Hz är det va?) Sen vill jag kunna styra fläktar/dc motorer. Dem behöver ju inte så hög upplösning men jag antar att frekvensen bör vara högre istället.
Det jag inte förstår är att picen skulle ju ha 10bitars upplösning, det borde väl blir 1024 steg? ovan så kan jag ju bara använda 255, åtta bitar (vilket jag tycker är lite för lite vis dimning av lysdioder)?
Re: 16F648A PWM MikroC
Postat: 14 augusti 2009, 16:35:26
av victor_passe
Om du vill ha 3x PWM med 10 bitars upplösning, titta på denna lilla kod:
Kod: Markera allt
unsigned int rgb[3]={500,100,1000}; //Någon fiffig färg
unsigned int pwm_counter=0;
void run_pwm()
{
if(counter<rgb[0]) PORTA.F0=1; else PORTA.F0=0;
if(counter<rgb[1]) PORTA.F1=1; else PORTA.F1=0;
if(counter<rgb[2]) PORTA.F2=1; else PORTA.F2=0;
pwm_counter++;
if(pwm_counter > 1023)pwm_counter=0;
}
rutinen måste köras med samma intervall hela tiden och därför bör man göra så en timer räknar och skapar en interrupt som för denna funktion.
Hoppas du fattar principen, sedan utökar du bara rgb[] "fältet" och kopierar raden:
if(counter<rgb[0]) PORTA.F0=1; else PORTA.F0=0;
Fler gånger.
Och du bör ha ca 100Hz.
lysdioder slocknar ju väldigt snabbt och glödlampor hinner liksom inte slockna när det är låg spänning innan spänningen blir hög.
Re: 16F648A PWM MikroC
Postat: 14 augusti 2009, 16:49:24
av sodjan
> picen skulle ju ha 10 bitars upplösning,
Korrekt.
> ovan så kan jag ju bara använda 255,
För att *den* koden är skriven så ja. Men behöver du 10 bitar
så använder du alla 10 bitarna. Notera dock att det inte går att
köra 10 bitar över hela frekvensområdet, det står i databladet.
Re: 16F648A PWM MikroC
Postat: 14 augusti 2009, 18:36:10
av Pajn
@victor_passe koden får rätt effekt dock går den alldeles för långsamt så jag hinner se blinkningarna. Jag anropade bara run_pwm() i en for(;;) loop utan något annat i koden (init och sånt såklart... men inget annat)
@sodjan var det inte det
MOVLW 0xFF //;PWM value gjorde? enligt databladet kan den då gå i tre olika frekvenser med tre olika prescaler men det var alltid tio bitar. Iof. var den för 20MHz, jag kör 4MHz intern. Aja den ska ändå inte användas så det spelar ingen roll.