搜索
bottom↓
回复: 34

别说ATMEGA16移植UCOS没有意义,看我的作品。--缺电路图不能置酷

[复制链接]

出0入0汤圆

发表于 2009-3-14 09:56:06 | 显示全部楼层 |阅读模式
以下蓝色文字由站长:armok 于:2009-03-15,08:36:10 加入。
贴子很好,但需要补充一些材料才能置成酷贴
谢谢你的共享。只是一堆源代码,没有电路图会大幅降低帖子的交流效果。
请将电路图也上传上来,这样本贴就能置COOL,会有更多的人关注,并且能获得本论坛的专家分数(迟些会实施)
你可以编辑本贴上传电路图,或在后面的回复里上传。谢谢对我们网站的支持。



/*这是本人设计的收音机的程序,实际使用效果良好,有时钟,闹钟,红外遥控,频率显示存储功能
用万能板搭的电路,没有画电路图呢,就暂不提供了。关键元件如下:
1602液晶显示屏,TEA5767 FM收音机芯片,ATMEGA16,32768HZ晶振。
CPU时钟1000000HZ
ICCAVR环境编译后占用13K空间,源代码如下:
*/
/*
*************************************************************************************************************
*                                                uC/OS-II
*                                          The Real-Time Kernel
*
*                                         ATmega128  Sample code
*
* File : APP.C
* By   : Jean J. Labrosse
*************************************************************************************************************
*/

#include  "includes.h"

/*
**************************************************************************************************************
*                                               CONSTANTS
*
* Note(s) : 1) See OS_CFG.H for the default stack size: 'OS_TASK_STK_SIZE'
**************************************************************************************************************
*/

#define  CPU_CLK_FREQ                  1000000L

#define  OS_TASK_0_STK_SIZE            OS_TASK_STK_SIZE
#define  OS_TASK_0_HARD_STK_SIZE       OS_TASK_HARD_STK_SIZE

#define  OS_TASK_1_STK_SIZE            OS_TASK_STK_SIZE
#define  OS_TASK_1_HARD_STK_SIZE       OS_TASK_HARD_STK_SIZE

#define light                  PORTDBIT.bit3                   //LCD backlight
#define power                  PORTDBIT.bit4                   //power

/*
**************************************************************************************************************
*                                               VARIABLES
**************************************************************************************************************
*/

OS_STK  AppTask0Stk[OS_TASK_0_STK_SIZE];
OS_STK  AppTask1Stk[OS_TASK_1_STK_SIZE];
OS_EVENT *CMDMbox;
unsigned char menu, second_tick;

const char station[][5] = {
0x29,0x59,0xF8,0x56,0x80,                //power off
0x2B,0x80,0xF8,0x16,0x80,                //campus band low limit,76MHZ
0x33,0x9B,0xF8,0x16,0x80,                //campus band up limit,91MHZ
0x29,0xD4,0xF8,0x16,0x80,                //china band low limit,87.5MHZ
0x33,0x9B,0xF8,0x16,0x80,                //china band up limit,108MHZ
0x2A,0x11,0xF8,0x16,0x80,                //88MHZ
0x2A,0x8A,0xF8,0x16,0x80,                //89MHZ
0x2B,0x05,0xF8,0x16,0x80,                //90MHZ
0x2F,0xCA,0xF8,0x16,0x80};                //100MHZ

/*
**************************************************************************************************************
*                                           FUNCTION PROTOTYPES
**************************************************************************************************************
*/
      
static void  AppTaskCreate(void);
static void  AppTask0(void *);
static void  AppTask1(void *);
static void  AppIOInit(void);

/*
**************************************************************************************************************
*                                                MAIN
*
* Note(s): 1) You SHOULD use OS_TASK_STK_SIZE (see OS_CFG.H) when setting OSTaskStkSize prior to calling
*             OSInit() because OS_TASK_IDLE_STK_SIZE and OS_TASK_STAT_STK_SIZE are set to this value in
*             OS_CFG.H.
**************************************************************************************************************
*/

void  main (void)
{
    /*---- Any initialization code prior to calling OSInit() goes HERE --------------------------------*/

                                                /* IMPORTANT: MUST be setup before calling 'OSInit()'  */
    OSTaskStkSize     = OS_TASK_STK_SIZE;       /* Setup the default stack size                        */
    OSTaskHardStkSize = OS_TASK_HARD_STK_SIZE;  /* Setup the default hardware stack size               */

    OSInit();                                   /* Initialize "uC/OS-II, The Real-Time Kernel"         */

    /*---- Any initialization code before starting multitasking ---------------------------------------*/

    OSTickISR_Init();                            // Initialize the ticker
        AppIOInit();                                 /* Initialize the I/Os                                */
        Init_LCD();
        LCD_WriteControl(LCD_CLEAR);
        LCD_Cursor(1,1);
        LCD_DisplayString("Welcome enjoy it");
        delay_ms(2000);
        light = 0;
        menu = 0;
        menu9(0);
        CMDMbox = OSMboxCreate((void*)0);
        AppTaskCreate();

    /*---- Create any other task you want before we start multitasking --------------------------------*/

    OSStart();                                  /* Start multitasking (i.e. give control to uC/OS-II)  */
}

/*
*********************************************************************************************************
*                                    CREATE APPLICATION TASKS
*
* Description : This function creates the application tasks.
*
* Arguments   : p_arg   is the argument passed to 'AppStartTask()' by 'OSTaskCreate()'.
*
* Notes       : 1) The first line of code is used to prevent a compiler warning because 'p_arg' is not
*                  used.  The compiler should not generate any code for this statement.
*********************************************************************************************************
*/

static  void  AppTaskCreate (void)
{
    /*---- Task initialization code goes HERE! --------------------------------------------------------*/
    OSTaskStkSize     = OS_TASK_0_STK_SIZE;        /* Setup the default stack size                     */
    OSTaskHardStkSize = OS_TASK_0_HARD_STK_SIZE;   /* Setup the default hardware stack size            */
    OSTaskCreate(AppTask0, (void *)0, (OS_STK *)&AppTask0Stk[OSTaskStkSize - 1], 0);

    /*---- Task initialization code goes HERE! --------------------------------------------------------*/
    OSTaskStkSize     = OS_TASK_1_STK_SIZE;        /* Setup the default stack size                     */
    OSTaskHardStkSize = OS_TASK_1_HARD_STK_SIZE;   /* Setup the default hardware stack size            */
    OSTaskCreate(AppTask1, (void *)0, (OS_STK *)&AppTask1Stk[OSTaskStkSize - 1], 1);
}

/*
*********************************************************************************************************
*                                              TASK #0
*********************************************************************************************************
*/

static void  AppTask0(void *p_arg)
{
    unsigned char *cmd;
        p_arg = p_arg;                               /* Prevent compiler warnings                          */
        while (TRUE) {
    #if OS_CRITICAL_METHOD == 3                   //Allocate storage for CPU status register
    OS_CPU_SR  cpu_sr;
    #endif
        //OS_ENTER_CRITICAL();
        cmd = (INT8U*)OSMboxAccept(CMDMbox);
        if(cmd){
          if(*cmd==1)
          key_control(*(cmd+1));
          else if(*cmd==2)
          ir_control(*(cmd+1));
          }
        dis_time();
    //OS_EXIT_CRITICAL();
        OSTaskSuspend(OS_PRIO_SELF);
        //OSTimeDly(OS_TICKS_PER_SEC/2);
    }
}

/*
*********************************************************************************************************
*                                              TASK #1
*********************************************************************************************************
*/

static void  AppTask1(void *p_arg)
{
        unsigned char n, light_timer, cmd[2]={0,0};
        p_arg = p_arg;
        light_timer = 10;
        while (TRUE) {
    #if OS_CRITICAL_METHOD == 3                 //Allocate storage for CPU status register
    OS_CPU_SR  cpu_sr;
    #endif
        //OS_ENTER_CRITICAL();
        cmd[1] = press_key();
        if(cmd[1]){
          cmd[0] = 1;                          //identify key input
          light = 0;
          light_timer = 10;
          OSMboxPost(CMDMbox,(void*)cmd);
          OSTaskResume(0);
          }
        n=20;
        while(n--){          //when no control, active task0 per tick
          cmd[1] = IR_cmd();
          if(cmd[1]){
            cmd[0] = 2;                           //identify infrared
                light = 0;
                light_timer = 10;
                OSMboxPost(CMDMbox,(void*)cmd);
                OSTaskResume(0);
                }
          }
        time:
        while(second_tick){
          if(light_timer)
          light_timer--;
          else
          light = 1;
          second_tick--;
          clock();
          if(!second)
          alarm();
          OSTaskResume(0);
          }
        //OS_EXIT_CRITICAL();
    }
}

/*
*********************************************************************************************************
*                                            SETUP THE I/Os
*********************************************************************************************************
*/

static void AppIOInit (void)
{
PORTA = 0x00;
DDRA  = 0x00;
PORTB = 0x07;                //按钮三个
DDRB  = 0x00;
PORTC = 0x00;                 //m103 output only
DDRC  = 0x03;                //LCD RW RS
PORTD = 0x00;
DDRD  = 0x98;                //LCE EN,LCD light,power
light = 1;                        //LCD 背光
power = 1;
}

/*
*********************************************************************************************************
*                                        SETUP THE TICK RATE
*********************************************************************************************************
*/

//TIMER2 initialize - prescale:128
//TIMER2 CLOCK: 32768HZ
// WGM: Normal
// desired value: 1Hz
// actual value: 1.000Hz (0.0%)
void OSTickISR_Init(void)
{
TCCR2 = 0x00; //stop
ASSR  = 0x08; //set async mode
TCCR2 = 0x05; //start
TIMSK = 0x40;
}

void  OSTickISR_Handler (void)
{
    //TCNT2 = 256 - (CPU_CLK_FREQ / OS_TICKS_PER_SEC / 256);
        //light ^= 1;
        second_tick++;
    OSTimeTick();
}

出0入0汤圆

发表于 2009-3-14 10:14:52 | 显示全部楼层
沙发

出0入0汤圆

发表于 2009-3-14 10:28:21 | 显示全部楼层
能不能把原理图也贴上。

出0入0汤圆

发表于 2009-3-14 23:41:00 | 显示全部楼层
这个可以移植到Proteus去 楼上的楼上是高手 高抬一下贵手 辛苦一下哦?

出0入0汤圆

发表于 2009-3-15 08:26:11 | 显示全部楼层
有存台功能?(废话了貌似)
能修改名字为台的真实名字吗(比如101.1mhz标注成XX音乐台),感觉这个好像也能做到。
。。。。别的想不出来了。
楼主能传几张照片也好,万能板看到个布局,自己也好下手啦。器件蛮好买的说

出0入0汤圆

发表于 2009-3-15 08:27:59 | 显示全部楼层
好贴,留名,有空把俺的山寨收音机改改

出0入0汤圆

发表于 2009-3-15 08:48:13 | 显示全部楼层
不清楚能不能将不同的任务放在不同的c文中??有没有OS高手能提供一个几个按键分别控制不同LED亮灭,每个LED亮灭分别用一个任务,每个任务放在不同C文件中的例子,也让我们想入OS门的人学习学习

出0入0汤圆

发表于 2009-3-15 09:05:29 | 显示全部楼层
ICCAVR,我的喜欢,搬个小板凳来学习!

出0入0汤圆

 楼主| 发表于 2009-3-21 11:25:00 | 显示全部楼层
电路板图传上来
(原文件名:DSCN7361a.JPG)

出0入0汤圆

发表于 2009-3-21 12:58:22 | 显示全部楼层
不错,楼主辛苦

出0入0汤圆

发表于 2009-3-21 13:23:55 | 显示全部楼层
学习

出0入0汤圆

发表于 2009-3-21 17:38:51 | 显示全部楼层
学习

出0入0汤圆

发表于 2009-3-21 18:50:47 | 显示全部楼层
资源少的MCU偶用自己DIY的RTOS足够了

出0入0汤圆

 楼主| 发表于 2009-3-21 23:05:12 | 显示全部楼层
//以下代码是用32768HZ晶振来标定AVR内部RC振荡器频率的以保证红外信号的接收效果的
//static void fre_cal(void)函数插入MAIN()函数适当位置即可。
//TIMER2 initialize - prescale:8
//Ò첽ʱÖÓƵÂÊ32768HZ
//WGM: Normal
//desired value: 16Hz
//actual value: 16.000Hz (0.0%)
void timer2_init(void)//CPUʱÖÓƵÂÊУ׼»ù×¼Ô´
{
  TCCR2 = 0x00; //stop
  ASSR  = 0x08; //set async mode
  TCNT2 = 0x00; //setup
  OCR2  = 0xFF;
  TCCR2 = 0x02; //start
  TIMSK = 0x80;
}

#pragma interrupt_handler timer2_comp_isr:4
void timer2_comp_isr(void)
{
//compare occured TCNT2=OCR2
second_tick++;
}

static void fre_cal(void)//CPUʱÖÓƵÂÊУ׼º¯Êý
{
  unsigned int frequence=0;                //cpu clock frequence=frequence*160
  unsigned char num;
  OSCCAL = 0x9A;        //CPUʱÖÓƵÂÊУ׼³õÖµ£¬Ð¾Æ¬³ö³§Ê±É趨
  timer2_init();
  asm("sei");
  start:
  frequence = 0;
  second_tick = 0;
  TCNT2 = 200;
  while(second_tick==0);
  while(second_tick==1){//10 clock per loop
    frequence++;
        asm("nop");
        asm("nop");
        asm("nop");
        }
  if(frequence<6240){
    OSCCAL++;
    goto start;
        }
  else if(frequence>6260){
    OSCCAL--;
        goto start;
        }
  asm("cli");
}

出0入0汤圆

发表于 2009-3-21 23:47:08 | 显示全部楼层
楼主能把整个工程弄个压缩包传上来吗?
谢谢啦.

出0入0汤圆

发表于 2009-3-26 23:17:26 | 显示全部楼层
mark!!!!!!!!

出0入0汤圆

发表于 2009-3-30 07:43:34 | 显示全部楼层
不知道INCLUDE什么东西,打个包个工程上来让我们这种初学者学习学习。

出0入0汤圆

发表于 2009-6-12 01:24:44 | 显示全部楼层
收下

出0入0汤圆

发表于 2009-6-12 08:43:12 | 显示全部楼层
怎么移植的范例中都没有“往EEPROM中存参数”的呢?

出0入0汤圆

发表于 2009-12-4 13:04:43 | 显示全部楼层
学习了

出0入0汤圆

发表于 2009-12-4 17:09:42 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-12-11 17:29:48 | 显示全部楼层
mark!

出0入0汤圆

发表于 2010-6-12 16:32:10 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-7-30 19:59:46 | 显示全部楼层
如果要显示电台的名字等信息,那就要使用支持RDS(Radio Data System)的收音机模块,不过中国国内好象只有佛山是实验RDS电台,其他地方好象不多或者还没有哦。
现在学习uCOS的特别热,而且现在的应用一般会有显示,还有其他的很多功能,我们可以讨论出一个比较典型的框架,既方便自己又方便大家

出0入0汤圆

发表于 2010-7-31 13:04:02 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-7-31 15:26:07 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-8-19 11:16:57 | 显示全部楼层
楼主将工程打个包共享一下,行不行啊。。。谢谢了

出0入0汤圆

发表于 2010-11-30 21:01:57 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-11-30 22:32:36 | 显示全部楼层
太不给力啦。
也许是我技术有限。
这程序好难懂哦。

出0入0汤圆

发表于 2010-11-30 23:26:18 | 显示全部楼层
mark~~

出0入0汤圆

发表于 2010-12-2 08:48:19 | 显示全部楼层
mark!

出0入0汤圆

发表于 2011-1-6 15:22:55 | 显示全部楼层
水平太低了
看不懂啊

出10入12汤圆

发表于 2011-1-6 20:42:00 | 显示全部楼层
y给力

出0入0汤圆

发表于 2011-1-8 16:53:37 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-7-10 11:24:07 | 显示全部楼层
下载下 看看
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-29 12:14

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表