Uart.c
Код: Выделить всё
char uartTxChar;
char uartRxChar;
Код: Выделить всё
extern char uartTxChar;
extern char uartRxChar;
Код: Выделить всё
#include "Uart.h"
//Пользуемся uartTxChar и uartRxChar
Код: Выделить всё
char uartTxChar;
char uartRxChar;
Код: Выделить всё
extern char uartTxChar;
extern char uartRxChar;
Код: Выделить всё
#include "Uart.h"
//Пользуемся uartTxChar и uartRxChar
Воу воу воу, полегче. А как же статический класс с публичным свойством или шаблон "одиночка"? Все они представляют некое глобальное состояние, как и глобальная переменная в Си.ks0 писал(а):В современных языках C# или Java понятия глобальных переменных вообще нет.
Не можно static, а нужно static, это является хорошим тоном, но всё же мы имеем дело с Си, поэтому...ks0 писал(а):Т.е. переменные, с которыми работает модуль, описываются в модуле, можно с модификатором static, а изменяются только за счет функций, объявленных в его хедере.
...всё же не стоит принимать это как закон. В некоторых ситуациях глобальные переменные (как и злополучный goto кстати) могут не только упростить реализацию, но и сделать её более изящной и понятной.ks0 писал(а):не объявляйте в хедере переменные вообще никак
Код: Выделить всё
u08 test(void) {
return data;
}Вопрос один - что означает слово static, символ @ и последующее с ним значение? как я понял, это адрес в памяти, где хранится данное значение?// Банк 0 [0x0020 - 0x006F]
static volatile unsigned int adcP0 @ 0x24; // результат АЦП0
static volatile unsigned char adcP0L @ 0x24; // результат АЦП0 младший
static volatile unsigned char adcP0H @ 0x25; // результат АЦП0 старший
static volatile unsigned int num @ 0x26; // ширина импульса
static volatile unsigned char numL @ 0x26; // ширина импульса младший
static volatile unsigned char numH @ 0x27; // ширина импульса старший
static volatile unsigned char nserv @ 0x2A; // номер прерывания
// ----------------------------------------
Код: Выделить всё
static delta = 10;
void main (void)
{
uint8_t temp;
for (uint8_t i = 0; i < 10; i++) {
temp = up();
}
}
uint8_t up (void) {
static up = 0;
up++;
return up;
}Эээ... Разве? Она не будет обнуляться при каждом вызове функции?slavokhire5 писал(а):последовательно значения от 1 до 10.
Код: Выделить всё
static up;
up = 0;Код: Выделить всё
static up = 0;Всё чудесатей и чудесатейWiseLord писал(а):Если бы было так, то обнулялась бы, а такКод: Выделить всё
static up; up = 0;- не будет, как уже выше сказали.Код: Выделить всё
static up = 0;
Так, вы тут Gudd-Head давайте не путайте, обнуляется не обнуляется.Gudd-Head писал(а):Всё чудесатей и чудесатей
Код: Выделить всё
#include "stdio.h"
char res[8];
/********Тут**по***идее**код*************/
if(send) {
sprintf (res, "%s %d", "L=", light);
Out_Str(res); mUart_Putch(0x0D);
send=0;
}Код: Выделить всё
#define F_CPU 8000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <stdlib.h>
#include "mUart.h"
#include "stdio.h"
char light = 1;
char b = 1;
char res[8];
/****************************************************************/
volatile unsigned char tx_fl=0;
volatile unsigned char TSK_CLR=0;
volatile unsigned char ID=83;
volatile unsigned char rx;
volatile unsigned char rx_buf[10];
volatile unsigned char rx_cnt=0;
volatile unsigned char rx_fl=0;
volatile unsigned char rx_size;
volatile unsigned char err=0;
volatile unsigned char send=0;
/****************************************************************/
/* Ñäåëàòü çàìåð ôîòîäàò÷èêà */
/****************************************************************/
ISR (TIM1_OVF_vect) {
if(ADCH > 0x63 && b < 6) b++;
if(ADCH < 0x63 && b > 0) b--;
light = 16*b + 1;
ADCSRA|= (1<<ADSC);
send=1;
}
/****************************************************************/
/* Ïðèíÿò áàéò */
/****************************************************************/
void CallBack_RX(char ch){
rx=ch;
if(err) return;
rx_buf[rx_cnt]=ch;
if(ch==13){ // '/n'
rx_fl=1;
rx_size = rx_cnt;
rx_cnt=0;
return;
}
if(++rx_cnt>=sizeof(rx_buf)){
err=1;
rx_cnt=0;
}
}
/****************************************************************/
/* Áàéò îòïðàâëåí */
/****************************************************************/
void CallBack_TX(void){
tx_fl=1;
}
/****************************************************************/
void Out_Str(char* s){
while(*s){
tx_fl=0;
mUart_Putch(*s++);
while(!tx_fl);
};
}
/****************************************************************/
int main (void){
CLKPR=(1<<CLKPCE);
CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0);
DDRB = 0x03;
MCUCR = (0<<ISC01) | (1<<ISC00);
OCR1AH= 0xFF;
OCR1AL= 0xFF;
TCCR1B|=(1<<CS10)|(1<<CS12); // Çàïóñòèëè ÑÒÑ.
TIMSK1|=(1<<TOIE1); // Ðàçðåøàåì ïðåðûâàíèå ïî ñîâïàäåíèþ.
ADMUX=0x05; // ÀÖÏ íà ïÿòûé âõîä
ADCSRB|=(1<<ADLAR);
ADCSRA|=(1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);
ADCH = 20;
sei();
mUart_Init();
while (1) {
if(err) { // Bufer overflow
err=0;
// Send error message
}
if(send) {
sprintf (res, "%s %d", "L=", light);
Out_Str(res); mUart_Putch(0x0D);
send=0;
}
}
}
Да всё так. Sprintf занимает дофига места.просто КОТ писал(а):Вопрос -- что не так