Kein Zugriff auf µC

OP #4989711
Lesenswert?

Hallo zusammen,
ich habe einen ATmega168 und fange an mich mit Mikrocontrollern vertraut 
zu machen. Dies ist auch mein erster Beitrag im Forum!
Die Aufgabe:
Ich will ein Blinkelicht programmieren. Das ganze soll mit einem 
externen 16MHz-Quarz getacktet werden. Als ersten Schuss soll der Quarz 
mit 256 geprescaled werden und der 8-bit-Timer mit 1024. Dann blickt das 
Licht im 4,2s-Rhytmus.

Das Problem:
Hab die Aufgabe soweit umgesetzt. Was nicht gepasst hat war, dass der 
Quarz nicht geprescaled wurde! Ich hatte da einen Fehler im Programm, 
auch noch selbst gefunden und behoben. Habe dann den CLKPR so gesetzt 
wie unten im Programm und debugged.

Blinkelicht funktioniert super, habe aber keinen Zugriff mehr auf den 
µC????!!

Bis zu dieser Programmänderung KONNTE ICH DEN µC ÜBERSPIELEN UND HATTE 
VOLLEN ZUGRIFF, JEDERZEIT. Also die Fuses sind wohl richtig gesetzt. Was 
stimmt hier nicht?
Die Fuses haben folgende Einstellung erhalten:
Low: 0xE7
High:0xDF
Extended Action: 0xF9
Quarzeinstellung: Ext. Full-swing Crystal; Start-up time PWRDWN/RESET: 
16KCK/14CK+4,1ms

Habe darauf geachtet das bei SPI enabled ein Hacken gesetzt ist und bei 
Reset Disabled kein Hacken gesetzt ist.

Wäre super wenn ihr mir helfen könntet dieses Problem zu verstehen!
Grüße, LukDi

Das Programm:

#include <avr/io.h>
#include <avr/interrupt.h>

uint8_t counter;
int status;

void init_sysclk(void);
void init_timer0(void);

//############# Hauptprogram #############
int main(void)
{
  CLKPR = (1<<CLKPCE);
  CLKPR = 0x08;


  PORTD = 0b1111111;

  counter =0;
  status = 0;

  init_timer0();
  sei();
  while (1)
  { /*Programmschleife*/
  }
  return(0);
}
//########## Unterprogramme #############

void init_timer0(void)
{

  TCNT0 = 0;
  TIFR0 |= (0<<TOV0)|(0<<OCF0A)|(0<<OCF0B);
  TCCR0B |= (1<<CS00)|(0<<CS01)|(1<<CS02);
  TIMSK0 = (1<<TOIE0);
}

//########## ISRs #############
ISR(TIMER0_OVF_vect) // ISR(TIMER0_COMPA_vect) für Interrupt bei Compare 
Wert
{
  if (status == 0)
  {
    PORTD = 0x00;
    status = 1;
  }
  else
  {
    PORTD = 0xFF;
    status = 0;
  }
}
#4989733
Lesenswert?

Das Program hat niemals irgend einen Einfluß darauf, ob der Programmer 
Zugriff hat, oder nicht.

Was bedeutet denn "kein Zugriff"?

Kannst du die Fuses und die Prozessorkennung noch auslesen, oder geht 
gar nichts mehr?

Im zweiten Fall liegt entweder ein elektrisches Problem vor, oder du 
hast halt doch bei der letzten Programierung die Fuses zerschossen und 
dich ausgesperrt.

Was du probieren könntest, ist eine Reduzierung der ISP-Frequenz. 
Vielleicht läuft der Prozessor nicht auf 16Mhz, und hat da ein Problem.

Oliver
OP #4989992
Lesenswert?

1.
Danke für die schnellen Rückmeldungen! Mit herrabgesetzter ISP Frequenz 
kann ich die Fuses auslesen. Ich bestätige die neue Frequenz mit Set! 
Wenn ich Debugge kommt jedoch wider die Fehlermeldung! Sie lautet: 
Failed to launch program. Habt ihr noch eine Idee oder habe ich mich 
ausgesperrt?
2. Versteh ich das richtig das die ISR Frequenz herrabgesetztwerden muss 
um eine ausreichend hohe Abtastrate zu erhalten? Stichwort 
Anti-Aliasing?

Grüße,
LukDi
Gast #4990017
Lesenswert?

Lukas D. schrieb:
> Wenn ich Debugge kommt jedoch wider die Fehlermeldung!

Du hast vermutlich eine ISP Programmer. Damit kann man
nur das Flash/EEPROM/Fuses programmieren, jedoch keinen
Code debuggen/steppen.

Zum Debuggen bräuchtest du einen JTAG ICE MKII oder einen Atmel ICE.

Einen ATmega168 kann man sowieso nicht mit einem ICE debuggen
da ihm die JTAG- (oder auch die PDI-) Schnittstelle fehlt.
Über SPI lässt sich nichts debuggen ....
Gast #4990026
Lesenswert?

zu 1: versuchen, ein 'chip erase' abzusetzen; wenn wirklich zwingend der 
Systemtakt mit CLKPR herabgesetzt werden muss, dann, wie von Peter 
Dannegger empfohlen, unmittelbar am Programmbeginn eine Verzögerung von 
einigen Sekunden einbauen.

zu 2: aus dem Datenblatt:
Depending on CKSEL Fuses, a valid clock must be present. The minimum low 
and high periods for the serial clock (SCK) input are defined as 
follows:
Low: > 2 CPU clock cycles for fck < 12MHz, 3 CPU clock cycles
 for fck >= 12MHz
High: > 2 CPU clock cycles for fck < 12MHz, 3 CPU clock cycles
 for fck >= 12MHz
Gast #4990069
Lesenswert?

Halte den Reset Eingang auf Low, schalte die Stromversorgung ein und 
lade dann das neue Programm hoch. Erst danach lässt du die Reset Leitung 
wieder los (auf High).

Diese Methode hilft bei ISP Programmieradaptern, die du nicht langsam 
genug einstellen kannst.

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