Forum: Mikrocontroller und Digitale Elektronik Kein Zugriff auf µC


von Lukas D. (lukdi)


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;
  }
}

von S. Landolt (Gast)


Lesenswert?

Der uC läuft jetzt mit 16 MHz/256 = 62500 Hz, also muss das 
Programiergerät auf unter 15625 Hz eingestellt werden.

von Oliver S. (oliverso)


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

von S. Landolt (Gast)


Lesenswert?

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

Das ist ein Irrtum - selbst mal ausprobieren.

von Dennis K. (scarfaceno1)


Lesenswert?

S. Landolt schrieb:
> Der uC läuft jetzt mit 16 MHz/256 = 62500 Hz, also muss das
> Programiergerät auf unter 15625 Hz eingestellt werden.

Das sollte es sein...

von S. Landolt (Gast)


Lesenswert?

(und noch das fehlende m nachgeliefert)

Hier hatte jemand dasselbe Problem:
Beitrag "Mega48 prescaler auf 125kHz gestellt und Programieren geht nicht mehr"

von Lukas D. (lukdi)


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

von Stromtuner (Gast)


Lesenswert?

debuggen ist nicht programmieren.
lass die Taktfrequenz und setze den Prescaler nur für den Timer.

StromTuner

von Mitlesa (Gast)


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 ....

von Mitlesa (Gast)


Lesenswert?

Mitlesa schrieb:
> Einen ATmega168 kann man sowieso nicht mit einem ICE debuggen
> da ihm die JTAG- (oder auch die PDI-) Schnittstelle fehlt.

... ja nicht ganz, er hat eine Debugwire Schnittstelle, aber
auch dafür ....

Mitlesa schrieb:
> Zum Debuggen bräuchtest du einen JTAG ICE MKII oder einen Atmel ICE.

von S. Landolt (Gast)


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

von Lukas D. (lukdi)


Lesenswert?

@ Landolt: Danke dir, jetzt komm ich wieder rein! Werde Nur noch über 
Timer prescalen und gegebenenfalls mit CTC_Betriebsart nacharbeiten!

von Stefan F. (Gast)


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.

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.