CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to CCS Technical Support

Malfunctions in PIC10F322

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
amarquez



Joined: 24 Jun 2009
Posts: 11

View user's profile Send private message

Malfunctions in PIC10F322
PostPosted: Thu Jul 19, 2012 2:18 am     Reply with quote

Hello everyone!

I am using the PIC10F322, and compiler version is 4.135.

I have to generate a PWM, but has not implemented the hardware driver for PWM. So, I tried to generate PWM with timer, and I checked the timer1, timer0 and WDT don't work.

Can anyone help me?
SherpaDoug



Joined: 07 Sep 2003
Posts: 1640
Location: Cape Cod Mass USA

View user's profile Send private message

PostPosted: Thu Jul 19, 2012 6:34 am     Reply with quote

Give us a small example of what you have tried. Make it a short complete compilable program. Tell us what you expect it to do and what it actually does.
_________________
The search for better is endless. Instead simply find very good and get the job done.
amarquez



Joined: 24 Jun 2009
Posts: 11

View user's profile Send private message

PostPosted: Thu Jul 19, 2012 6:59 am     Reply with quote

The hardware PWM is not implemented for the PIC10F322.
I'm trying to generate PWM with timer2, I checked out PIN_A1, and no answer.

Code:

#include <10F322.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES INTRC                    //Internal RC Osc
#FUSES NOBROWNOUT               //No brownout reset
#FUSES WDT_SW                 //Watch Dog Timer, software
#FUSES NOMCLR                   //Master Clear pin used for I/O
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES PUT

#use delay(int=8000000)

int16 cont=0;
int16 freq=10;    // PWM freq
int16 width=5; //  PWM width

#INT_TIMER2
void  TIMER2_isr(void) {

   contador++;
      if (cont<=width){
          output_high(PIN_A1); // DT 
      }else{
          output_low(PIN_A1);
      }
      if (cont==freq)  {
          cont=0;     
      }
}

//!#INT_TIMER0
//!void  TIMER0_isr(void) {
//!  output_low(PIN_A2);
//!}

void main() {

//!   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_64|RTCC_8_bit);      //3.2 ms overflow
   setup_timer_2(T2_DIV_BY_16,19,16);      //64.0 us overflow, 1.0 ms interrupt
//!   enable_interrupts(INT_TIMER0);
   enable_interrupts(INT_TIMER2);
   enable_interrupts(GLOBAL);
   
   set_tris_a(0b1001);

   output_high(PIN_A2);
   while(TRUE){

     
   }
}
gpsmikey



Joined: 16 Nov 2010
Posts: 588
Location: Kirkland, WA

View user's profile Send private message

PostPosted: Thu Jul 19, 2012 7:09 am     Reply with quote

Maybe I'm still asleep (entirely possible), but where does "cont" get incremented ?

mikey
_________________
mikey
-- you can't have too many gadgets or too much disk space !
old engineering saying: 1+1 = 3 for sufficiently large values of 1 or small values of 3
Ttelmah



Joined: 11 Mar 2010
Posts: 19539

View user's profile Send private message

PostPosted: Thu Jul 19, 2012 7:44 am     Reply with quote

First thing, post code that you are actually trying. What you have posted, won't compile (contador is not declared anywhere to start).

Second, you talk about trying timer1. The chip does not _have_ a timer1....

Then your calculation for the timer2 period is 'wrong'.
You have:

Master clock/4/16/20/16 = 390.625Hz interrupt.

To get 1mSec, you need master clock/8000. Given the fixed/4 division, you need something like:

setup_timer_2(T2_DIV_BY_1,199,10);

Then, prove you can access the pin. Toggle it high and low, without using the interrupt at all. On this pin, the NCO module, and the clock reference output, both have higher priority than basic 'port data'. You need to ensure these are off, before you can access the pin.

Best Wishes
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Thu Jul 19, 2012 5:32 pm     Reply with quote

Here's a PWM program that you can try. I don't have a 10F320 or a
10F322, so it's not tested. You should see a signal on pin A0. If it doesn't
work, you'll have to wait until I can get one of those PICs to test.
I used vs. 4.135 to develop this code.
Code:

#include <10F322.H>
#fuses INTRC,NOWDT,BROWNOUT,PUT,NOMCLR
#use delay(clock=4M)

#define PWM1_PIN  PIN_A0
#define PWM2_PIN  PIN_A1

#define PWM_ENABLED      0x80
#define PWM_DISABLED     0
#define PWM_OUTPUT       0x40
#define PWM_ACTIVE_LOW   0x10
#define PWM_ACTIVE_HIGH  0

#byte TMR2    = 0x11
#byte PR2     = 0x12
#byte T2CON   = 0x13
#byte PWM1DCL = 0x14
#byte PWM1DC  = 0x15
#byte PWM1CON = 0x16

//----------------------------------------------------
// This macro provides the setup_pwm1() function.
#define setup_pwm1(mode)  \ 
output_low(PWM1_PIN);     \ 
PWM1CON = mode;                   

//----------------------------------------------------
// This macro provides the set_pwm1_duty() function.
#define set_pwm1_duty(duty)      \
if(duty > 255L)                  \
  {PWM1DC = (duty >> 2); PWM1DCL = (duty << 6); } \
else                             \
  {PWM1DC = duty; PWM1DCL = 0;}

//----------------------------------------------------
// This macro replaces the CCS built-in function setup_timer_2():
#define setup_timer_2(t2_mode, t2_period, t2_ps) \
T2CON = (t2_mode | ((t2_ps -1) << 3));  \
PR2 = (t2_period);
 
//=======================================
void main()
{
setup_pwm1(PWM_ENABLED | PWM_OUTPUT | PWM_ACTIVE_HIGH);
setup_timer_2(T2_DIV_BY_1, 249, 1);    // 4 KHz PWM frequency           
set_pwm1_duty(500L);  // 50% duty cycle in 10-bit PWM mode

while(1);
}
amarquez



Joined: 24 Jun 2009
Posts: 11

View user's profile Send private message

PostPosted: Fri Jul 20, 2012 2:32 am     Reply with quote

Thanks for your help,
I checked the PWM. I've tried in the PIC10F32x, and have it working.

I can not change the timer2 frequency to operate between 300Hz and 600Hz.

Could you tell me how to operate the timer2 between 300Hz and 600 Hz?
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Fri Jul 20, 2012 2:49 pm     Reply with quote

Quote:

Could you tell me how to operate the timer2 between 300Hz and 600 Hz?

This thread has links with answers to PWM questions and also a link to the
PWM frequency formula:
http://www.ccsinfo.com/forum/viewtopic.php?t=45968&start=1
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group