Witam,
Napisałem sobie kod dla woltomierza na ADS1110 i chciałbym go wyświetlić na ekranie jednak brakuje mi może 100bajtów w pamięci - używam Atmega48, kod wynikowy zajmuje 4224 bytes (103.1% Full)
Czyli za dużo. Da się coś z tym zrobić? Używam 4 dzielników napięć przełączanych przekaźnikami i stąd te mnożniki w programie.
Kod działa jeśli usunę mnożniki i robi się prawie 1K wolnego miejsca. Czemu tak to jest??
Może wpleść assemblera w kod C ? Może da się gdzieś indziej zaoszczędzić te bajty?
Używam dwóch bibliotek ze strony radzio.dxp.pl:
HD44780:
http://radzio.dxp.pl/hd44780/hd44780_avr_4-bit_norw_c.htm
Oraz TWI:
http://radzio.dxp.pl/twi/
Mój kod:
Napisałem sobie kod dla woltomierza na ADS1110 i chciałbym go wyświetlić na ekranie jednak brakuje mi może 100bajtów w pamięci - używam Atmega48, kod wynikowy zajmuje 4224 bytes (103.1% Full)
Czyli za dużo. Da się coś z tym zrobić? Używam 4 dzielników napięć przełączanych przekaźnikami i stąd te mnożniki w programie.
Kod działa jeśli usunę mnożniki i robi się prawie 1K wolnego miejsca. Czemu tak to jest??
Może wpleść assemblera w kod C ? Może da się gdzieś indziej zaoszczędzić te bajty?
Używam dwóch bibliotek ze strony radzio.dxp.pl:
HD44780:
http://radzio.dxp.pl/hd44780/hd44780_avr_4-bit_norw_c.htm
Oraz TWI:
http://radzio.dxp.pl/twi/
Mój kod:
#include <avr/io.h>
#include <util/delay.h>
#include <stdlib.h>
#include "twi.h"
#include "HD44780.h"
#define DeviceWrite 0b10010000 //adres ADS1110
#define DeviceRead 0b10010001 //adres ADS1110
void io_init(void)
{
DDRD = 0b00000000;
PORTD = 0b00000001;
DDRB = 0b00000000;
PORTB = 0b11000001;
DDRC = 0b00000111;
PORTC = 0b00000000;
}
int main(void)
{
unsigned char High;
unsigned char Low;
float nap;
// float mult = 1;
unsigned char mode = 0;
char wynik[8];
unsigned char changed = 0;
io_init();
LCD_Initalize();
LCD_GoTo(0,0);
LCD_WriteText("Div1 V: ");
while(1)
{
twistart();
twiwrite(DeviceRead);
High = twiread(ACK);
Low = twiread(NOACK);
twistop();
if(bit_is_clear(PIND, PD0)) {
//Pierwszy button
mode = 0;
nap = (Low | (High << 8)) * ( 2.048 / 32768);
changed = '1';
PORTC = 0b00000000;
} else
if(bit_is_clear(PINB, PB0)) {
//Drugi button
mode = 1;
nap = (Low | (High << 8)) * ( 2.048 * 5 / 32768);
changed = '2';
PORTC = 0b00000001;
} else
if(bit_is_clear(PINB, PB7)) {
//Trzeci button
mode = 2;
nap = (Low | (High << 8)) * ( 2.048 * 10 / 32768);
changed = '3';
PORTC = 0b00000110;
} else
if(bit_is_clear(PINB, PB6)) {
//Czwarty button
mode = 3;
nap = (Low | (High << 8)) * ( 2.048 * 150 / 32768);
changed = '4';
PORTC = 0b00000111;
}
if (changed > 0) {
LCD_GoTo(3,0);
LCD_WriteData(changed);
changed = 0;
}
dtostrf(nap,8,6,wynik);
LCD_GoTo(0,1);
LCD_WriteText(wynik);
_delay_ms(50);
}
}