www.mikrocontroller.net

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


Autor: Frank Goenninger (dg1sbg)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hubert G. (hubertg)
Datum:

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

Autor: Frank Goenninger (dg1sbg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Hubert,

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

Zum einen vertraue ich den avrdude Meldungen:
avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.01s

avrdude: Device signature = 0x1e960a
avrdude: safemode: lfuse reads as EE
avrdude: safemode: hfuse reads as 99
avrdude: safemode: efuse reads as FD
avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed
         To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "psuctrl.hex"
avrdude: input file psuctrl.hex auto detected as Intel Hex
avrdude: writing flash (23816 bytes):

Writing | ################################################## | 100% 33.84s

avrdude: 23816 bytes of flash written
avrdude: verifying flash memory against psuctrl.hex:
avrdude: load data flash data from input file psuctrl.hex:
avrdude: input file psuctrl.hex auto detected as Intel Hex
avrdude: input file psuctrl.hex contains 23816 bytes
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% 30.19s

avrdude: verifying ...
avrdude: 23816 bytes of flash verified

avrdude: safemode: lfuse reads as EE
avrdude: safemode: hfuse reads as 99
avrdude: safemode: efuse reads as FD
avrdude: safemode: Fuses OK

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:
void init_port_b ( void )
{
  ATOMIC_BLOCK( ATOMIC_RESTORESTATE )
  {
    DDRB |= (1<<PB0);        // Set line 0 of port B as output
    DDRB |= (1<<PB1);        // Set line 1 of port B as output
    DDRB |= (1<<PB2);        // Set line 2 of port B as output
    DDRB |= (1<<PB3);        // Set line 3 of port B as output
    DDRB |= (1<<PB4);        // Set line 4 of port B as output

    // Heartbeat LED: Line 0 -> Switch off initially

    PORTB &= ~( 1<<PB0 );

    asm volatile ( "nop" );  // Give the AVR time to settle
  }

  return;
}

void set_error_led( void )
{
  PORTB = PINB | (1 << PB0);
}

void clear_error_led( void )
{
  PORTB = PINB & ~(1 << PB0);
}

void dit(void)
{
  clear_error_led();
  set_error_led();
  _delay_ms( 100 );
  clear_error_led();
}

void dah( void )
{
  clear_error_led();
  set_error_led();
  _delay_ms( 250 );
  clear_error_led();
}

void roger( void )
{
  dit();
  dah();
  dit();
}

void init_io_timer ( void )
{
  ATOMIC_BLOCK( ATOMIC_RESTORESTATE )
  {
    // We use timer 1 (16 bit Timer) in CTC mode. This timer shall
    // generate an interrupt every PSU_IO_UPDATE_INTERVAL seconds.
    // Prescaler has to be set to 1 !

    OCR1A  = (unsigned short)
      ((unsigned long) F_CPU / PSU_IO_IRQS_PER_SECOND /
       PSU_IO_TIMER_PRESCALE - 1);           // Load the timer compare value
    
    TCNT1  = 0;                              // Reset counter value
    TCCR1A = 0;                              // No PWM
    TCCR1B = _BV( WGM12 ) | _BV( CS11 );     // Set CTC mode
    TIMSK0 |= _BV( OCIE1A );                 // Output Compare A Interrupt 
  }
}

rc_t greet( unsigned long nDelayMilliSeconds )
{
  rc_t nRC = RC_OK;
  
  // Line 1: Title
  display_format( 1, strcpy_P( (char *) &acBuffer[0], PSTR( "* PSU + DARC *" )));
  
  // Line 2: Model
  display_format( 2,  strcpy_P( (char *) &acBuffer[0], PSTR( ">%6s<  by DG1SBG" )), PSU_MODEL );
  
  // Line 3 Serial Nr and Version
  display_format( 3,  strcpy_P( (char *) &acBuffer[0], PSTR( "# %s - %s")), PSU_SERIAL_NR, PSU_VERSION );
  
  roger();  

  if( nDelayMilliSeconds > 0 )
    _delay_ms( nDelayMilliSeconds );

  return nRC;
}

ISR( TIMER1_COMPA_vect  )  // Routine triggered by Timer 1 to
{                          // interact with the user

  heart_beat();

  update_lamps();       // Update the lamp on/off to match relays
  update_i2c_io();      // Read digital inputs and write relays

  // sample_voltages();

  debounce();           // Debounce pushbuttons

  darc_get_command();   // Read command from DARC channel
}


int main ( void )
{
  rc_t nRC = RC_OK;

  // Status engine: Still outside of it

  nCmdFromISR = NO_CMD;
  bInStatusNetEngine = FALSE;
  bPBsEnabled = FALSE;

  // Delay 2 seconds for all devices to settle

  _delay_ms( 2000 );

  // Do basic inits as fast as possible

  init();
  execute_cmd_from_isr();

  // Display the reason why the controller is booting

  analyse_reset_reason( 1000 );
  execute_cmd_from_isr();
  blink_error_led_fast();

  // Say hello on LCD

  greet( 1000 );
  execute_cmd_from_isr();

  // Make error logging in EEPROM possible
  
  show_last_logged_error( 2000 ); 
  execute_cmd_from_isr();

  // Kick off status net - THIS IS THE MAIN LOOP ...
  
  bInStatusNetEngine = TRUE;

  clear_display();

  switch_status( PSU_STATUS_ID_PSU_BOOTING );
  
  while( nRC == RC_OK )
  { 
    nRC = goto_next_status( nNextStatus );
  }

  // When this point is reached it most likely means that a reset is 
  // required !

  if( IS_ERROR( nRC ) )
    log_error( nRC, __LINE__ );

  reset(); // Reboot PSU Controller !!!

   // This point never reached ...
  return 1; 
}
(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

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.
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 ;)

Autor: Jean (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
void set_error_led( void )
{
  PORTB = PINB | (1 << PB0);
}

void clear_error_led( void )
{
  PORTB = PINB & ~(1 << PB0);
}

probiers mal mit
void set_error_led( void )
{
  PORTB |= (1 << PB0);
}

void clear_error_led( void )
{
  PORTB &= ~(1 << PB0);
}

gruß

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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/...

Oliver

Autor: Frank Goenninger (dg1sbg)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.
>
>
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

Autor: Frank Goenninger (dg1sbg)
Datum:

Bewertung
0 lesenswert
nicht 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/...

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

Autor: Frank Goenninger (dg1sbg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jean schrieb:
> Hi,
>
>
> void set_error_led( void )
> {
>   PORTB = PINB | (1 << PB0);
> }
> 
> void clear_error_led( void )
> {
>   PORTB = PINB & ~(1 << PB0);
> }
> 
>
> probiers mal mit
>
>
> void set_error_led( void )
> {
>   PORTB |= (1 << PB0);
> }
> 
> void clear_error_led( void )
> {
>   PORTB &= ~(1 << PB0);
> }
> 

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

Gruß,
  Frank

Autor: Hubert G. (hubertg)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Einfaches LED anschalten geht nicht?
DDRB = 0xFF;
PORTB = 0xAA;
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.

Autor: Frank Goenninger (dg1sbg)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.