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
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?!
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
Wie wärs mal mit einem Foto oder Schaltplan der Schaltung? Der Source Code wäre auch nicht schlecht. Mfg
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 | }
|
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.
so eine sch.... wisst ihr wie ich die gurke irgendwie wiederbeleben kann ??
Hast du JTAG oder MKII oder oder? Wenn du MKII USB hast, stell die ISP Frequenz runter bis auf weniger KHz.
> 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?
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.
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.