123
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Модератор форума: nightmare, Huntswarrior, Aleks_Crow 
Форум » Программирование микроконтроллеров AVR, PIC » Учимся программированию микроконтроллеров » Небольшой проектик, индикатор загрузки CPU
Небольшой проектик, индикатор загрузки CPU
Отправлено 14.05.2010 - 19:221
Начальная группа
1798 сообщений
Мужчина
Недавно увидел на ютубе вот это видео:

Захотелось собрать такое, получилось, код для мк:
Code

//Автор nightmare
//Страница индикатора http://cdxp.zx6.ru/viewp.php?id=132
#include <mega16.h>
       
#define RXB8 1
#define TXB8 0
#define UPE 2
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC 7

#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<OVR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)

// USART Receiver buffer
#define RX_BUFFER_SIZE 8
char rx_buffer[RX_BUFFER_SIZE];

#if RX_BUFFER_SIZE<256
unsigned char rx_wr_index,rx_rd_index,rx_counter;
#else
unsigned int rx_wr_index,rx_rd_index,rx_counter;
#endif

// This flag is set on USART Receiver buffer overflow
bit rx_buffer_overflow;

// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSRA;
data=UDR;    
switch(data)
{
    case '1':     
    PORTA = 0b00000001;    
     break;
    case '2':        
    PORTA = 0b00000011;
     break;
    case '3':               
    PORTA = 0b00000111;
     break;
    case '4':               
    PORTA = 0b00001111;
     break;
     case '5':               
    PORTA = 0b00011111;
     break;     
     case '6':               
    PORTA = 0b00111111;
     break;
     case '7':               
    PORTA = 0b01111111;
     break;
     case '8':               
    PORTA = 0b11111111;
     break;
    }
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
      {
      rx_buffer[rx_wr_index]=data;
      if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
      if (++rx_counter == RX_BUFFER_SIZE)
         {
         rx_counter=0;
         rx_buffer_overflow=1;
         };
      };
}

#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter==0);
data=rx_buffer[rx_rd_index];
if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
#asm("cli")
--rx_counter;
#asm("sei")
return data;
}
#pragma used-
#endif

// Standard Input/Output functions
#include <stdio.h>

// Declare your global variables here

void main(void)
{
DDRA=0xFF;

UCSRA=0x00;
UCSRB=0x98;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x03;

ACSR=0x80;
SFIOR=0x00;

#asm("sei")
    putchar('d');
while (1)
         {

         };
}

Схема:

Видео:

* Программа для компа http://cdxp.zx6.ru/s/Indicator.rar
* Фьюзы http://cdxp.zx6.ru/s/fusebits.gif
* Прошивка http://cdxp.zx6.ru/s/cpu.rar
* Даташит на мегу 16 http://datasheet4u.com/download.php?id=219540



Профиль Личное сообщение Дом. страница icq Skype
37
Отправлено 16.05.2010 - 14:222
Начальная группа
1798 сообщений
Мужчина


Прикрепление
2354069.gif(4Kb)
Профиль Личное сообщение Дом. страница icq Skype
37
Форум » Программирование микроконтроллеров AVR, PIC » Учимся программированию микроконтроллеров » Небольшой проектик, индикатор загрузки CPU
Страница 1 из 11
Поиск: