Forum: Mikrocontroller und Digitale Elektronik Controller tot durch Programm ?


von Rush .. (rush)


Lesenswert?

Ist es durch ein simples Programm, welches alle 100ms einen Wert über 
den UART ausspuckt, möglich den Controller dermaßen zu schießen dass man 
nicht mal mehr dessen Signatur lesen kann??
Genau das ist mir passiert und ich komme über das AVR-Studio an das gute 
Stück nicht mehr dran.
Hat jemand eine Idee ?

Ist übrigens ein ATMega644P

von moep (Gast)


Lesenswert?

Wohl kaum...
Fehler in der Schaltung möglich?
Verfused?

von Rush .. (rush)


Lesenswert?

ne ganz und garnicht. setze im programm keinerlei fuses. nur die 
register fürn uart und das wars.
was mir allerdings auffällt. nachdem ich die schaltung einschalte blinkt 
die TX-LED fleißig. Aber irgendwann hört sie einfach auf.... vielleicht 
trägt dieses phänomen zur problemlösung bei?!

von Johann (Gast)


Lesenswert?

Spannungsversorgung kaputt?

von Rush .. (rush)


Lesenswert?

nö auch ok. die kann ich noch übers AVR-Studio lesen

von spess53 (Gast)


Lesenswert?

Hi

>was mir allerdings auffällt. nachdem ich die schaltung einschalte blinkt
>die TX-LED fleißig. Aber irgendwann hört sie einfach auf.... vielleicht
>trägt dieses phänomen zur problemlösung bei?!

Stack-Überlauf? Ohne dein Programm ist das nur Rätselraten.

MfG Spess

von Pascal H. (pase-h)


Lesenswert?

Wie wärs mal mit einem Foto oder Schaltplan der Schaltung?
Der Source Code wäre auch nicht schlecht.

Mfg

von Rush .. (rush)


Lesenswert?

die main:
1
#include <avr/io.h>
2
#include "usart.h"
3
#include <util/delay.h>
4
#include <avr/interrupt.h>
5
volatile unsigned char rx_cnt = 0;
6
volatile unsigned char rx[20]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
7
8
9
ISR (USART0_RX_vect)
10
{
11
  unsigned char tmp = 0;
12
  tmp = uart_getc();
13
  rx[rx_cnt] = tmp;
14
  rx_cnt++;
15
}
16
17
18
19
void main (void)
20
{
21
  USART_INIT();
22
  sei();
23
  
24
  
25
  while(1)
26
  {
27
    
28
    writeChar(rx[0]);
29
    _delay_ms(100);
30
    writeChar(rx[1]);
31
    
32
  }
33
34
}

und die uart.c:
1
#include <avr/io.h>
2
#include "usart.h"
3
4
#define BAUD 9600UL      // Baudrate
5
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
6
7
8
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
9
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
10
11
#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
12
  #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch!
13
#endif
14
15
16
void USART_INIT(void)
17
{
18
  // 8N1, Parity: None, 9600 Baud
19
20
21
  USART_UBRRH = 0x00;
22
  USART_UBRRL = UBRR_VAL;
23
  
24
  USART_UCSRB |= (1 << USART_TXEN) | (1<<USART_RXEN) | (1<<USART_RXCIE);
25
  USART_UCSRC |= (1 << UCSZ01) | (1<<UCSZ00);    // muss außer der des Headerfiles angepasst werden
26
}
27
28
void writeChar(unsigned char c)
29
{
30
  while (!(USART_UCSRA & (1<<USART_UDRE)));
31
    USART_UDR = c ;
32
}
33
34
35
uint8_t uart_getc(void)
36
{
37
    while (!(USART_UCSRA & (1<<USART_RXC)))   // warten bis Zeichen verfuegbar
38
        ;
39
    return USART_UDR;                   // Zeichen aus UDR an Aufrufer zurueckgeben
40
}

von Karl H. (kbuchegg)


Lesenswert?

Rush ... schrieb:
> Ist es durch ein simples Programm, welches alle 100ms einen Wert über
> den UART ausspuckt, möglich den Controller dermaßen zu schießen dass man
> nicht mal mehr dessen Signatur lesen kann??

Könnte höchstens sein, dass dir beim letzten Brennen irgendwas passiert 
ist und sich die Fuses ungewollt verstellt haben. Ist mir auch schon 
passiert.

Mit deinem Programm hat das aber nix zu tun. Das ist eine Frage der 
Fuses.

von Rush .. (rush)


Lesenswert?

so eine sch....
wisst ihr wie ich die gurke irgendwie wiederbeleben kann ??

von ♪Geist (Gast)


Lesenswert?

Hast du JTAG oder MKII oder oder?
Wenn du MKII USB hast, stell die ISP Frequenz runter bis auf weniger 
KHz.

von Floh (Gast)


Lesenswert?

> ISR (USART0_RX_vect)
> {
>   unsigned char tmp = 0;
>   tmp = uart_getc();
>   rx[rx_cnt] = tmp;
>   rx_cnt++;
> }
Ein nicht überprüfter Laufindex.
Wie stellst du sicher, dass du nicht irgnedwann in nicht gewollte 
Speicherbereiche schreibst?
Schickst du dem Board auch per UART was?

von Thomas E. (thomase)


Lesenswert?

Floh schrieb:
> Ein nicht überprüfter Laufindex.
> Wie stellst du sicher, dass du nicht irgnedwann in nicht gewollte
> Speicherbereiche schreibst?
> Schickst du dem Board auch per UART was?

Das ist völlig egal. Davon geht er weder kaputt, noch verstellen sich 
die Fuses.

Rush ... schrieb:
> wisst ihr wie ich die gurke irgendwie wiederbeleben kann ??

Hast du noch eine andere Schaltung, wo du den reinsetzen kannst?

mfg.

von Karl H. (kbuchegg)


Lesenswert?

Rush ... schrieb:
> so eine sch....
> wisst ihr wie ich die gurke irgendwie wiederbeleben kann ??

Hmm. das ist jetzt schwer.

Ursprünglich war ich versucht zu sagen: Häng einen externen Takt drann. 
Aber dann ist mir eingefallen, dass du erzählt hast, dass dein µC nach 
einem Reset offenbar irgendwas macht (wegen der Tx LED), also wird es 
nicht am Takt liegen.

Hochvoltprogrammierung?

von Rush .. (rush)


Lesenswert?

Ich hab einen AVR-Dragon.

Die Sache mit dem Laufindex stimmt wohl. Dann müsste aber rx_cnt 
überlaufen und wieder von vorne zählen. Da ich dem UART in diesem fall 
aber nichts schicke wird der ISR ja garnicht ausgelöst.

Ich hätte irgendwo noch ein STK500 rumfliegen. Damit müsste ich ja per 
ISP draufkommen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.