Forum: Mikrocontroller und Digitale Elektronik ATMega644p: Kein Reset nach Programmiervorgang


von Frank G. (dg1sbg)


Lesenswert?

Leider, leider: Mein neuer ATMega644p lässt sich nun zwar programmieren, 
macht aber kein Reset nach dem Programmiervorgang. Auch scheint er das 
neue Prg nicht angenommen zu haben, obwohl mein STK500v2 sagt, dass der 
Flash Inhalt dem Hex File entspricht.

Diesen Effekt hatte ich beim vorher eingesetzten ATmega32 nicht.

Auch lässt sich der AVR durch einen Druck auf den RESET Taster am 
Mini-Mega-Board (Elektor) nicht zu einem Neustart bewegen.

Hmmmm ! Wat nu?

Danke für Hinweise!!!

Viele Grüße
  Frank

von Hubert G. (hubertg)


Lesenswert?

Wie stellst du fest das es nicht läuft?
Was hast du wo dran, kenn das Mini-Megaboard nicht.

von Frank G. (dg1sbg)


Lesenswert?

Hallo Hubert,

Hubert G. schrieb:
> Wie stellst du fest das es nicht läuft?

Zum einen vertraue ich den avrdude Meldungen:
1
avrdude: AVR device initialized and ready to accept instructions
2
3
Reading | ################################################## | 100% 0.01s
4
5
avrdude: Device signature = 0x1e960a
6
avrdude: safemode: lfuse reads as EE
7
avrdude: safemode: hfuse reads as 99
8
avrdude: safemode: efuse reads as FD
9
avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed
10
         To disable this feature, specify the -D option.
11
avrdude: erasing chip
12
avrdude: reading input file "psuctrl.hex"
13
avrdude: input file psuctrl.hex auto detected as Intel Hex
14
avrdude: writing flash (23816 bytes):
15
16
Writing | ################################################## | 100% 33.84s
17
18
avrdude: 23816 bytes of flash written
19
avrdude: verifying flash memory against psuctrl.hex:
20
avrdude: load data flash data from input file psuctrl.hex:
21
avrdude: input file psuctrl.hex auto detected as Intel Hex
22
avrdude: input file psuctrl.hex contains 23816 bytes
23
avrdude: reading on-chip flash data:
24
25
Reading | ################################################## | 100% 30.19s
26
27
avrdude: verifying ...
28
avrdude: 23816 bytes of flash verified
29
30
avrdude: safemode: lfuse reads as EE
31
avrdude: safemode: hfuse reads as 99
32
avrdude: safemode: efuse reads as FD
33
avrdude: safemode: Fuses OK
34
35
avrdude done.  Thank you.

Zum anderen sehe ich nicht, dass meine Kontroll-LED, ein Lebenszeichen 
gibt. Wie gesagt: Mit dem ATmega32 geht das...

Code-Auszug:
1
void init_port_b ( void )
2
{
3
  ATOMIC_BLOCK( ATOMIC_RESTORESTATE )
4
  {
5
    DDRB |= (1<<PB0);        // Set line 0 of port B as output
6
    DDRB |= (1<<PB1);        // Set line 1 of port B as output
7
    DDRB |= (1<<PB2);        // Set line 2 of port B as output
8
    DDRB |= (1<<PB3);        // Set line 3 of port B as output
9
    DDRB |= (1<<PB4);        // Set line 4 of port B as output
10
11
    // Heartbeat LED: Line 0 -> Switch off initially
12
13
    PORTB &= ~( 1<<PB0 );
14
15
    asm volatile ( "nop" );  // Give the AVR time to settle
16
  }
17
18
  return;
19
}
20
21
void set_error_led( void )
22
{
23
  PORTB = PINB | (1 << PB0);
24
}
25
26
void clear_error_led( void )
27
{
28
  PORTB = PINB & ~(1 << PB0);
29
}
30
31
void dit(void)
32
{
33
  clear_error_led();
34
  set_error_led();
35
  _delay_ms( 100 );
36
  clear_error_led();
37
}
38
39
void dah( void )
40
{
41
  clear_error_led();
42
  set_error_led();
43
  _delay_ms( 250 );
44
  clear_error_led();
45
}
46
47
void roger( void )
48
{
49
  dit();
50
  dah();
51
  dit();
52
}
53
54
void init_io_timer ( void )
55
{
56
  ATOMIC_BLOCK( ATOMIC_RESTORESTATE )
57
  {
58
    // We use timer 1 (16 bit Timer) in CTC mode. This timer shall
59
    // generate an interrupt every PSU_IO_UPDATE_INTERVAL seconds.
60
    // Prescaler has to be set to 1 !
61
62
    OCR1A  = (unsigned short)
63
      ((unsigned long) F_CPU / PSU_IO_IRQS_PER_SECOND /
64
       PSU_IO_TIMER_PRESCALE - 1);           // Load the timer compare value
65
    
66
    TCNT1  = 0;                              // Reset counter value
67
    TCCR1A = 0;                              // No PWM
68
    TCCR1B = _BV( WGM12 ) | _BV( CS11 );     // Set CTC mode
69
    TIMSK0 |= _BV( OCIE1A );                 // Output Compare A Interrupt 
70
  }
71
}
72
73
rc_t greet( unsigned long nDelayMilliSeconds )
74
{
75
  rc_t nRC = RC_OK;
76
  
77
  // Line 1: Title
78
  display_format( 1, strcpy_P( (char *) &acBuffer[0], PSTR( "* PSU + DARC *" )));
79
  
80
  // Line 2: Model
81
  display_format( 2,  strcpy_P( (char *) &acBuffer[0], PSTR( ">%6s<  by DG1SBG" )), PSU_MODEL );
82
  
83
  // Line 3 Serial Nr and Version
84
  display_format( 3,  strcpy_P( (char *) &acBuffer[0], PSTR( "# %s - %s")), PSU_SERIAL_NR, PSU_VERSION );
85
  
86
  roger();  
87
88
  if( nDelayMilliSeconds > 0 )
89
    _delay_ms( nDelayMilliSeconds );
90
91
  return nRC;
92
}
93
94
ISR( TIMER1_COMPA_vect  )  // Routine triggered by Timer 1 to
95
{                          // interact with the user
96
97
  heart_beat();
98
99
  update_lamps();       // Update the lamp on/off to match relays
100
  update_i2c_io();      // Read digital inputs and write relays
101
102
  // sample_voltages();
103
104
  debounce();           // Debounce pushbuttons
105
106
  darc_get_command();   // Read command from DARC channel
107
}
108
109
110
int main ( void )
111
{
112
  rc_t nRC = RC_OK;
113
114
  // Status engine: Still outside of it
115
116
  nCmdFromISR = NO_CMD;
117
  bInStatusNetEngine = FALSE;
118
  bPBsEnabled = FALSE;
119
120
  // Delay 2 seconds for all devices to settle
121
122
  _delay_ms( 2000 );
123
124
  // Do basic inits as fast as possible
125
126
  init();
127
  execute_cmd_from_isr();
128
129
  // Display the reason why the controller is booting
130
131
  analyse_reset_reason( 1000 );
132
  execute_cmd_from_isr();
133
  blink_error_led_fast();
134
135
  // Say hello on LCD
136
137
  greet( 1000 );
138
  execute_cmd_from_isr();
139
140
  // Make error logging in EEPROM possible
141
  
142
  show_last_logged_error( 2000 ); 
143
  execute_cmd_from_isr();
144
145
  // Kick off status net - THIS IS THE MAIN LOOP ...
146
  
147
  bInStatusNetEngine = TRUE;
148
149
  clear_display();
150
151
  switch_status( PSU_STATUS_ID_PSU_BOOTING );
152
  
153
  while( nRC == RC_OK )
154
  { 
155
    nRC = goto_next_status( nNextStatus );
156
  }
157
158
  // When this point is reached it most likely means that a reset is 
159
  // required !
160
161
  if( IS_ERROR( nRC ) )
162
    log_error( nRC, __LINE__ );
163
164
  reset(); // Reboot PSU Controller !!!
165
166
   // This point never reached ...
167
  return 1; 
168
}
(Ich hoffe, das war nicht zuviel ...)

> Was hast du wo dran, kenn das Mini-Megaboard nicht.

LEDs sind an Port B dran. Die LED an PB0 sollte einmal für 1 Sekunde an 
sein und dann nochmal ein "kurz-lang-kurz" Blinken machen (Morse 
Buchstabe 'r').

Der ATmega644p zuckt aber nicht, d.h. er verharrt in dem Zustand, in dem 
er bei Beginn des Programmiervorgangs war.

Danke für's Einspringen!

Grüße,
  Frank

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Also von einem einfachen "LED Blink Test" ist das ganze aber weit 
entfernt... ;)

Ansonsten wo hast du den den Code her? Das sieht ja schrecklich aus.
1
asm volatile ( "nop" );  // Give the AVR time to settle
Was soll das den? Der AVR braucht doch keine Wartezeit zum setzen eines 
IO Ports.

Die ganze atomic Block Geschichten kannst du dir auch sparen wenn du das 
ganze ausführst bevor du die Interupts freigibst (wo tust du das 
eigentlich)?

debounce() in der ISR enthält doch hoffentlich keine Warteschleife?

Also alles in allem etwas durcheinandcer, ich würde erstmal mit einem 
Simplen Programm testen ;)

von Jean (Gast)


Lesenswert?

Hi,
1
void set_error_led( void )
2
{
3
  PORTB = PINB | (1 << PB0);
4
}
5
6
void clear_error_led( void )
7
{
8
  PORTB = PINB & ~(1 << PB0);
9
}

probiers mal mit
1
void set_error_led( void )
2
{
3
  PORTB |= (1 << PB0);
4
}
5
6
void clear_error_led( void )
7
{
8
  PORTB &= ~(1 << PB0);
9
}

gruß

von Oliver (Gast)


Lesenswert?

Das Mega32 und 644 zwar pinkompatibel, aber nicht in allen Funktionen 
sourcecodekompatibel sind, hast du aber beachtet, oder?

http://www.atmel.com/dyn/resources/prod_documents/doc8001.pdf

Oliver

von Frank G. (dg1sbg)


Angehängte Dateien:

Lesenswert?

Läubi .. schrieb:
> Also von einem einfachen "LED Blink Test" ist das ganze aber weit
> entfernt... ;)

;-) Stimmt. Ist die komplette Steuerung eines Hochspannungsnetzteils für 
meinen HF Verstärker.

>
> Ansonsten wo hast du den den Code her? Das sieht ja schrecklich aus.
>
>
1
asm volatile ( "nop" );  // Give the AVR time to settle
> Was soll das den? Der AVR braucht doch keine Wartezeit zum setzen eines
> IO Ports.

Ok. Selbst ohne diese Zeile benimmt sich der AVR aber immer noch gleich 
;-)

>
> Die ganze atomic Block Geschichten kannst du dir auch sparen wenn du das
> ganze ausführst bevor du die Interupts freigibst (wo tust du das
> eigentlich)?

An anderer Stelle. Siehe volles Listing anbei...

>
> debounce() in der ISR enthält doch hoffentlich keine Warteschleife?

Nee. Wie kommst Du drauf ?

> Also alles in allem etwas durcheinandcer, ich würde erstmal mit einem
> Simplen Programm testen ;)

Habe ich. Gleiches Verhalten. Es geht ja auch nicht um das Programm, 
sondern um die Tatsache, dass der ATmega644p nach dem Flashen keinen 
Reset ausführt und schlicht hängt. Ein Ausschalten und Einschalten des 
Boards lässt den AVR zwar neu starten, aber er scheint immer noch nicht 
das neue Programm auszuführen - als ob der Flash Vorgang gar nicht 
stattgefunden hätte. Mit dem ATMega32 funktioniert's - nur brauche ich 
mehr Speicher, deshalb kann ich den 32er nicht nehmen.

Gruß,
  Frank

von Frank G. (dg1sbg)


Lesenswert?

Oliver schrieb:
> Das Mega32 und 644 zwar pinkompatibel, aber nicht in allen Funktionen
> sourcecodekompatibel sind, hast du aber beachtet, oder?
>
> http://www.atmel.com/dyn/resources/prod_documents/doc8001.pdf

Jau, habe ich. Ohne entsprechende Source-Anpassungen ließ sich der Code 
nicht übersetzen. Und ich habe genau dieses Dokument als 
Vorlage/Anleitung genommen.

>
> Oliver

Danke!

Gruß,
  Frank

von Frank G. (dg1sbg)


Lesenswert?

Jean schrieb:
> Hi,
>
>
1
> void set_error_led( void )
2
> {
3
>   PORTB = PINB | (1 << PB0);
4
> }
5
> 
6
> void clear_error_led( void )
7
> {
8
>   PORTB = PINB & ~(1 << PB0);
9
> }
10
>
>
> probiers mal mit
>
>
1
> void set_error_led( void )
2
> {
3
>   PORTB |= (1 << PB0);
4
> }
5
> 
6
> void clear_error_led( void )
7
> {
8
>   PORTB &= ~(1 << PB0);
9
> }
10
>

Danke. Gemacht. Sieht etwas schöner aus ;-)

Gruß,
  Frank

von Hubert G. (hubertg)


Lesenswert?

Es ist aus deinem Code nicht ersichtlich was an PortC hängt. Du hast 
JTAG nicht disabled. Vielleicht hängt sich dein Programm schon beim init 
auf.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Einfaches LED anschalten geht nicht?
1
DDRB = 0xFF;
2
PORTB = 0xAA;
3
while(1) {}
Sollte an PortB abwechseln High/Low ausgeben, kannst du einfach mit 
einem MM testen.
Schonmal geprüft ob irgenwo ein Kurzschluss ist? (Machst du den Mega32 
Test im selben Board?) ggf. Pullup an Reset mal versuchen.

von Frank G. (dg1sbg)


Lesenswert?

Hubert G. schrieb:
> Es ist aus deinem Code nicht ersichtlich was an PortC hängt. Du hast
> JTAG nicht disabled. Vielleicht hängt sich dein Programm schon beim init
> auf.

Jau, so war das. JTAG nun disabled und siehe da, es geht.

Vielen herzlichen Dank!

Gruß,
  Frank

P.S. Jetzt habe ich zwar schon das nächste Problem, aber das ist eine 
andere Geschichte und soll in einem anderen Thread erzählt werden.

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.