diff --git a/main.c b/main.c index cb80d39..3460baf 100644 --- a/main.c +++ b/main.c @@ -22,6 +22,7 @@ uint16_t bcd; uint8_t display[4]; volatile uint16_t holdingRegisters[4]; volatile uint8_t outstate = 0; +volatile uint8_t ejector_timer = 0; void timer0_init() { @@ -31,15 +32,15 @@ void timer0_init() TIMSK |= 1<250kHz:250-=>1kHz) - //TIMSK |= 1<> 4]; + display[2] = font[(bcd&0x0f00) >> 8]; + display[3] = bcd&0xF000 ? font[(bcd&0xf000) >> 12] : 0; +} + +void eject(){ + PORTA |= _BV(7); + ejector_timer = 200; + //outstate |= _BV(1); +} + +void reset_timer(){ + outstate &= ~0x01; + holdingRegisters[0] = 17*60; + update_display(); +} + void modbusGet(void) { if (modbusGetBusState() & (1<> 4]; - display[2] = font[(bcd&0x0f00) >> 8]; - display[3] = bcd&0xF000 ? font[(bcd&0xf000) >> 12] : 0; - modbusGet(); + + if(!(PINA & _BV(2))){ + holdingRegisters[0] += 5; + update_display(); + _delay_ms(10); + } + if(!(PINA & _BV(1))){ + if(holdingRegisters[0]>5){ + holdingRegisters[0] -= 5; + update_display(); + _delay_ms(10); + } + } + if(!(PINA & _BV(0)) && (old_A & _BV(0))){ + if(!(outstate & 0x01)){ + reset_timer(); + } + outstate ^= 0x01; + _delay_ms(100); + } + old_A = PINA; } } ISR(TIMER0_COMP_vect) { if(outstate & 0x01){ + PORTB|=1<<4; // dots if(PORTB & 0x01){ PORTB = (PORTB & 0xF0) | 1<<1 | 1<<3; PORTD = display[3] & 0xFC; @@ -137,8 +184,33 @@ ISR(TIMER0_COMP_vect) { } } else{ + PORTB&=~(1<<4); // dots PORTB &= ~0x0F; } + + if(ejector_timer > 0 && ejector_timer < 0xFF){ + ejector_timer--; + } + else if(ejector_timer == 0){ + PORTA &= ~_BV(7); + outstate &= ~0x02; + ejector_timer = 0xFF; + } +} + +ISR(TIMER1_COMPA_vect) { + if(outstate & 0x01){ + holdingRegisters[0]--; + update_display(); + } + + if(holdingRegisters[0] == 0){ + reset_timer(); + if(outstate & _BV(2)){ + eject(); + outstate |= _BV(3); + } + } } ISR(TIMER2_OVF_vect) { //this ISR is called 9765.625 times per second