Changeset - 3243bfc71b35
[Not reviewed]
default
0 9 0
ethanzonca@CL-ENS241-08.cedarville.edu - 12 years ago 2013-03-22 15:56:41
ethanzonca@CL-ENS241-08.cedarville.edu
Fixed warnings on master, implemented watchdog ISR to flash LEDs and save program timer to EEPROM. Program timer is restored upon reboot after the watchdog triggers, the error LED is activated, and an error message is logged to the SD card.
9 files changed with 75 insertions and 7 deletions:
0 comments (0 inline, 0 general)
master/master/config.h
Show inline comments
 
@@ -28,13 +28,13 @@
 
// --------------------------------------------------------------------------
 
 
// Debug Output
 
//#define DEBUG_OUTPUT
 
 
// Blackout (turn off all but power LEDs)
 
#define BLACKOUT_ENABLE
 
//#define BLACKOUT_ENABLE
 
#define BLACKOUT_TIMEOUT 300000 // Blackout after 5 minutes (hopefully after fix)
 
 
// Board heater setpoint
 
#define HEATER_THRESHOLD 80
 
 
// Touchdown buzzer
 
@@ -55,12 +55,13 @@
 
#define ERROR_SD_FILE 3
 
#define ERROR_XBEETIMEOUT 4
 
#define ERROR_FATAL 5
 
#define ERROR_ATFAIL 6
 
#define ERROR_EXITAT 7
 
#define ERROR_INFOTEXT 8
 
#define ERROR_WATCHDOG 9
 
// !!! Please specify/update detailed messages for these error codes in logger.c
 
 
// --------------------------------------------------------------------------
 
// Slave Sensors config (slavesensors.c)
 
// --------------------------------------------------------------------------
 
 
@@ -156,12 +157,15 @@
 
// Logger config (logger.c)
 
// --------------------------------------------------------------------------
 
 
// Log number EEPROM address (this number is incremented on boot, used for filenames)
 
#define LOGGER_ID_EEPROM_ADDR 0x10
 
 
// Watchdog save/restore of program timer
 
#define WATCHDOG_PROGTIMER_EEPROM_ADDR 0x20
 
 
// Written to the beginning of every log file
 
#define LOGGER_HEADERTEXT "HAB Control Master - 1.0\n"
 
 
// Log to SD card every X milliseconds
 
#define LOGGER_RATE 1000 
 
master/master/lib/logger.c
Show inline comments
 
@@ -25,37 +25,39 @@
 
#include "sdcard/sd_raw_config.h"
 
#include "serial.h"
 
#include "logger.h"
 
#include "led.h"
 
#include "looptime.h"
 

	
 
#define MAX_ERRNO 8
 
#define MAX_ERRNO 9
 

	
 
// Label lookup table
 
// Make sure there are never more labels than there are MAX_NUM_SENSORS!
 
const char err_0[] PROGMEM = "slave timeout";
 
const char err_1[] PROGMEM = "initializing SD card failed";
 
const char err_2[] PROGMEM = "opening SD partition failed";
 
const char err_3[] PROGMEM = "opening SD file failed";
 
const char err_4[] PROGMEM = "XBee timeout";
 
const char err_5[] PROGMEM = "FATAL UNHANDLED ERROR";
 
const char err_6[] PROGMEM = "enter AT mode failed";
 
const char err_7[] PROGMEM = "exit AT mode failed";
 
const char err_8[] PROGMEM = "infotext";
 
const char err_9[] PROGMEM = "watchdog";
 

	
 
const char *const errorMessageLookup[] PROGMEM =
 
{
 
	err_0,
 
	err_1,
 
	err_2,
 
	err_3,
 
	err_4,
 
	err_5,
 
	err_6,
 
	err_7,
 
	err_8,
 
	err_9
 
};
 
 
 
 
struct partition_struct* partition;
 
struct fat_fs_struct* fs;
master/master/lib/looptime.c
Show inline comments
 
@@ -36,6 +36,11 @@ ISR(TIMER0_OVF_vect)
 
}
 

	
 
uint32_t time_millis() 
 
{
 
	return millis; // meh accuracy, but that's OK
 
}
 

	
 
void time_watchdogrestore(uint32_t saved_millis)
 
{
 
	millis = saved_millis;
 
}	
master/master/lib/looptime.h
Show inline comments
 
@@ -14,8 +14,9 @@
 
#define LOOPTIME_H_
 
 
#include <inttypes.h>
 

	
 
void time_setup();
 
uint32_t time_millis();
 
void time_watchdogrestore(uint32_t saved_millis);
 
 
#endif /* LOOPTIME_H_ */
 
\ No newline at end of file
master/master/lib/sdcard/sd_raw.c
Show inline comments
 
@@ -10,13 +10,12 @@
 

	
 
#include <string.h>
 
#include <avr/io.h>
 
#include "sd_raw.h"
 
#include "sd_raw_config.h"
 
#include "../led.h"
 
#include <avr/delay.h>
 

	
 
/**
 
 * \addtogroup sd_raw MMC/SD/SDHC card raw access
 
 *
 
 * This module implements read and write access to MMC, SD
 
 * and SDHC cards. It serves as a low-level driver for the
master/master/lib/slavesensors.c
Show inline comments
 
@@ -565,12 +565,17 @@ void slavesensors_process(uint8_t parseR
 
			if(numRetries < MAX_SLAVEREQUEST_RETRIES) 
 
			{
 
				slavesensors_request();	// re-request
 
			}
 
			else {
 
				numRetries = 0;
 
				
 
				char msg[128];
 
				snprintf(msg, 128, "Slave %u (%s) failed max retries",currentSlave,slaveNames[currentSlave]);
 
				error_log_msg(ERROR_SLAVETIMEOUT, false, msg); // log error, don't blink LED
 
				
 
				gotoNextSlaveOrSensor(true);
 
			}
 
		}			
 
	}
 
	
 
	
master/master/lib/watchdog.c
Show inline comments
 
@@ -7,22 +7,73 @@
 
 * Matthew Kanning
 
 * Kyle Ripperger
 
 * Matthew Kroening
 
 *
 
 */
 
 
 
#include "../config.h"
 
#include <avr/io.h>
 
#include <avr/interrupt.h>
 
#include <avr/wdt.h>
 
#include <util/delay.h>
 
#include <avr/eeprom.h>
 
 
#include "looptime.h"
 
#include "led.h"
 
#include "logger.h"
 
 
//initialize watchdog
 
void watchdog_setup(void)
 
{
 
	cli();
 
	wdt_reset();
 
	// Set change enable bit, enable the WDT
 
	WDTCSR = (1<<WDCE)|(1<<WDE);
 
	WDTCSR = (1<<WDCE)|(1<<WDE)| (1<<WDIE);
 
	// Start watchdog, 4 second timeout
 
	WDTCSR = (1<<WDE)|(1<<WDP3)|(1<<WDP0);
 
	WDTCSR = (1<<WDE)|(1<<WDP3)|(1<<WDP0)|(1<<WDIE);
 
	sei();
 
}
 
 
void watchdog_checkreset(void)
 
{
 
	// Check if WDT reset occurred
 
	if( (MCUSR & (1<<WDRF)) > 0)
 
	{
 
		MCUSR &= ~(1<<WDRF);
 
		
 
		// Restore timer from EEPROM
 
		uint32_t oldtimer = 0;
 
		oldtimer = eeprom_read_dword((uint32_t*)WATCHDOG_PROGTIMER_EEPROM_ADDR);
 
		time_watchdogrestore(oldtimer);
 
		
 
		error_log_msg(ERROR_WATCHDOG,false,"Booting up after watchdog reset");
 
	}
 
}
 
 
ISR(WDT_vect) 
 
{
 
	// Store timer in EEPROM
 
	eeprom_write_dword((uint32_t*)WATCHDOG_PROGTIMER_EEPROM_ADDR, time_millis());
 
	
 
	// Trippy error LEDs while waiting 4 seconds for system reset
 
	while(1)
 
	{
 
		led_on(LED_ACT0);
 
		led_on(LED_ACT1);
 
		led_on(LED_ACT2);
 
		led_on(LED_ACT3);
 
		led_on(LED_ERROR);
 
		led_on(LED_STATUS);
 
		led_on(LED_ACTIVITY);
 
		led_on(LED_SIDEBOARD);
 
		_delay_ms(50);
 
		led_off(LED_ACT0);
 
		led_off(LED_ACT1);
 
		led_off(LED_ACT2);
 
		led_off(LED_ACT3);
 
		led_off(LED_ERROR);
 
		led_off(LED_STATUS);
 
		led_off(LED_ACTIVITY);
 
		led_off(LED_SIDEBOARD);
 
		_delay_ms(50);
 
	}	
 
}
 
\ No newline at end of file
master/master/lib/watchdog.h
Show inline comments
 
@@ -12,8 +12,9 @@
 
 
 
#ifndef WATCHDOG_H
 
#define WATCHDOG_H
 
 
void watchdog_setup(void);
 
void watchdog_checkreset(void);
 
 
#endif
 
\ No newline at end of file
master/master/master.c
Show inline comments
 
@@ -51,14 +51,14 @@ int main(void)
 
	serial1_setup();
 
	i2c_init();
 
	sensordata_setup(); // must happen before slavesensors/logger/AFSK
 
	slavesensors_setup();
 
	sensors_setup();
 
	logger_setup();
 
	watchdog_checkreset();
 
	afsk_setup();
 
	
 
	serial0_sendString("\r\nHello.\r\n\r\n");
 
	
 
	// Blocking ZigBee node discovery
 
	slavesensors_network_scan();
 
	
 
	// Software timers	
0 comments (0 inline, 0 general)