Bääääär
10.04.2008, 17:00
Hallo Roboternetz.
Ich bin gerade ziemlich fertig und ratlos, was mein Problem betrifft.
Ich habe hier einen ATMega2561 auf einen Board. Dieser wurde von mir bereits mehrfach geflasht und hat bisher auch funktioniert. Zudem befinden sich auf dem Board noch ein Funkmodul von Pollin (RFM02) ein MAX232-Pegelwandler und einige Kleinteile.
Nun ist der aktuell verbaute Controller nicht mehr über ISP ansprechbar. Ich habe sonst keinerlei Möglichkeit, den Controller zu prüfen. Der Einzige Anhaltspukt, den ich habe ist:
Ich hatte vorher schonmal einen anderen Controller auf dem Board verbaut, der ebenfalls funktionierte. Ich flashte ein Programm drauf, das den SPI-Bus initialisierte und anschließend das Funkmodul dazu veranlassen sollte, die Taktfrequenz an seinem CLK-Pin (die ich als Takt für den Prozessor verwende) von 1Mhz auf 10Mhz umzuschalten. Ob mein Programm geht, weiß ich bis heute nicht. Fakt ist, dass dieser Prozessor daraufhin nicht mehr anprechbar war. Also habe ich ihn mühevoll ausgebaut und einen Neuen draufgelötet. Dann noch als "Funktionsindikator" das An- und Ausschalten einer LED in das Programm eingefügt und wieder geflasht. Seitdem ist auch dieser Prozessor nicht mehr nutzbar.
Desweiteren fiel mir noch etwas auf. Der Prozessor ist auf der Unterseite des Boards verlötet. Unmittelbar nachdem der neue Prozessor eingesetzt war, flashte ich ein LED-Blink Programm drauf, um zu testen, ob alles geht. Ging auch. Das war gestern Abend. Heute schalte ich das Board an und bilde mir ein, einen Lichtblitz _durch_ die Platine gesehen zu haben, und zwar genau dort, wo der Prozessor drunter ist. Schon voller Angst, es könnte etwas zerstört sein, öffne ich PonyProg und lese die Daten des uC's. PonyProg machte mir keinen Fehler. Ich flashe mein "Problemprogramm" und seitdem geht nichts mehr.
Ich weiß nicht mehr genau, ob der erste uC auch einen solchen Blitz erlebt hat, vermute es aber. Ob er unmittelbar nach dem Blitz noch zu flashen war, wie es ja beim 2. Prozessor der Fall war, weiß ich nicht mehr. Von unten sieht er ganz normal aus. Es wurde auch bei beiden uC's nichts heiß oder hat geraucht oder gestunken.
Was mir Kopfzerbrechen bereitet:
- Was war das für ein Lichtblitz?
--- Hat er etwas zerstört und hat PonyProg einmal fälschlicherweise ausgelesen und auch noch geflasht ;
--- oder habe ich mir den nur eingebildet und PonyProg hat wirklich geflasht und ausgelesen (Das bedeutet, mein Programm und nicht der Blitz hat den uC zerstört)?
- Woher könnte der Lichtblitz (wenn es ihn denn gab) gekommen sein?
- Was kann man in einem Programm falsch machen, was den Prozessor zerstören könnte? (Programm angehängt)
Im Anhang ist das Layout und der Schaltplan, hier noch das besagte Problemporgramm:
#include <AVRlib\avrlibtypes.h>
#include <inttypes.h>
#include <avr\io.h>
void Keyboard_ReceiveMessage(unsigned char c);
char dispbuffer [5];
#define UART_RX_BUFFER_SIZE 0x0000
#define UART_TX_BUFFER_SIZE 128
#include <stdlib.h>
#include <avr\interrupt.h>
#include <util\delay.h>
#include <adc.c>
#include <SPI.c>
#include <lcd.c>
#include <Funk.c>
#include <midi_messages.h>
#include <All.c>
#include <PitchBend.c>
#include <Distance.c>
#include <Keyboard.c>
#include <neck.c>
int main(void) {
DDRF |= (1<<PF3);
PORTF |= (1<<PF3);
SPI_Init();
for (unsigned char i=0; i<15; i++)
_delay_ms(10); // wait until POR done
Funk_Init();
PORTF &= ~(1<<PF3);
while (1) {
_delay_ms(500);
PORTF |= (1<<PF3);
Funk_SetCrystalFreq(0);
_delay_ms(500);
PORTF &= ~(1<<PF3);
Funk_SetCrystalFreq(8);
}
}
Sowie de SPI.c
///////////////////////////////////////////////////////////////////////////////////////////////////////
// SPI ////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////
#define SPI_PORT PORTB
#define SPI_DDR DDRB
#define SPI_PIN PINB
#define SPI_MISO PB3
#define SPI_MOSI PB2
#define SPI_SCK PB1
//char SPI_Ready;
void SPI_Init(void);
void SPI_WriteByte(char b);
char SPI_TransmitByte(char b);
void SPI_Init(void){
// Define MOSI and SCK as output
SPI_DDR |= (1<<SPI_MOSI) | (1<<SPI_SCK);
// Configure as Master
SPCR |= (1<<MSTR);
// Set ClockRate to fck/16
SPCR |= (1<<SPR0);
// Send MSB first
SPCR |= (1<<CPOL);
// Finally Enable SPI
SPCR = (1<<SPE);
//SPI_Ready = TRUE;
}
void SPI_WriteByte(char b) {
SPDR = b;
// wait for the transmission to be complete
while(!(SPSR & (1<<SPIF)));
}
Und die Funk.c
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Defines ////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////
//#define FC_Crystal
#define SS_PORT PORTD
#define SS_DDR DDRD
#define SS_PIN PD5
#define FUNK_SELECT SS_PORT &= ~(1<<SS_PIN);
#define FUNK_DISSELECT SS_PORT |= (1<<SS_PIN);
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Variables //////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////
char Funk_Config[2]; // Containing now used parameters for the Configuration Setting Command
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Functions //////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////
void Funk_Putc(char c){
SPI_WriteByte(c);
}
void Funk_Init(void){
// Configure the slave select line as output
SS_DDR |= (1<<SS_PIN);
// Set the slave select line to low, to signalize the transmitter, that data will be send now
FUNK_SELECT;
// 433Mhz frequency band, 10Mhz crystal output
Funk_Config[0] = 0b10001000;
//
Funk_Config[1] = 0b00110000;
// Send the Configuration Setting Command
Funk_Putc(Funk_Config[0]);
Funk_Putc(Funk_Config[1]);
// Set the SS-line to high-state, to signalize, that all data was sent
FUNK_DISSELECT;
}
void Funk_SetCrystalFreq(char Freq) {
FUNK_SELECT;
if (Freq > 8)
Freq = 8;
Funk_Config[0] |= Freq;
Funk_Putc(Funk_Config[0]);
Funk_Putc(Funk_Config[1]);
FUNK_DISSELECT;
}
Meine bitte ist nun, jede Idee, die euch einfällt zu posten. Ich habe keine Ahnung, was die beide uC's zerstört haben könnte, zumal die möglichen Ursachen sehr eigenartig sind. (Flashen nach dem Blitz... usw.)
Vielen Dank für jede Hilfe,
Bääääär
Ich bin gerade ziemlich fertig und ratlos, was mein Problem betrifft.
Ich habe hier einen ATMega2561 auf einen Board. Dieser wurde von mir bereits mehrfach geflasht und hat bisher auch funktioniert. Zudem befinden sich auf dem Board noch ein Funkmodul von Pollin (RFM02) ein MAX232-Pegelwandler und einige Kleinteile.
Nun ist der aktuell verbaute Controller nicht mehr über ISP ansprechbar. Ich habe sonst keinerlei Möglichkeit, den Controller zu prüfen. Der Einzige Anhaltspukt, den ich habe ist:
Ich hatte vorher schonmal einen anderen Controller auf dem Board verbaut, der ebenfalls funktionierte. Ich flashte ein Programm drauf, das den SPI-Bus initialisierte und anschließend das Funkmodul dazu veranlassen sollte, die Taktfrequenz an seinem CLK-Pin (die ich als Takt für den Prozessor verwende) von 1Mhz auf 10Mhz umzuschalten. Ob mein Programm geht, weiß ich bis heute nicht. Fakt ist, dass dieser Prozessor daraufhin nicht mehr anprechbar war. Also habe ich ihn mühevoll ausgebaut und einen Neuen draufgelötet. Dann noch als "Funktionsindikator" das An- und Ausschalten einer LED in das Programm eingefügt und wieder geflasht. Seitdem ist auch dieser Prozessor nicht mehr nutzbar.
Desweiteren fiel mir noch etwas auf. Der Prozessor ist auf der Unterseite des Boards verlötet. Unmittelbar nachdem der neue Prozessor eingesetzt war, flashte ich ein LED-Blink Programm drauf, um zu testen, ob alles geht. Ging auch. Das war gestern Abend. Heute schalte ich das Board an und bilde mir ein, einen Lichtblitz _durch_ die Platine gesehen zu haben, und zwar genau dort, wo der Prozessor drunter ist. Schon voller Angst, es könnte etwas zerstört sein, öffne ich PonyProg und lese die Daten des uC's. PonyProg machte mir keinen Fehler. Ich flashe mein "Problemprogramm" und seitdem geht nichts mehr.
Ich weiß nicht mehr genau, ob der erste uC auch einen solchen Blitz erlebt hat, vermute es aber. Ob er unmittelbar nach dem Blitz noch zu flashen war, wie es ja beim 2. Prozessor der Fall war, weiß ich nicht mehr. Von unten sieht er ganz normal aus. Es wurde auch bei beiden uC's nichts heiß oder hat geraucht oder gestunken.
Was mir Kopfzerbrechen bereitet:
- Was war das für ein Lichtblitz?
--- Hat er etwas zerstört und hat PonyProg einmal fälschlicherweise ausgelesen und auch noch geflasht ;
--- oder habe ich mir den nur eingebildet und PonyProg hat wirklich geflasht und ausgelesen (Das bedeutet, mein Programm und nicht der Blitz hat den uC zerstört)?
- Woher könnte der Lichtblitz (wenn es ihn denn gab) gekommen sein?
- Was kann man in einem Programm falsch machen, was den Prozessor zerstören könnte? (Programm angehängt)
Im Anhang ist das Layout und der Schaltplan, hier noch das besagte Problemporgramm:
#include <AVRlib\avrlibtypes.h>
#include <inttypes.h>
#include <avr\io.h>
void Keyboard_ReceiveMessage(unsigned char c);
char dispbuffer [5];
#define UART_RX_BUFFER_SIZE 0x0000
#define UART_TX_BUFFER_SIZE 128
#include <stdlib.h>
#include <avr\interrupt.h>
#include <util\delay.h>
#include <adc.c>
#include <SPI.c>
#include <lcd.c>
#include <Funk.c>
#include <midi_messages.h>
#include <All.c>
#include <PitchBend.c>
#include <Distance.c>
#include <Keyboard.c>
#include <neck.c>
int main(void) {
DDRF |= (1<<PF3);
PORTF |= (1<<PF3);
SPI_Init();
for (unsigned char i=0; i<15; i++)
_delay_ms(10); // wait until POR done
Funk_Init();
PORTF &= ~(1<<PF3);
while (1) {
_delay_ms(500);
PORTF |= (1<<PF3);
Funk_SetCrystalFreq(0);
_delay_ms(500);
PORTF &= ~(1<<PF3);
Funk_SetCrystalFreq(8);
}
}
Sowie de SPI.c
///////////////////////////////////////////////////////////////////////////////////////////////////////
// SPI ////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////
#define SPI_PORT PORTB
#define SPI_DDR DDRB
#define SPI_PIN PINB
#define SPI_MISO PB3
#define SPI_MOSI PB2
#define SPI_SCK PB1
//char SPI_Ready;
void SPI_Init(void);
void SPI_WriteByte(char b);
char SPI_TransmitByte(char b);
void SPI_Init(void){
// Define MOSI and SCK as output
SPI_DDR |= (1<<SPI_MOSI) | (1<<SPI_SCK);
// Configure as Master
SPCR |= (1<<MSTR);
// Set ClockRate to fck/16
SPCR |= (1<<SPR0);
// Send MSB first
SPCR |= (1<<CPOL);
// Finally Enable SPI
SPCR = (1<<SPE);
//SPI_Ready = TRUE;
}
void SPI_WriteByte(char b) {
SPDR = b;
// wait for the transmission to be complete
while(!(SPSR & (1<<SPIF)));
}
Und die Funk.c
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Defines ////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////
//#define FC_Crystal
#define SS_PORT PORTD
#define SS_DDR DDRD
#define SS_PIN PD5
#define FUNK_SELECT SS_PORT &= ~(1<<SS_PIN);
#define FUNK_DISSELECT SS_PORT |= (1<<SS_PIN);
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Variables //////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////
char Funk_Config[2]; // Containing now used parameters for the Configuration Setting Command
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Functions //////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////
void Funk_Putc(char c){
SPI_WriteByte(c);
}
void Funk_Init(void){
// Configure the slave select line as output
SS_DDR |= (1<<SS_PIN);
// Set the slave select line to low, to signalize the transmitter, that data will be send now
FUNK_SELECT;
// 433Mhz frequency band, 10Mhz crystal output
Funk_Config[0] = 0b10001000;
//
Funk_Config[1] = 0b00110000;
// Send the Configuration Setting Command
Funk_Putc(Funk_Config[0]);
Funk_Putc(Funk_Config[1]);
// Set the SS-line to high-state, to signalize, that all data was sent
FUNK_DISSELECT;
}
void Funk_SetCrystalFreq(char Freq) {
FUNK_SELECT;
if (Freq > 8)
Freq = 8;
Funk_Config[0] |= Freq;
Funk_Putc(Funk_Config[0]);
Funk_Putc(Funk_Config[1]);
FUNK_DISSELECT;
}
Meine bitte ist nun, jede Idee, die euch einfällt zu posten. Ich habe keine Ahnung, was die beide uC's zerstört haben könnte, zumal die möglichen Ursachen sehr eigenartig sind. (Flashen nach dem Blitz... usw.)
Vielen Dank für jede Hilfe,
Bääääär