add coils for onoff and ejector

master
Eggert Jung 3 years ago
parent ae9d0e48e3
commit 03d7fa4513

@ -18,8 +18,10 @@ uint8_t font[] = {
0xF6, 0xF6,
}; };
uint16_t bcd;
uint8_t display[4]; uint8_t display[4];
volatile uint16_t holdingRegisters[4]; volatile uint16_t holdingRegisters[4];
volatile uint8_t outstate = 0;
void timer0_init() void timer0_init()
{ {
@ -50,6 +52,7 @@ void modbusGet(void) {
{ {
switch(rxbuffer[1]) { switch(rxbuffer[1]) {
case fcReadHoldingRegisters: case fcReadHoldingRegisters:
holdingRegisters[1] = bcd;
modbusExchangeRegisters(holdingRegisters,0,4); modbusExchangeRegisters(holdingRegisters,0,4);
break; break;
case fcPresetMultipleRegisters: case fcPresetMultipleRegisters:
@ -59,17 +62,30 @@ void modbusGet(void) {
uint8_t m = (holdingRegisters[0] / 60) % 60; uint8_t m = (holdingRegisters[0] / 60) % 60;
uint8_t s = holdingRegisters[0] % 60; uint8_t s = holdingRegisters[0] % 60;
uint16_t bcd;
if(h) if(h)
bcd = bin2bcd(m) | bin2bcd(h)<<8; bcd = bin2bcd(m) | bin2bcd(h)<<8;
else else
bcd = bin2bcd(s) | bin2bcd(m)<<8; bcd = bin2bcd(s) | bin2bcd(m)<<8;
display[0] = font[(bcd&0x000f)]; break;
display[1] = font[(bcd&0x00f0) >> 4]; case fcReadCoilStatus:
modbusExchangeBits(&outstate,0,8);
break;
case fcForceMultipleCoils:
case fcForceSingleCoil:
modbusExchangeBits(&outstate,0,8);
display[2] = font[(bcd&0x0f00) >> 8]; if(outstate & 0x01)
display[3] = bcd&0xF000 ? font[(bcd&0xf000) >> 12] : 0; PORTB|=1<<4;
else
PORTB&=~(1<<4);
if(outstate & 0x02){
PORTA |= _BV(7);
_delay_ms(250); // well ...
PORTA &= ~_BV(7);
outstate &= ~0x02;
}
break; break;
default: default:
modbusSendException(ecIllegalFunction); modbusSendException(ecIllegalFunction);
@ -79,12 +95,14 @@ void modbusGet(void) {
} }
int main(void){ int main(void){
DDRB |= _BV(4) | _BV(3) | _BV(2) | _BV(1) | _BV(0); DDRB |= _BV(3) | _BV(2) | _BV(1) | _BV(0); // led anodes
DDRD = 0xFC; DDRB |= _BV(4); // dots
DDRA = 0x03 << 4; DDRD = 0xFC; // uln output 1
DDRC = 0xFE; DDRA |= _BV(5) | _BV(4);
DDRC = 0xFE; // uln output 2
modbusSetAddress(24); //better set this to sth. DDRA |= _BV(7); // ejector out
modbusSetAddress(24);
modbusInit(); modbusInit();
timer0_init(); timer0_init();
@ -93,24 +111,33 @@ int main(void){
sei(); sei();
while(1){ while(1){
display[0] = font[(bcd&0x000f)];
display[1] = font[(bcd&0x00f0) >> 4];
display[2] = font[(bcd&0x0f00) >> 8];
display[3] = bcd&0xF000 ? font[(bcd&0xf000) >> 12] : 0;
modbusGet(); modbusGet();
} }
} }
ISR(TIMER0_COMP_vect) ISR(TIMER0_COMP_vect) {
{ if(outstate & 0x01){
if(PORTB & 0x01){ if(PORTB & 0x01){
PORTB = (PORTB & 0xF0) | 1<<1 | 1<<3; PORTB = (PORTB & 0xF0) | 1<<1 | 1<<3;
PORTD = display[3] & 0xFC; PORTD = display[3] & 0xFC;
PORTA = (PORTA & 0xCF) | (display[3] & 0x03) << 4; PORTA = (PORTA & 0xCF) | (display[3] & 0x03) << 4;
PORTC = display[1]; PORTC = display[1];
}
else{
PORTB = (PORTB & 0xF0) | 1<<0 | 1<<2;
PORTD = display[2] & 0xFC;
PORTA = (PORTA & 0xCF) | (display[2] & 0x03) << 4;
PORTC = display[0];
}
} }
else{ else{
PORTB = (PORTB & 0xF0) | 1<<0 | 1<<2; PORTB &= ~0x0F;
PORTD = display[2] & 0xFC;
PORTA = (PORTA & 0xCF) | (display[2] & 0x03) << 4;
PORTC = display[0];
} }
} }

Loading…
Cancel
Save