Commit 6826f0a2 authored by Erik Strand's avatar Erik Strand

WIP try to compile by removing Arduino

parent 3b8cb7ab
......@@ -13,23 +13,34 @@
MMCU=attiny44
F_CPU = 20000000
CFLAGS=-mmcu=$(MMCU) -Wall -Os -DF_CPU=$(F_CPU)
CFLAGS=-mmcu=$(MMCU) -Wall -Os -DF_CPU=$(F_CPU) \
-I external/OneWire \
-I /usr/share/arduino/hardware/arduino/cores/arduino
#PROGRAMMER = atmelice_isp
PROGRAMMER = usbtiny
%.hex: %.out
%.hex: %.elf
avr-objcopy -O ihex $< $@;\
avr-size --mcu=$(MMCU) --format=avr $@
%.out: %.c
avr-gcc $(CFLAGS) -I./ -o $@ $<
#%.o: %.c
# avr-g++ $(CFLAGS) -I./ -o $@ $<
program_%: %.hex
avrdude -p t44 -P usb -c $(PROGRAMMER) -U flash:w:$<
external/OneWire/OneWire.o: external/OneWire/OneWire.cpp external/OneWire/OneWire.h
avr-g++ -c $(CFLAGS) -I./ -o $@ $<
button_serial.o: button_serial.c external/OneWire/OneWire.h
avr-g++ -c $(CFLAGS) -I./ -o $@ $<
button_serial.elf: button_serial.o OneWire.o
avr-g++ $(CFLAGS) -o $@ $^
.PHONY: default
default: program_button_serial
#default: program_button_serial
default: button_serial.hex
program-fuses:
avrdude -p t44 -P usb -c $(PROGRAMMER) -U lfuse:w:0x5E:m
......@@ -16,6 +16,8 @@
#include <util/delay.h>
#include <avr/pgmspace.h>
#include "OneWire.h"
#define output(directions,pin) (directions |= pin) // set port direction for output
#define set(port,pin) (port |= pin) // set port pin
#define clear(port,pin) (port &= (~pin)) // clear port pin
......@@ -25,6 +27,7 @@
#define bit_delay() _delay_us(bit_delay_time) // RS232 bit delay
#define half_bit_delay() _delay_us(bit_delay_time/2) // RS232 half bit delay
#define char_delay() _delay_ms(10) // char delay
#define delay(duration) _delay_ms(duration); // drop-in replacement for Arduino delay
#define serial_port PORTA
#define serial_direction DDRA
......@@ -50,44 +53,44 @@ void put_char(volatile unsigned char *port, unsigned char pin, char txchar) {
// unrolled loop to write data bits
//
if bit_test(txchar,0)
set(*port,pin);
set(*port,pin);
else
clear(*port,pin);
clear(*port,pin);
bit_delay();
if bit_test(txchar,1)
set(*port,pin);
set(*port,pin);
else
clear(*port,pin);
clear(*port,pin);
bit_delay();
if bit_test(txchar,2)
set(*port,pin);
set(*port,pin);
else
clear(*port,pin);
clear(*port,pin);
bit_delay();
if bit_test(txchar,3)
set(*port,pin);
set(*port,pin);
else
clear(*port,pin);
clear(*port,pin);
bit_delay();
if bit_test(txchar,4)
set(*port,pin);
set(*port,pin);
else
clear(*port,pin);
clear(*port,pin);
bit_delay();
if bit_test(txchar,5)
set(*port,pin);
set(*port,pin);
else
clear(*port,pin);
clear(*port,pin);
bit_delay();
if bit_test(txchar,6)
set(*port,pin);
set(*port,pin);
else
clear(*port,pin);
clear(*port,pin);
bit_delay();
if bit_test(txchar,7)
set(*port,pin);
set(*port,pin);
else
clear(*port,pin);
clear(*port,pin);
bit_delay();
//
// stop bit
......@@ -112,6 +115,112 @@ void put_string(volatile unsigned char *port, unsigned char pin, char *str) {
} while (str[index] != 0);
}
OneWire ds(11); // on pin 10 (a 4.7K resistor is necessary)
//void setup(void) {
// Serial.begin(9600);
//}
void loop(void) {
byte i;
byte present = 0;
byte type_s;
byte data[12];
byte addr[8];
float celsius, fahrenheit;
if ( !ds.search(addr)) {
put_string(&serial_port, serial_pin_out, "No more addresses.");
ds.reset_search();
delay(250);
return;
}
//Serial.print("ROM =");
put_string(&serial_port, serial_pin_out, "ROM=");
for( i = 0; i < 8; i++) {
put_char(&serial_port, serial_pin_out, ' ');
//Serial.print(addr[i], HEX);
put_string(&serial_port, serial_pin_out, "xxx");
//put_string(&serial_port, serial_pin_out, addr[i])
}
if (OneWire::crc8(addr, 7) != addr[7]) {
put_string(&serial_port, serial_pin_out, "CRC is not valid!");
return;
}
//Serial.println();
// the first ROM byte indicates which chip
switch (addr[0]) {
case 0x10:
put_string(&serial_port, serial_pin_out, " Chip = DS18S20"); // or old DS1820
type_s = 1;
break;
case 0x28:
put_string(&serial_port, serial_pin_out, " Chip = DS18B20");
type_s = 0;
break;
case 0x22:
put_string(&serial_port, serial_pin_out, " Chip = DS1822");
type_s = 0;
break;
default:
put_string(&serial_port, serial_pin_out, "Device is not a DS18x20 family device.");
return;
}
ds.reset();
ds.select(addr);
ds.write(0x44, 1); // start conversion, with parasite power on at the end
delay(1000); // maybe 750ms is enough, maybe not
// we might do a ds.depower() here, but the reset will take care of it.
present = ds.reset();
ds.select(addr);
ds.write(0xBE); // Read Scratchpad
put_string(&serial_port, serial_pin_out, " Data = ");
put_string(&serial_port, serial_pin_out, "xxx");
//put_string(&serial_port, serial_pin_out, present, HEX);
put_string(&serial_port, serial_pin_out, " ");
for ( i = 0; i < 9; i++) { // we need 9 bytes
data[i] = ds.read();
//Serial.print(data[i], HEX);
put_string(&serial_port, serial_pin_out, " thing");
}
put_string(&serial_port, serial_pin_out, " CRC=");
//put_string(&serial_port, serial_pin_out, OneWire::crc8(data, 8), HEX);
// Convert the data to actual temperature
// because the result is a 16 bit signed integer, it should
// be stored to an "int16_t" type, which is always 16 bits
// even when compiled on a 32 bit processor.
int16_t raw = (data[1] << 8) | data[0];
if (type_s) {
raw = raw << 3; // 9 bit resolution default
if (data[7] == 0x10) {
// "count remain" gives full 12 bit resolution
raw = (raw & 0xFFF0) + 12 - data[6];
}
} else {
byte cfg = (data[4] & 0x60);
// at lower res, the low bits are undefined, so let's zero them
if (cfg == 0x00) raw = raw & ~7; // 9 bit resolution, 93.75 ms
else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
//// default is 12 bit resolution, 750 ms conversion time
}
celsius = (float)raw / 16.0;
fahrenheit = celsius * 1.8 + 32.0;
put_string(&serial_port, serial_pin_out, " Temperature = ");
//put_string(&serial_port, serial_pin_out, celsius);
put_string(&serial_port, serial_pin_out, " Celsius, ");
//put_string(&serial_port, serial_pin_out, fahrenheit);
put_string(&serial_port, serial_pin_out, " Fahrenheit");
}
int main(void) {
// Set clock divider to 1.
CLKPR = (1 << CLKPCE);
......@@ -135,12 +244,12 @@ int main(void) {
if (PINA & button_pin) {
// Turn off the LED.
PORTB &= ~led_pin;
put_char(&serial_port, serial_pin_out, '0');
//put_char(&serial_port, serial_pin_out, '0');
} else {
PORTB |= led_pin;
put_char(&serial_port, serial_pin_out, '1');
//put_char(&serial_port, serial_pin_out, '1');
}
_delay_us(10000);
//_delay_us(10000);
loop();
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment