You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
			
		
		
		
		
			
		
			
				
	
	
		
			109 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C
		
	
			
		
		
	
	
			109 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C
		
	
| #include <avr/io.h>
 | |
| #include <avr/interrupt.h>
 | |
| #include <util/delay.h>
 | |
| #include "modbus.h"
 | |
| 
 | |
| #define HIGH_LOW_CYCLE_TIME 1
 | |
| 
 | |
| uint16_t holdingRegisters[4];
 | |
| 
 | |
| void timer0100us_start(void) {
 | |
| 	TCCR0B|=(1<<CS01); //prescaler 8
 | |
| 	TIMSK0|=(1<<TOIE0);
 | |
| }
 | |
| 
 | |
| //Return raw ADC data
 | |
| uint32_t HX711_get_data(uint8_t clk_PIN, uint8_t data_PIN, uint8_t gain_for_next_conv){
 | |
|     uint32_t data = 0;
 | |
|     for(uint8_t i = 0; i < 24; i++){    //Start 24bit transmission
 | |
|         PORTB |= (1 << clk_PIN);        //Set clock-PIN high
 | |
|         _delay_us(HIGH_LOW_CYCLE_TIME);
 | |
|         /*  Shift data to free LSB. Operation placed before writing data to avoid 
 | |
|             manuell shiftig after loop finsihed.*/
 | |
|         data <<= 1;                     
 | |
|         /*  Shift input-status of data containing bit to the
 | |
|             LSB and set all other bits to 0. Add result to
 | |
|             currently LSB in data-var.*/
 | |
|         data |= ((PINB>>data_PIN) & 0x01); //Read and store data
 | |
|         PORTB &= ~(1 << clk_PIN);        //Set clock-PIN low
 | |
|         _delay_us(HIGH_LOW_CYCLE_TIME);
 | |
|     }
 | |
| 
 | |
|     /*  Add extra clk-pluses to set PGA-Gain for next conversion
 | |
|         1 extra pulse : Channel A Gain = 128
 | |
|         2 extra pluses: Channel B Gain = 32
 | |
|         3 extra pluses: Channel A Gain = 64*/
 | |
|     int8_t extra_clk_pluses = 1;
 | |
|     switch(gain_for_next_conv){
 | |
|         case 128: 
 | |
|             extra_clk_pluses = 1;
 | |
|             break;
 | |
|         case 64:
 | |
|             extra_clk_pluses = 3;
 | |
|             break;
 | |
|         case 32:
 | |
|             extra_clk_pluses = 2;
 | |
|             break;
 | |
|         default:
 | |
|          extra_clk_pluses = 1;
 | |
|     }
 | |
|     for(uint8_t i = 0; i < extra_clk_pluses; i++){
 | |
|         PORTB |= (1 << clk_PIN);    //set clock-PIN high
 | |
|         _delay_us(HIGH_LOW_CYCLE_TIME);
 | |
|         PORTB &= ~(1 << clk_PIN);   //set clock-PIN low
 | |
|         _delay_us(HIGH_LOW_CYCLE_TIME);
 | |
|     }
 | |
| 
 | |
|     /*  Convert 24bit Two's complement to 32bit Two's complement
 | |
|         if MSB from 24Bit result is 1 aka negative*/
 | |
|     if(data & (1L<<23)){
 | |
|             data |= 0xFFL << 24;
 | |
|     }
 | |
|     return data;
 | |
| }
 | |
| 
 | |
| void modbusGet(void) {
 | |
| 	if (modbusGetBusState() & (1<<ReceiveCompleted))
 | |
| 	{
 | |
| 		switch(rxbuffer[1]) {
 | |
| 			case fcReadHoldingRegisters:
 | |
|                 PORTC ^= 1 << 1;
 | |
| //                _delay_ms(10);
 | |
| //                PORTC &= ~(1 << 1);
 | |
|                 uint32_t tmp = HX711_get_data(3, 4, 128); 
 | |
|                 //int32_t tmp = -1000;
 | |
|                 holdingRegisters[0] = tmp & 0xFFFF;
 | |
|                 holdingRegisters[1] = (tmp>>16) & 0xFFFF;
 | |
| 				modbusExchangeRegisters(holdingRegisters,0,4);
 | |
| 			break;
 | |
| 
 | |
|             default: {
 | |
| 				modbusSendException(ecIllegalFunction);
 | |
| 			}
 | |
| 			break;
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| int main(void){
 | |
|     DDRC |= 3 << 0;
 | |
|     DDRB |= (1<<3);
 | |
| 
 | |
|     modbusSetAddress(1);
 | |
| 	modbusInit();
 | |
|     sei();
 | |
| 
 | |
|     timer0100us_start();
 | |
| 
 | |
|     while(1){
 | |
|         modbusGet();
 | |
|         //PORTC ^= 1 << 0;
 | |
|         //_delay_ms(100);
 | |
|         //PORTC &= ~(1 << 1);
 | |
|     }
 | |
| }
 | |
| 
 | |
| ISR(TIMER0_OVF_vect) { //this ISR is called 9765.625 times per second
 | |
| 	modbusTickTimer();
 | |
| }
 |