Hi,
ich bin dabei in C (AVR-GCC) eine kleine Spannungsanzeige zu programmieren. Als Microcontroller verwende ich den ATTINY13 (1024Bytes PROGMEM, 64Bytes RAM). Mein Problem ist, das mein aktueller Code knapp mehr als 1kB (10Bytes zuviel) braucht. Ich habe selber schon versucht, den Code etwas zu verkleinern, jedoch ohne grossen Erfolg.
Spoiler anzeigen
Könntet ihr mir helfen, den Code kleiner zu machen? Habs schon probiert und konnte 24Bytes 'sichern'.
thx & mfg
gfc
ich bin dabei in C (AVR-GCC) eine kleine Spannungsanzeige zu programmieren. Als Microcontroller verwende ich den ATTINY13 (1024Bytes PROGMEM, 64Bytes RAM). Mein Problem ist, das mein aktueller Code knapp mehr als 1kB (10Bytes zuviel) braucht. Ich habe selber schon versucht, den Code etwas zu verkleinern, jedoch ohne grossen Erfolg.
C-Quellcode
- /*
- * Voltmeter_ATTINY13.c
- *
- * Created: 06.02.2014 09:42:38
- * Author: gespa1
- *
- * Beschreibung: Ein Voltmeter mit dem ATTINY, die über 1 Shiftregister
- * und 2 7SEG/LCD-Treiber auf 7Segment-Anzeigen ausgegeben werden.
- *
- * Schaltung:
- *
- * +1.2-12V VOUT
- * X----o---------------X
- * |
- * | ___6.6k ___3.3k
- * '----|___|--o--|___|-.
- * +5V | |
- * X-o-----. .---' GND
- * | | |
- * .-.10k |8 |3
- * | | .-----------. .--------------------.
- * | | | |5 CLK| |
- * '-' | |-----------| |
- * | 1| |6 SER| CD4015BE |
- * '--| |-----------| 4bit Shift Register|
- * | |7 | |
- * | ATTINY 13 |--------. '--------------------'
- * | MCU |2 | |4bit BUS
- * | |---. | | 7SEG Anzeige
- * | | | | .-------. .-----------.
- * | | | | |CD4511 | ___220R | LED |
- * | | | | CS1| |---|___|--------|---->|-----|------.
- * '-----------' | '---------------| |---|___|--------|---->|-----|------o
- * |4 | | |---|___|--------|---->|-----|------o
- * | | | |---|___|--------|---->|-----|------o
- * GND | | |---|___|--------|---->|-----|------o
- * | | |---|___|--------|---->|-----|------o
- * | | |---|___|--------|---->|-----|------o
- * | | | | | |
- * | '-------' '-----------' |
- * | |4bit BUS GND
- * | |
- * | .-------. .-----------.
- * | |CD4511 | ___220R | LED |
- * | CS2| |---|___|--------|---->|-----|------.
- * '--------------------| |---|___|--------|---->|-----|------o
- * | |---|___|--------|---->|-----|------o
- * | |---|___|--------|---->|-----|------o
- * | |---|___|--------|---->|-----|------o
- * | |---|___|--------|---->|-----|------o
- * | |---|___|--------|---->|-----|------o
- * | | | | |
- * '-------' '-----------' |
- * GND
- */
- #include <avr/io.h>
- char E1, E2 = 0;
- float ADCNUM = 0;
- void Segment_OUT(char SEG1, char SEG2);
- void SerialOUT(char num);
- int main(void)
- {
- DDRB |= (1<<PB0) | (1<<PB1) | (1<<PB2) | (1<<PB3);
- while(1)
- {
- ADMUX |= (1<<MUX1);
- ADCSRA |= (1<<ADEN) | (1<<ADPS2) | (1<<ADSC);
- while (ADCSRA & (1<<ADSC));
- ADCNUM = ADC;
- ADCNUM = ((ADCNUM * 5) / 1023) *3;
- E1 = ADCNUM / 1;
- E2 = (int)ADCNUM % 1;
- Segment_OUT(E1, E2);
- }
- }
- // Zahl ausgeben
- void Segment_OUT(char SEG1, char SEG2)
- {
- SerialOUT(SEG1);
- asm volatile ("sbi 0x18,2 \n\t"
- "nop \n\t"
- "cbi 0x18,2 \n\t");
- SerialOUT(SEG2);
- asm volatile ("sbi 0x18,3 \n\t"
- "nop \n\t"
- "cbi 0x18,3 \n\t"); // hat _delay_us(10) ersetzt
- }
- // Daten seriell ausgeben
- void SerialOUT(char num)
- {
- for (char i = 0; i < 4; i++)
- {
- if (num & (1<<i)) PORTB |= (1<<PB1);
- PORTB |= (1<<PB0);
- asm volatile ("nop"); // hat _delay_us(10) ersetzt
- PORTB &=~ (1<<PB0) | (1<<PB1);
- }
- }
Könntet ihr mir helfen, den Code kleiner zu machen? Habs schon probiert und konnte 24Bytes 'sichern'.
thx & mfg
gfc
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „gfcwfzkm“ ()