16F648A PWM MikroC

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Pajn
Inlägg: 1160
Blev medlem: 6 juni 2008, 19:14:29
Ort: Nyköping
Kontakt:

16F648A PWM MikroC

Inlägg av Pajn »

Tänkte testa detta med pwm lite men det gick sådär :doubt:
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?
Användarvisningsbild
E85
Inlägg: 1274
Blev medlem: 29 maj 2007, 16:24:19
Ort: Övik

Re: 16F648A PWM MikroC

Inlägg av E85 »

Prova ta bort ettan ur dina funktionsanrop (PWM1_Init -> PWM_Init osv) eftersom den som sagt bara har en PWM.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: 16F648A PWM MikroC

Inlägg 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 ?
bos
Inlägg: 2314
Blev medlem: 24 februari 2007, 23:29:15
Kontakt:

Re: 16F648A PWM MikroC

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

Re: 16F648A PWM MikroC

Inlägg 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.
Pajn
Inlägg: 1160
Blev medlem: 6 juni 2008, 19:14:29
Ort: Nyköping
Kontakt:

Re: 16F648A PWM MikroC

Inlägg 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 :evil:

@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?
bos
Inlägg: 2314
Blev medlem: 24 februari 2007, 23:29:15
Kontakt:

Re: 16F648A PWM MikroC

Inlägg av bos »

Titta i databladet, sida 58 och 59, under "9.3.1 PWM Period". Tabell 9-3 är också till hjälp.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: 16F648A PWM MikroC

Inlägg 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.
Pajn
Inlägg: 1160
Blev medlem: 6 juni 2008, 19:14:29
Ort: Nyköping
Kontakt:

Re: 16F648A PWM MikroC

Inlägg 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?
victor_passe
Inlägg: 2436
Blev medlem: 28 januari 2007, 18:45:40
Ort: Kungsbacka

Re: 16F648A PWM MikroC

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

Re: 16F648A PWM MikroC

Inlägg 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...
Pajn
Inlägg: 1160
Blev medlem: 6 juni 2008, 19:14:29
Ort: Nyköping
Kontakt:

Re: 16F648A PWM MikroC

Inlägg 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)?
victor_passe
Inlägg: 2436
Blev medlem: 28 januari 2007, 18:45:40
Ort: Kungsbacka

Re: 16F648A PWM MikroC

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

Re: 16F648A PWM MikroC

Inlägg 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.
Pajn
Inlägg: 1160
Blev medlem: 6 juni 2008, 19:14:29
Ort: Nyköping
Kontakt:

Re: 16F648A PWM MikroC

Inlägg 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.
Skriv svar