Hi there,
I have been able to make some progress.
The cutted traces have been repaired with some thin wire. However, this board is definitely damaged. I think this one will remain my "guinea pig".
after repairing the traces, i have tested the isp connection:
sorg@samsung-ubuntu:~$ avrdude -c usbasp -p m329p
avrdude: warning: cannot set sck period. please check for usbasp firmware update.
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.00s
avrdude: Device signature = 0x1e950b
avrdude: safemode: Fuses OK (E:FD, H:91, L:62)
avrdude done. Thank you.
No it's time to set-up the arduino IDE for compiling...
in my Arduino/hardware/boards.txt, i have hadded the following lines:
##############################################################
hr25.name=HoneyWell HR25 Thermostat/ programming with USBasp
hr25.upload.using=USBasp
hr25.upload.protocol=usb
hr25.upload.maximum_size=30720
hr25.upload.speed=38400
hr25.build.mcu=atmega329p
hr25.build.f_cpu=16000000L
hr25.build.core=arduino
hr25.build.variant=hr25
Then, i have created a new folder named "hr25" in Arduino/hardware/variants , and in this folder i create a file named pins_arduino.h and put the following inside:
/*
pins_arduino.h - Pin definition functions for Arduino
Part of Arduino - http://www.arduino.cc/
Copyright (c) 2007 David A. Mellis
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General
Public License along with this library; if not, write to the
Free Software Foundation, Inc., 59 Temple Place, Suite 330,
Boston, MA 02111-1307 USA
***************************************
Definition for ATmega329p as in the HR25 thermostat
*/
#ifndef Pins_Arduino_h
#define Pins_Arduino_h
#include <avr/pgmspace.h>
#define NUM_DIGITAL_PINS 53
#define NUM_ANALOG_INPUTS 8
#define analogInputToDigitalPin(p) ((p < 8) ? (p) + 40 : -1)
#define digitalPinHasPWM(p) ((p) == 12 || (p) == 14 || (p) == 15 || (p) == 13)
static const uint8_t SS = 8; //PB0
static const uint8_t MOSI = 10; //PB2
static const uint8_t MISO = 11; //PB3
static const uint8_t SCK = 9; //PB1
static const uint8_t SDA = 37; //PE5
static const uint8_t SCL = 36; //PE4
// #define LED_BUILTIN 13
static const uint8_t A0 = 40; //PF0
static const uint8_t A1 = 41; //PF1
static const uint8_t A2 = 42; //PF2
static const uint8_t A3 = 43; //PF3
static const uint8_t A4 = 44; //PF4
static const uint8_t A5 = 45; //PF5
static const uint8_t A6 = 46; //PF6
static const uint8_t A7 = 47; //PF7
// Not sure of that... atmega168 use PCICR whereas the atmegaxx9 seems to use a EIMSK register... Will it work ?
#define digitalPinToPCICR(p) ( (((p) >= 32) && ((p) <= 39)) || (((p) >= 8) && ((p) <= 15)) ? (&EIMSK) : \
((uint8_t *)0) ) )
#define digitalPinToPCICRbit(p) ( (((p) >= 32) && ((p) <= 39)) ? 4 : \
( (((p) >= 8) && ((p) <= 15)) ? 5 : \
((uint8_t *)0) ) )
#define digitalPinToPCMSK(p) ( (((p) >= 32) && ((p) <= 39)) ? (&PCMSK0) : \
( (((p) >= 8) && ((p) <= 15)) ? (&PCMSK1) : \
((uint8_t *)0) ) )
#define digitalPinToPCMSKbit(p) ( (((p) >= 32) && ((p) <= 39)) ? ((p) - 32) : \
( (((p) >= 8) && ((p) <= 15)) ? ((p) - 8) : \
((uint8_t *)0) ) )
#define digitalPinToInterrupt(p) ((p) == 24 ? 0 : NOT_AN_INTERRUPT)
#ifdef ARDUINO_MAIN
// these arrays map port names (e.g. port B) to the
// appropriate addresses for various functions (e.g. reading
// and writing)
const uint16_t PROGMEM port_to_mode_PGM[] = {
NOT_A_PORT,
(uint16_t) &DDRA,
(uint16_t) &DDRB,
(uint16_t) &DDRC,
(uint16_t) &DDRD,
(uint16_t) &DDRE,
(uint16_t) &DDRF,
(uint16_t) &DDRG,
};
const uint16_t PROGMEM port_to_output_PGM[] = {
NOT_A_PORT,
(uint16_t) &PORTA,
(uint16_t) &PORTB,
(uint16_t) &PORTC,
(uint16_t) &PORTD,
(uint16_t) &PORTE,
(uint16_t) &PORTF,
(uint16_t) &PORTG,
};
const uint16_t PROGMEM port_to_input_PGM[] = {
NOT_A_PORT,
(uint16_t) &PINA,
(uint16_t) &PINB,
(uint16_t) &PINC,
(uint16_t) &PIND,
(uint16_t) &PINE,
(uint16_t) &PINF,
(uint16_t) &PING,
};
const uint8_t PROGMEM digital_pin_to_port_PGM[] = {
PA, // 0 // LCD_Com0
PA, // LCD_Com1
PA, // LCD_Com2
PA,
PA, // LCD_Seg0
PA, // LCD_Seg1
PA, // LCD_Seg2
PA, // LCD_Seg3
PB, // 8 - NSS - PCINT8 // Contact - Thermostat installed on the valve
PB, // 9 - SCK - PCINT9 // KEY °C
PB, // 10 - MOSI - PCINT10 // KEY Prog
PB, // 11 - MISO - PCINT11 // KEY Auto/Manu
PB, // 12 - PWM - PCINT12 // H-Bridge 1
PB, // 13 - PWM - PCINT13 // Incremental coder A
PB, // 14 - PWM - PCINT14 // Incremental coder B
PB, // 15 - PWM - PCINT15 // H-Bridge 2
PC, // 16 // LCD_Seg12
PC, // 17 // LCD_Seg11
PC, // 18 // LCD_Seg10
PC, // 19 // LCD_Seg9
PC, // 20 // LCD_Seg8
PC, // 21 // LCD_Seg7
PC, // 22 // LCD_Seg6
PC, // 23 // LCD_Seg5
PD, // 24 - INT0
PD, // 25 // LCD_Seg21
PD, // 26 // LCD_Seg20
PD, // 27 // LCD_Seg19
PD, // 28 // LCD_Seg18
PD, // 29 // LCD_Seg17
PD, // 30 // LCD_Seg16
PD, // 31 // LCD_Seg15
PE, // 32 - RXD - PCINT0 // Header Pin7
PE, // 33 - TXD - PCINT1 // Header Pin6
PE, // 34 - PCINT2 // Header Pin2
PE, // 35 - PCINT3 // Activate reflective sensor
PE, // 36 - SCL - PCINT4 // Reflective sensor output
PE, // 37 - SDA - PCINT5
PE, // 38 - PCINT6
PE, // 39 - PCINT7
PF, // 40 - A0
PF, // 41 - A1
PF, // 42 - A2 // NTC measurement.
PF, // 43 - A3 // Activate NTC divider bridge
PF, // 44 - A4 - TCK // Header Pin4
PF, // 45 - A5 - TMS // Header Pin3
PF, // 46 - A6 - TDO // Header Pin5
PF, // 47 - A7 - TDI // Header Pin8
PG, // 48 // LCD_Seg14
PG, // 49 // LCD_Seg13
PG, // LCD_Seg4
PG, // H-Bridge 3
PG, // 52 // H-Bridge 4
NOT_A_PORT,
NOT_A_PORT,
NOT_A_PORT,
};
const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[] = {
_BV(0), /* 0, port A */
_BV(1),
_BV(2),
_BV(3),
_BV(4),
_BV(5),
_BV(6),
_BV(7),
_BV(0), /* 8, port B */
_BV(1),
_BV(2),
_BV(3),
_BV(4),
_BV(5),
_BV(6),
_BV(7),
_BV(0), /* 16, port C */
_BV(1),
_BV(2),
_BV(3),
_BV(4),
_BV(5),
_BV(6),
_BV(7),
_BV(0), /* 24, port D */
_BV(1),
_BV(2),
_BV(3),
_BV(4),
_BV(5),
_BV(6),
_BV(7),
_BV(0), /* 32, port E */
_BV(1),
_BV(2),
_BV(3),
_BV(4),
_BV(5),
_BV(6),
_BV(7),
_BV(0), /* 40, port F */
_BV(1),
_BV(2),
_BV(3),
_BV(4),
_BV(5),
_BV(6),
_BV(7),
_BV(0), /* 48, port G */
_BV(1),
_BV(2),
_BV(3),
_BV(4),
NOT_A_PIN,
NOT_A_PIN,
NOT_A_PIN,
};
const uint8_t PROGMEM digital_pin_to_timer_PGM[] = {
NOT_ON_TIMER, /* 0 - PA0 */
NOT_ON_TIMER, /* 1 - PA1 */
NOT_ON_TIMER, /* 2 - PA2 */
NOT_ON_TIMER, /* 3 - PA3 */
NOT_ON_TIMER, /* 4 - PA4 */
NOT_ON_TIMER, /* 5 - PA5 */
NOT_ON_TIMER, /* 6 - PA6 */
NOT_ON_TIMER, /* 7 - PA7 */
NOT_ON_TIMER, /* 8 - PB0 */
NOT_ON_TIMER, /* 9 - PB1 */
NOT_ON_TIMER, /* 10 - PB2 */
NOT_ON_TIMER, /* 11 - PB3 */
TIMER0A, /* 12 - PB4 */
TIMER1A, /* 13 - PB5 */
TIMER1B, /* 14 - PB6 */
TIMER2A, /* 15 - PB7 */
NOT_ON_TIMER, /* 16 - PC0 */
NOT_ON_TIMER, /* 17 - PC1 */
NOT_ON_TIMER, /* 18 - PC2 */
NOT_ON_TIMER, /* 19 - PC3 */
NOT_ON_TIMER, /* 20 - PC4 */
NOT_ON_TIMER, /* 21 - PC5 */
NOT_ON_TIMER, /* 22 - PC6 */
NOT_ON_TIMER, /* 23 - PC7 */
NOT_ON_TIMER, /* 24 - PD0 */
NOT_ON_TIMER, /* 25 - PD1 */
NOT_ON_TIMER, /* 26 - PD2 */
NOT_ON_TIMER, /* 27 - PD3 */
NOT_ON_TIMER, /* 28 - PD4 */
NOT_ON_TIMER, /* 29 - PD5 */
NOT_ON_TIMER, /* 30 - PD6 */
NOT_ON_TIMER, /* 31 - PD7 */
NOT_ON_TIMER, /* 32 - PE0 */
NOT_ON_TIMER, /* 33 - PE1 */
NOT_ON_TIMER, /* 34 - PE2 */
NOT_ON_TIMER, /* 35 - PE3 */
NOT_ON_TIMER, /* 36 - PE4 */
NOT_ON_TIMER, /* 37 - PE5 */
NOT_ON_TIMER, /* 38 - PE6 */
NOT_ON_TIMER, /* 39 - PE7 */
NOT_ON_TIMER, /* 40 - PF0 */
NOT_ON_TIMER, /* 41 - PF1 */
NOT_ON_TIMER, /* 42 - PF2 */
NOT_ON_TIMER, /* 43 - PF3 */
NOT_ON_TIMER, /* 44 - PF4 */
NOT_ON_TIMER, /* 45 - PF5 */
NOT_ON_TIMER, /* 46 - PF6 */
NOT_ON_TIMER, /* 47 - PF7 */
NOT_ON_TIMER, /* 48 - PG0 */
NOT_ON_TIMER, /* 49 - PG1 */
NOT_ON_TIMER, /* 50 - PG2 */
NOT_ON_TIMER, /* 51 - PG3 */
NOT_ON_TIMER, /* 52 - PG4 */
NOT_ON_TIMER, /* 53 - PG5 dose not exist*/
NOT_ON_TIMER, /* 54 - PG6 dose not exist*/
NOT_ON_TIMER /* 55 - PG7 dose not exist*/
};
#endif
// These serial port names are intended to allow libraries and architecture-neutral
// sketches to automatically default to the correct port name for a particular type
// of use. For example, a GPS module would normally connect to SERIAL_PORT_HARDWARE_OPEN,
// the first hardware serial port whose RX/TX pins are not dedicated to another use.
//
// SERIAL_PORT_MONITOR Port which normally prints to the Arduino Serial Monitor
//
// SERIAL_PORT_USBVIRTUAL Port which is USB virtual serial
//
// SERIAL_PORT_LINUXBRIDGE Port which connects to a Linux system via Bridge library
//
// SERIAL_PORT_HARDWARE Hardware serial port, physical RX & TX pins.
//
// SERIAL_PORT_HARDWARE_OPEN Hardware serial ports which are open for use. Their RX & TX
// pins are NOT connected to anything by default.
#define SERIAL_PORT_MONITOR Serial
#define SERIAL_PORT_HARDWARE Serial
#endif
DISCLAIMER: The previous file has been created by myself by mixing several sources.I am notan arduino nor AVR expert, and I do not guarantee that everything is correct. Specificaly, i have some doubt about the pin change interupts... to be tested and improved.
So once this file has been created, i can start arduino and create a simple "blink" sketch.
/*
Blink
Turns on an LED on for one second, then off for one second, repeatedly.
This example code is in the public domain.
*/
int led = 34; // pin 34 = PE2, a pin exposed on the connector of the TRV.
// the setup routine runs once when you press reset:
void setup() {
// initialize the digital pin as an output.
pinMode(led, OUTPUT);
}
// the loop routine runs over and over again forever:
void loop() {
digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(led, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
}
Menu Tool / Card Type, i select the HR25 entry. Then, i select file/ upload with programmer and voila !
The sketch compile and is loaded through the isp pins.
Then i can see the PE2 pin blinking... Howeer, the frequecy is not correct . Instead of blinking every 1s I have a blink every 8seconds... i guess i have a problem of frequency scaling.... to be investigated but it's a good start !