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.
		
		
		
		
		
			
		
			
				
	
	
		
			92 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
			
		
		
	
	
			92 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
| #include <avr/io.h>
 | |
| #include <util/delay.h>
 | |
| #include <avr/interrupt.h>
 | |
| #include "yaMBSiavr.h"
 | |
| #include "pt100.h"
 | |
| 
 | |
| void init_clk(void)
 | |
| {
 | |
|     // ========= System Clock configuration =========
 | |
|     // Set to external 16Mhz crystal, using the PLL at *2
 | |
|     // set it to be a 12-16Mhz crystal with a slow start-up time.
 | |
|     OSC.XOSCCTRL = OSC_FRQRANGE_2TO9_gc | OSC_XOSCSEL_XTAL_16KCLK_gc ;
 | |
|     OSC.CTRL |= OSC_XOSCEN_bm ; // enable it
 | |
|     while( (OSC.STATUS & OSC_XOSCRDY_bm) == 0 ){} // wait until it's stable
 | |
| 
 | |
|     // The external crystal is now running and stable.
 | |
|     // (Note that it's not yet selected as the clock source)
 | |
|     // Now configure the PLL to be eXternal oscillator * 2
 | |
|     OSC.PLLCTRL = OSC_PLLSRC_XOSC_gc | 2;
 | |
| 
 | |
|     // now enable the PLL...
 | |
|     OSC.CTRL |= OSC_PLLEN_bm ; // enable the PLL...
 | |
|     while( (OSC.STATUS & OSC_PLLRDY_bm) == 0 ){} // wait until it's stable
 | |
| 
 | |
|     // And now, *finally*, we can switch from the internal 2Mhz clock to the PLL
 | |
|     CCP = CCP_IOREG_gc;	// protected write follows   
 | |
|     CLK.CTRL = CLK_SCLKSEL_PLL_gc;	// The System clock is now  PLL (16Mhz * 2)
 | |
|     // ==============================================
 | |
| }
 | |
| 
 | |
| void init_timer_100us(){
 | |
|     TCC0.CTRLA |= TC_CLKSEL_DIV256_gc;
 | |
|     TCC0.PER = 13; // ==> 9615Hz
 | |
|     TCC0.INTCTRLA |= TC_OVFINTLVL_HI_gc;
 | |
| }
 | |
| 
 | |
| void io_setup(void){
 | |
|     // LED
 | |
|     PORTD.DIRSET = 1 << 5;
 | |
| 
 | |
|     // pullups for address switch
 | |
|     PORTCFG.MPCMASK = 0xFF;
 | |
|     PORTC.PIN1CTRL = PORT_OPC_PULLUP_gc;
 | |
| }
 | |
| 
 | |
| void modbusGet(void) {
 | |
| 	if (modbusGetBusState() & (1<<ReceiveCompleted))
 | |
|     {
 | |
|         PORTD.OUTSET = 1 << 5;
 | |
|         switch(rxbuffer[1]) {
 | |
|             case fcReadHoldingRegisters: ;
 | |
|                 modbusExchangeRegisters((uint16_t*)ch_values, 0, 20);
 | |
|                 break;
 | |
|             default:
 | |
|                 modbusSendException(ecIllegalFunction);
 | |
|                 break;
 | |
|         }
 | |
|         PORTD.OUTCLR = 1 << 5;
 | |
|     }
 | |
| }
 | |
| 
 | |
| int main(void){
 | |
|     init_clk();
 | |
|     io_setup();
 | |
| 
 | |
|     // blink LED on startup
 | |
|     PORTD.OUTTGL = 1 << 5;
 | |
|     _delay_ms(500);
 | |
|     PORTD.OUTTGL = 1 << 5;
 | |
| 
 | |
|     // init pt100 stuff
 | |
|     adc_init();
 | |
|     dma_init();
 | |
| 
 | |
|     // setup modbus tick timer
 | |
|     init_timer_100us();
 | |
| 
 | |
|     PMIC.CTRL |= PMIC_LOLVLEN_bm | PMIC_MEDLVLEN_bm | PMIC_HILVLEN_bm; 
 | |
|     sei();
 | |
| 
 | |
|     modbusSetAddress(1);
 | |
|     modbusInit();
 | |
| 
 | |
|     for(;;){
 | |
|         modbusGet();
 | |
|     }
 | |
| }
 | |
| 
 | |
| ISR(TCC0_OVF_vect){
 | |
|     modbusTickTimer();
 | |
| }
 |