Compare commits

...

2 Commits

Author SHA1 Message Date
Eggert Jung 7c9500f690 change led behavior 3 years ago
Eggert Jung 9c26592d38 update README 3 years ago

@ -12,17 +12,18 @@ auf einem Atmel AVR (ATmega328p) ist der Modbus-Slave implementiert.
| Parameter | Wert | | Parameter | Wert |
|----------------|--------| |----------------|--------|
| Baudrate | 115200 | | Baudrate | 115200 |
| Datenbits | 8 |
| Parität | none | | Parität | none |
| Stopbits | 1 | | Stopbits | 1 |
| Modbus Adresse | 1 | | Modbus Adresse | 1 |
Das Gerät stellt den 24-bit ADC Wert in 2er-Komplement Darstelling über zwei Das Gerät stellt den 24-bit ADC Wert in 2er-Komplement Darstellung über zwei
Holding-Register bereit. Somit ergibt sich ein 32-bit signed Integer Datentyp. Holding-Register bereit. Somit ergibt sich ein 32-bit signed Integer Datentyp.
| Register Adresse | Wert | | Register Adresse | Wert |
|------------------|-----------| |------------------|-----------|
| 0 | ADC[0:15] | | 0 | ADC[0:15] |
| 1 | ADC[23:16]| | 1 | 8xADC[23],ADC[22:16]|
#### Beispiel: #### Beispiel:
Abfragen des Wertes mit dem Tool modpoll (https://www.modbusdriver.com/modpoll.html) Abfragen des Wertes mit dem Tool modpoll (https://www.modbusdriver.com/modpoll.html)

@ -1,5 +1,6 @@
#include <avr/io.h> #include <avr/io.h>
#include <avr/interrupt.h> #include <avr/interrupt.h>
#include <stdint.h>
#include <util/delay.h> #include <util/delay.h>
#include "modbus.h" #include "modbus.h"
@ -7,6 +8,8 @@
uint16_t holdingRegisters[4]; uint16_t holdingRegisters[4];
volatile uint32_t led_on_timer[3];
// return raw ADC data // 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 HX711_get_data(uint8_t clk_PIN, uint8_t data_PIN, uint8_t gain_for_next_conv){
uint32_t data = 0; uint32_t data = 0;
@ -62,16 +65,20 @@ void modbusGet(void) {
{ {
switch(rxbuffer[1]) { switch(rxbuffer[1]) {
case fcReadHoldingRegisters: case fcReadHoldingRegisters:
PORTC ^= 1 << 1; // toggle led PORTC |= 1 << 0;
led_on_timer[0]=1000;
while(PINB & (1<<4)); // wait for data ready while(PINB & (1<<4)); // wait for data ready
uint32_t tmp = HX711_get_data(3, 4, 128); uint32_t tmp = HX711_get_data(3, 4, 128);
holdingRegisters[0] = tmp & 0xFFFF; holdingRegisters[0] = tmp & 0xFFFF;
holdingRegisters[1] = (tmp>>16) & 0xFFFF; holdingRegisters[1] = (tmp>>16) & 0xFFFF;
holdingRegisters[2] = led_on_timer[1];
modbusExchangeRegisters(holdingRegisters,0,4); modbusExchangeRegisters(holdingRegisters,0,4);
break; break;
default: default:
PORTC |= 1 << 1;
led_on_timer[1]=1000;
modbusSendException(ecIllegalFunction); modbusSendException(ecIllegalFunction);
break; break;
} }
@ -97,4 +104,11 @@ int main(void){
ISR(TIMER0_OVF_vect) { //this ISR is called 9765.625 times per second ISR(TIMER0_OVF_vect) { //this ISR is called 9765.625 times per second
modbusTickTimer(); modbusTickTimer();
for(uint8_t i=0; i<2; i++){
if(led_on_timer[i]>0)
led_on_timer[i]--;
else
PORTC &= ~(1<<i);
}
} }