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; } }
Der uC läuft jetzt mit 16 MHz/256 = 62500 Hz, also muss das Programiergerät auf unter 15625 Hz eingestellt werden.
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
> Das Program hat niemals irgend einen Einfluß darauf, > ob der Programmer Zugriff hat, oder nicht. Das ist ein Irrtum - selbst mal ausprobieren.
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...
(und noch das fehlende m nachgeliefert) Hier hatte jemand dasselbe Problem: Beitrag "Mega48 prescaler auf 125kHz gestellt und Programieren geht nicht mehr"
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
debuggen ist nicht programmieren. lass die Taktfrequenz und setze den Prescaler nur für den Timer. StromTuner
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 ....
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.
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
@ Landolt: Danke dir, jetzt komm ich wieder rein! Werde Nur noch über Timer prescalen und gegebenenfalls mit CTC_Betriebsart nacharbeiten!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.