Controller tot durch Programm ?

OP #2308792
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
OP #2308807
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?!
Gast #2308813
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
OP #2309059
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
}
#2309075
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.
Gast #2309145
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?
#2309157
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.
#2309166
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?
OP #2309182
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren