회원가입 ID/PW 찾기

마이크로프로세서 HOTpwm 출력

바다새2010.03.24 13:3503.24조회 수 2095댓글 6이 게시물을

AA

portb로 8port 전부 pwm 출력을 하고자 하는데 뭐가 틀렸는지 모르겠습니다.

아래 소스는 본 홈페이지 어느 분이 짜신건데 제가 활용해봤습니다.

죄송합니다. 뭔가 수고비를 바라신다면 댓가를 지불할 의향도 있습니다.

한번 봐주세요. 저 왕초보입니다. 죽겠습니다...ㅠㅠ

개발 환경은 AVR Studio Atmega128 GCC입니다.

#include<avr/io.h>
#include<avr/interrupt.h>

int int_cmd;

void PORT_init(void)
{
  DDRB=0xFF;
  PORTB=0xFF;
}

SIGNAL(TIMER0_COMP_vect)
{
 int_cmd++;
 if(int_cmd>>250){
   //int_cmd=0;
   PORTB=0x00;
   }
  else if(int_cmd>>500){
   PORTB=0xFF;
   int_cmd=0;
   }
}

void PWM_init(void)
{
  TCCR3A = 0x22;                                // Fast PWM mode(14), output OC3B
  TCCR3B = 0x19;                                // Fpwm = 16MHz/1/(1+1599) = 10kHz
  TCCR3C = 0x00;
  ICR3H = (1599 >> 8);
  ICR3L = 1599 & 0xFF;
  OCR3BH = 0x00;
  OCR3BL = 0x00;
  TCNT3H = 0x00;
  TCNT3L = 0x00;


  sei();

}
int main(void)
{
  PORT_init();
  PWM_init();
 
  while(1){  

   }
}

 

댓글 6
  • 음 세세히 안봐서 자세한건 모르겠고.. 인터럽트 구문에서 비교하는게 이상해요.
    >> 이거 쉬프트 연산자니까 틀렸고..
    순서가 int_cmd가 0부터 증가한다고 하면 만족하는게 없습니다.
    즉, int_cmd 가 100까지는 0이고 200까지는 1로 하고 싶다면

    if(int_cmd<100)
    {
       PORTB=0x00;
    }
    else
    {
       PORTB=0xFF;
    }

    int_cmd++;
    if ( int_cmd > 200 ) int_cmd = 0 ;

    이렇게 하면 되구요.

    int int_cmd;
    전역 변수가 초기화 되는걸로 아는데.. 혹시 모르니 int int_cmd = 0 ;
    하세요.

    그냥 문법상 틀려서 지적해 봅니다.

    안되면 세세히봐야 겠네요. ^^

  • No Profile
    글쓴이 바다새 10.03.24 15:51 댓글 좋아요 0 싫어요 0

    안되네요...이 프로그램 PORTB로 8포트 전부 PWM 출력 되는거 맞나요???ㅠㅠ

  • 음.. 좀더 보니.. 여러 프로그램 같다 붙이신거 같네요 ^.^;;

    걍  pwm 처럼 파형 나오는것만 원하신다면 저녁에 하나 짜드릴께요. 새벽쯤? ^.^

    TCCR3A = 0x22;                                // Fast PWM mode(14), output OC3B
      TCCR3B = 0x19;                                // Fpwm = 16MHz/1/(1+1599) = 10kHz

    이게 맞다면 output OC3B 에 pwm 출력하는 프로그램 입니다.
    SIGNAL(TIMER0_COMP_vect)
    이렇게 해서 쓰시길 원한다면 타이머 오버플로 인터럽트로 기준 시간 만들어서 하면 pwm 비슷하게 구현 가능합니다.

  • 대충 아래와 같아요. 전 코드비전 쓰니까 인터럽트 쪽만 "ISR(TIMER0_OVF_vect)" 으로 바꾸면 될듯 하네요.
    음 확인은 안해봤지만 개념은 아래와 같아요. 대충 했기에 정확하진 않지만요.
    그리고 8포트 전부 PWM 기능 없습니다. 수동으로 만들어야 해요. 마이컴 내부 pwm 을 사용하고 싶다면
    레지스터 설정만 해 주면 거기에 해당하는 포트들만 가능합니다.
    수고하세요.


    // Timer 0 overflow interrupt service routine

    // 7.813Khz 이니까 TCNT0 하나당 1/7813 s 가 됩니다.
    // 그리고 업카운터니까 256-100 을 하면 100번 카운터 된다음 인터럽트가 걸립니다.
    // 따라서 인터럽트에 들어갈때의 시간은 1/7813*100 = 0.01279918 s 가 됩니다.

    // 그리고 20Hz 의 파형을 만들고 싶다면 0.025s(high) , 0.025s(low) 이니까
    // 아래와 같습니다.

    unsigned int count = 0 ;
    char flag = 0 ;

    interrupt [TIM0_OVF] void timer0_ovf_isr(void)
    {
        TCNT0=256-100;
       
        count++ ;
       
        if ( count >= 2 )       // 0.025s (약)
        {
            count = 0 ;
           
            if ( flag ) flag = 0 ;
            else flag = 1 ;
        }
       
        if ( flag )
        {
            PORTB = 0xFF ;
        }
        else
        {
            PORTB = 0x00 ;
        }
        
    }


    void Init ()
    {
        // Timer/Counter 0 initialization
        // Clock source: System Clock
        // Clock value: 7.813 kHz
        // Mode: Normal top=FFh
        // OC0 output: Disconnected
        ASSR=0x00;
        TCCR0=0x07;
        TCNT0=256-100;            
        OCR0=0x00;
    }

  • No Profile
    글쓴이 바다새 10.03.25 09:06 댓글 좋아요 0 싫어요 0

    감사합니다.(__) 그런데 잘 안되네요...에혀...죽겠다...ㅠㅠ 아예 avr studio에서 어떻게 코드를 적어야 되는지 full로 적어 주셔요...저 한개도 몰라요...휴...죄송합니다...(__)

  • No Profile
    이런 말 하기는 좀 그렇네요 pwn파형은 시간당 얼마나 전압은 보내냐가 아닙니까?
    위와 같은 방법도 있겠지만 다른 방법으로 생각하면 디렐이 함수을 사용하여 그 파형을 만들어 내면 되지 않겠습니까?

하드웨어 설계 및 개발에 대하여 개발자들이 자유롭게 토론하는 공간입니다.
- Q&A, 자유주재 토론, 관련 정보 공유
- 분야 : 마이크로프로세서 응용, 전기/전자(아날로그/디지털) 회로 설계, C/C++ 프로그래밍, 펌웨어,
         PCB Artwork, 트러블슈팅 등 하드웨어 설계에 관한 전반인 내용
※ 게시글에 맞는 분류를 선택하여 글을 작성해 주시면 쾌적한 사이트 운영에 많은 도움이 됩니다.
※ 하드웨어 인사이트는 회원들간의 거래정보를 게재할 뿐이지, 그 어떤 책임과 의무도 가지지 않습니다.

search
번호 분류 제목 글쓴이 조회 수 날짜
408 마이크로프로세서 HOT아트메가128를 이용한 도트매트릭스6 걍봐줭 2081 2010.03.27
마이크로프로세서 HOTpwm 출력6 바다새 2095 2010.03.24
406 마이크로프로세서 HOT안녕하세요. 8051자료 구할 수 있는 방법에 대해(- -) (_ _)4 카일 1015 2010.03.22
405 마이크로프로세서 HOTavr atmega128 공부중인데요10 짱백 1155 2010.03.20
404 마이크로프로세서 HOTDAC0800을 사용해 0~5V의 아날로그값을 얻고싶습니다. 조언구합니다. 어쩌라고 3636 2010.03.20
403 마이크로프로세서 HOTlcd 출력 소스 만들었는데 출력이 않됩니다. 가르쳐 주세요 Adelposs 1330 2010.03.20
402 마이크로프로세서 HOTAVR ADC에서 AREF에 1K옴이 걸려 있는 데, 시스템이 죽는 현상 밥풀꽃 1836 2010.03.17
401 마이크로프로세서 HOTWIN AVR GCC 사용자입니다. 밥풀꽃 877 2010.03.17
400 마이크로프로세서 HOT비트제어 방법3 소스리 1697 2010.03.17
399 마이크로프로세서 HOTAVR 2560 /2561/ AVR 128 차이가??3 용파링 1831 2010.03.16
398 마이크로프로세서 HOTAVR 컴파일러 어떤것을 많이 쓰세요?4 바우 1239 2010.03.13
397 마이크로프로세서 HOT랩뷰 또는 vhdl로도 AVR의 제어가 가능한지요?2 snowke 1836 2010.03.12
396 마이크로프로세서 HOTavr 처음 시작하려고 하는데요~6 건버람 929 2010.03.11
395 마이크로프로세서 HOT제가 atmega128로 처음 시작하는데요.11 라인만들어보자 1413 2010.03.10
394 마이크로프로세서 HOTKeil compiler 파인 윤 6918 2010.03.08
393 마이크로프로세서 HOTATmega칩 중에서-1 Hiee 1231 2010.03.07
392 마이크로프로세서 HOTRGB Interface TFT-LCD 사용법1 Lowell 3519 2010.03.05
391 마이크로프로세서 HOTATmega32로 시작합니다.1 colin 1507 2010.03.03
390 마이크로프로세서 HOTatmega128, 65325이상 카운트하는 방법좀 알려주십시요.1 겸이 952 2010.03.03
389 마이크로프로세서 HOTAVR 컴파일러가 많은데.. 다 쓰는 방식이 틀린가요??5 남보살 1280 2010.03.02
Prev 1 ... 25 26 27 28 29 30 31 32 33 34 ... 50 Next
  • 절제는 모든 미덕의 진주고리를 이어주는 비단의 실이다.
    - 홀
  • * 납포인트 정보 *
  • 글 작성 : 3
  • 댓글 작성 : 1
  • 내 글이 추천받음 : 1
저작권법에 위배되는 콘텐츠는 등록 불가하며, 저작물에 대한 권리는 저작자에게 있습니다.
Copyright 2006-2021 © hardwareis.com, All rights reserved.