Forum: Mikrocontroller und Digitale Elektronik Atmega8 isp programieren


von Uwe H. (blackboxv)


Lesenswert?

Hallo Werte Foren Mitglieder,
Ich habe einen Atmega8 versehentlich alle Port c Pins auf Ausgang 
programmiert. Danach ging nichts mehr. Zum bedauern musste ich 
feststellen, der Reset Pin ist auf Port c.
Habe ich mir damit den Chip zerschossen ?
Als Programmer verwende ich STK500 und Software AtmelStudio 6.2.
Muss ich den Chip in die Tonne hauen oder hab ich noch eine Chance ?
Vielen Dank für Eure Hilfe.

von Joachim B. (jar)


Lesenswert?

soweit ich das weiss brauchst du einen HV Prommer um den zu "resetten" 
oder trotzdem noch programmieren zu können

http://www.mikrocontroller.net/articles/AVR_HV-Programmer

von Oliver S. (oliverso)


Lesenswert?

Uwe Hohnstock schrieb:
> Ich habe einen Atmega8 versehentlich alle Port c Pins auf Ausgang
> programmiert.

Wie?

Solange du da nur das DDRC-Register verändert hast, passiert dem 
Reset-Pin gar nichts. Nur wenn du per RSTDISBL-Fuse den Reset-Pin zum IO 
umgewandelt hast, geht die Programmierung per ISP nicht mehr.

Rückgängig machen lässt sich das nur per HV-Programierung, z.B. mit 
einem STK500.

Oliver

von Uwe H. (blackboxv)


Lesenswert?

Hallo Oliver, danke für Deine Antwort.
Ich habe folgendes Programm auf den Atmega8 geschrieben. es ist eine 
Kopie (alle Rechte verbleiben bei dem Autor)
Copy...
1
;****************************************************************************** 
2
;*
3
;*  Titel:          LED Blinkprogramm
4
;*  Autor:          Rüdiger Kluge
5
;*  Version:        01.01.0003
6
;*  Build date:     22.12.08
7
;*  Target:         ATmega8
8
;*
9
;*  Zweck:
10
;*  Eine an PORTB, PB0 angeschlossene LED blinkt
11
;*  Die Periode des Blinkens kann mit den Variablen
12
;*      delay_0
13
;*      delay_1
14
;*      delay_2
15
;*  eingestellt werden.
16
;*
17
;******************************************************************************
18
19
20
;******************************************************************************
21
;* Definitionen
22
;******************************************************************************
23
24
;.include "m8def.inc"        ; Definitionen für ATmega8
25
.def temp       = r16       ; temp ist symbolischer Name für Register 16
26
                            ; wird als temporäre Variable verwendet
27
.def delay_0    = r17       ; delay_0 ist symbolischer Name für Register 17 
28
.def delay_1    = r18       ; delay_1 ist symbolischer Name für Register 18
29
.def delay_2    = r19       ; delay_2 ist symbolischer Name für Register 19
30
.equ LED_0      = ~0b00000001   
31
                            ; Konstante für LED_0, ~0b00000001 = 0b11111110
32
                            ; ~ bedeutet Bitwise Not
33
                            ; Die LED leuchtet, wenn der Ausgang PORTB = 0 ist
34
                            ; da die LED über einen Widerstand an V++ 
35
                            ; geschaltet ist.
36
37
;******************************************************************************
38
;*  Programm Start nach Reset
39
;* 
40
;*  der Stackpointer wird initialisiert
41
;*  RAMEND = $045F = 1119 beim ATmega8
42
;*  Register werden gesetzt
43
;******************************************************************************
44
45
RESET:                          ; hier startet der Code nach einem Reset
46
    ldi     r16,high(RAMEND)    ; $04 wird in Register 16 geladen 
47
    out     SPH,r16             ; SPH, oberes Byte des Stackpointers wird $04 
48
    ldi     r16,low(RAMEND)     ; $5F wird in Register 16 geladen 
49
    out     SPL,r16             ; SPL, unteres Byte des Stackpointers wird $5F
50
    ser     temp                ; temp wird $FF = 255 (ser = Set Register)
51
    out     DDRB,temp           ; setzt alle PINs von PORTB als Ausgang
52
    ldi     temp,LED_0          ; temp wird 0b11111110
53
54
55
;******************************************************************************
56
;*  Hauptprogramm
57
;* 
58
;*  eine endlose Schleife
59
;******************************************************************************
60
61
MAIN:                           ; hier startet das Hauptprogramm
62
    ldi     delay_0, 0          ; delay_0 wird 0
63
    ldi     delay_1, 0          ; delay_1 wird 0
64
    ldi     delay_2, 4          ; delay_1 wird 4, delay_1 > 0 wählen    
65
    out     PORTC,temp          ; PORTB, PIN0 wird gesetzt
66
    com     temp                ; Einerkomplement bilden
67
    ori     temp,LED_0          ; temp wird temp ODER LED_0
68
    rcall   SUB_DELAY           ; Verzögerung, Sprung zu Unterprogramm           
69
    rjmp    MAIN                ; springt zurück zu MAIN:
70
71
72
;*******************************************************************************
73
;* Unterprogramm SUB_DELAY
74
;* 
75
;* erzeugt eine Verzögerung für das Blinken
76
;* 
77
;*******************************************************************************
78
79
SUB_DELAY:                      ; hier ist der Einsprung ins Unterprogramm
80
                        
81
                                ; hier beginnt die innere Schleife
82
    dec     delay_0             ; delay_0 = delay_0 - 1
83
    brne    SUB_DELAY           ; wird ausgeführt, solange delay_0 nicht 0 ist
84
                                ; springt zu SUB_DELAY:
85
86
                                ; hier beginnt die mittlere Schleife
87
    dec     delay_1             ; delay_1 = delay_1 - 1
88
    brne    SUB_DELAY           ; wird ausgeführt, solange delay_1 nicht 0 ist
89
                                ; springt zu SUB_DELAY:
90
91
                                ; hier beginnt die äussere Schleife
92
    dec     delay_2             ; delay_2 = delay_2 - 1
93
    brne    SUB_DELAY           ; wird ausgeführt, solange delay_1 nicht 0 ist
94
                                ; springt zu SUB_DELAY:
95
96
    ret                         ; Sprung zurück ins Hauptprogramm zur 
97
                                ; Instruktion nach
98
                                ; rcall SUB_DELAY, also rjmp
Da meine LED an Port C angeschlossen sind, habe ich den Quellcode von b 
auf C geändert.
Seit dem kann ich nicht mehr auf den Controller zugreifen.
Ich hoffe Du hast eine Idee.
Vielen Dank Uwe

von Uwe H. (blackboxv)


Lesenswert?

PS: bei den Fuse Bit'S habe ich nichts geändert

von Karl H. (kbuchegg)


Lesenswert?

Uwe Hohnstock schrieb:

> Da meine LED an Port C angeschlossen sind, habe ich den Quellcode von b
> auf C geändert.

Ja, aber nur halb.
1
     out     DDRB,temp           ; setzt alle PINs von PORTB als Ausgang

wenn du deine LEDs am Port C hast, dann musst du auch das DDRC benutzen, 
um die Pins auf Ausgang zu schalten.

> Seit dem kann ich nicht mehr auf den Controller zugreifen.

Kontrollier nochmal alles.

Durch dieses Programm kannst du dir nichts wirklich zerstören. Und 
solange du nicht an den Fuse Bits gespielt hast, ist der µC auch kein 
Fall für die Tonne. So schnell gehen die nicht kaputt.

von Jörn P. (jonnyp)


Lesenswert?

Am Einfachsten ist es doch wohl, den Mega8 direkt auf das STK500 zu 
setzen und mal die Signatur auszulesen.
Solltest du den µC nicht aus der Schaltung nehmen können mußt du 
zumindest deine Connection vom Reset Pin entfernen und dann versuchen 
mit ihm "zu reden" ;-)

von Uwe H. (blackboxv)


Lesenswert?

Hi, das werde ich mal versuchen, den RESET" Pin kann ich auftrennen. 
Doch wenn ich das mache, kann ich ihn dann noch auslesen ?
Im Moment funzt das nicht (RESET angeschlossen). Eine feste Schaltung 
SMD.
Werde es ausprobieren, erst mal Danke und ich sag bescheid.
Gruß Uwe

von Stefan F. (Gast)


Lesenswert?

Er meinte, dass du vom Reset Pin alles abmachen sollst - außer die 
Leitung zum Programmer.

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.