net4me.net

Linux технологии, сети и электроника

Сишные подсказки

Примеры использования Си в различных ситуациях из жизни.
Куски C кода, ходы, решения при разработке электроники и прочее прочее...
Постараюсь поддерживать порядок, но не обещаю классификации.

C tips

C tips

attiny13 blink и бинарные операции

//*
 * 4eburashk https://csn.net4me.net
 * attiny13, attiny85 и т.д.
 * работа с регистрами.
 * моргание светодиодом бинарными операциями.
 * 
 */
int main(void) {
  DDRB = 0xff;		// все выводы порта B сконфигурировать как выходы (т.е. 0b11111111)
  while(1){
    PORTB |= 1<<2;	// установить "1" и сместить на 2 позиции влево. на выводе PB2 (3й бит), зажечь светодиод
    			// пояснение: PORTB = 0b00000100; PB2 это 3й бит в PB. (PB0,PB1,PB2 3й бит) 
    			// ну, или в 16й: PORTB = 0x04; кому как нравится. 
    			// PB3 будет уже 0x8 = 0b00001000 = PORTB |= 1<<3; и т.д.
    delay(1500);
    PORTB &= ~(1<<2);
    delay(3500);
  }
}
// END

attiny13(...85) тест работы и ухода в сон

/* 
 * проверка работы 13й тиньки. проблема непроизвольного выхода из сна.
 * Ну и потребление во сне померять тоже этот пример.
 * Суть: если МК "левый" и "сам просыпается", то будет моргать постоянно
 * если норм в сон уходит - моргнёт один раз и уснёт.
 * диод на второй ноге т.е. PB2 ->...-> 220R -> GND
*/
int main(void) {
  DDRB = 0x04;		// PB2 на выход
  PORTB = 0b00000100;	// PB2 on 1. 0b00000100 = 0x04 = PORTB |= (1<<2);
  delay(2000);
  PORTB &= ~(1<<2);	// PB off 0. 0b00000000 = 0x00 = PORTB &= ~(1<<2);
  delay(500);

  MCUCR |= (1 << SM1);	// power-down mode
  MCUCR &= ~(1 << SM0); // power-down mode
  MCUCR |= (1 << SE);

  asm("sleep");
}
// END

Makefile

# make all && make flash && make clean

MCU=attiny13
FUSE_L=0x7A
FUSE_H=0xFF
F_CPU=9600000
CC=avr-gcc
LD=avr-ld
OBJCOPY=avr-objcopy
SIZE=avr-size
AVRDUDE=avrdude -v -C/etc/avrdude.conf
CFLAGS=-std=c99 -Wall -g -Os -mmcu=${MCU} -DF_CPU=${F_CPU} -I.
TARGET=main
SRCS = main.c
	
all:
	${CC} ${CFLAGS} -o ${TARGET}.o ${SRCS}
	${LD} -o ${TARGET}.elf ${TARGET}.o
	${OBJCOPY} -j .text -j .data -O ihex ${TARGET}.o ${TARGET}.hex	
	${SIZE} --mcu=${MCU} ${TARGET}.elf

flash:
	${AVRDUDE} -p ${MCU} -c usbasp -B32 -U flash:w:${TARGET}.hex:i -F -P usb 

fuse:
	$(AVRDUDE) -p ${MCU} -c usbasp -B32 -U hfuse:w:${FUSE_H}:m -U lfuse:w:${FUSE_L}:m
	
clean:
	rm -f *.c~ *.o *.elf *.hex
# END