Hallo, bin neu hier und programmiere auch zum ersten Mal einen Mikrocontroller. Ich habe nun ein Problem, wofür ich trotz Suche im Internet keine Lösung gefunden habe. Erstmal zu den Werkezugen, die ich benutze: - AVR Dragon - ATmega48PA, getaktet über externen 20MHz-Quarz - AVR Studio 4.18 Ich konnte bisher ohne Problem den Mikrocontroller programmieren. Debuggen ging auch über AVR Studio. Irgendwann mal, als ich wieder mal in den Debug-Modus gehen wollte, hat er dann an einer Stelle gehakt und es kam eine Meldung mit "Wiederholen" oder "Abbrechen". Kann mich nicht genau an den Text erinnern, aber ich konnte so oft wiederholen drücken wie ich wollte und es ist nix passiert, deswege habe ich das abgebrochen. Seitdem kann ich nicht mehr den uC bedienen. Wenn ich über das AVR-Icon die Fuse-Bits oder LockBits auslesen möchte, erscheint die "ISP Mode Error"-Meldung, mit dazugehörigem Text: Setting device parameters.. OK! Entering programming mode.. FAILED! Leaving programming mode.. OK! Die Signature kann ich ebenfalls nicht auslesen und "Erase Device" funktioniert auch nicht. Die ISP Frequency kann ich aber noch einstellen mit der entsprechenden Meldung "Setting ISP frequency SD=0x05 .. OK" Wenn ich mein Programm aufspielen will erscheint: Getting ISP frequency parameters.. SD=0x05 .. OKOK Reading FLASH input file.. OK Setting device parameters.. OK! Entering programming mode.. FAILED! Leaving programming mode.. OK! Ich habe mir 3 mal den gleichen Mikrocontroller gekauft. Als der erste diesen Fehler hatte, habe ich erstmal den nächsten genommen und dort hat es direkt beim ersten Versuch geklappt. Doch nach merhmaligem Wechsel in den Debug-Modus kam wieder das gleiche Problem. Dann habe ich einen dritten genommen und habe nun mit diesem ebenfalls das Problem. Da die neuen uC ohne Probleme programmiert werden konnten, gehe ich mal davon aus, dass die Verkabelung in Ordnung ist. Hoffe ich habe das Problem ausreichend erklärt. Bitte nun um Lösungen ;) Danke!!!
Nur 'ne Idee ... setzt Dein Programm PRSPI in PRR?
Du meinst im Quellcode?! Ne, benutze ich nicht. Habs grade mal im Datasheet gesucht. Dabei handelt es sich um das "Power Reduction Register". Hab ich nicht integriert. Hier mal der Quellcode (Nicht wundern, wenn was kompliziert programmiert ist, bin wie gesagt noch neu...): #include <avr/interrupt.h> #include <avr/io.h> unsigned int uint_PinC0_56V; unsigned int uint_PinC1_neg_Aufwaertswandler; unsigned int volatile uint_ZaehlerPWM; unsigned int uint_ISRTeiler; unsigned int uint_PWM_Startzeit_50ms; unsigned int uint_PWM_Startbit1; unsigned int uint_PWM_Startbit2; unsigned int uint_Dummy_Startzeitfreigabe; unsigned int uint_VentilSchalter; unsigned int uint_PWM_Ventil; unsigned int uint_PWM_Ventil_timer; void Pin_init() { DDRD |= (1 << DDD3) | (1 << DDD5); DDRC &= ~((1 << DDC0) | (1 << DDC1)| (1 << DDC2)); } void configPWM() { TCCR0B = (1 << CS00) | (1 << WGM02); TCCR0A = (1 << WGM00) | (1 << WGM01) | (1 << COM0B1); TIMSK0 |= (1<<OCIE0A) | (1<<OCIE0B); } void enableADC() { unsigned int ADC_dummy; ADCSRA = (1<<ADEN) | (1<<ADPS2)| (1<<ADPS1) | (1<<ADPS0); ADMUX |= 0; ADMUX |= (1<<ADLAR); ADMUX |= (1<<REFS0) | (1<<REFS1); ADCSRA |= (1<<ADSC); while ( ADCSRA & (1<<ADSC) ) { ; } ADC_dummy = ADCH; } unsigned int ReadChannel_extRef (int mux) { unsigned int result; ADMUX |= mux; ADMUX &= ~(1<<REFS1); ADCSRA |= (1<<ADSC); while ( ADCSRA & (1<<ADSC) ) { ; } result = ADCH; return result; } unsigned int ReadChannel_intRef (int mux) { unsigned int result; ADMUX |= mux; ADMUX |= (1<<REFS0) | (1<<REFS1); ADCSRA |= (1<<ADSC); while ( ADCSRA & (1<<ADSC) ) { ; } result = ADCH; return result; } ISR(TIMER0_COMPB_vect) { if (uint_ZaehlerPWM > 35) { if ((uint_PWM_Startbit1 == 1) && (uint_PWM_Startbit2 == 1)) uint_ISRTeiler++; if (uint_ISRTeiler == 1000) { uint_ZaehlerPWM--; uint_ISRTeiler = 0; } } } ISR(TIMER0_COMPA_vect) { if (uint_PWM_Startbit1 == 0) { if (uint_PWM_Startzeit_50ms < 10000) uint_PWM_Startzeit_50ms++; else uint_PWM_Startbit1 = 1; } OCR0B = uint_ZaehlerPWM; } int main(void) { uint_PWM_Ventil_timer = 0; uint_VentilSchalter = 0; uint_PinC0_56V = 0; uint_PinC1_neg_Aufwaertswandler = 0; uint_Dummy_Startzeitfreigabe = 0; uint_PWM_Startbit1 = 0; uint_PWM_Startbit2 = 0; uint_PWM_Startzeit_50ms = 0; uint_ISRTeiler = 0; uint_ZaehlerPWM = 100; OCR0B = 100; OCR0A = 100; Pin_init(); configPWM(); enableADC(); sei(); while(1) { uint_PinC0_56V = ReadChannel_intRef(PC0); uint_VentilSchalter = ReadChannel_extRef(PC2); if ((uint_PinC0_56V > 190) & (uint_Dummy_Startzeitfreigabe == 0)) { uint_PinC1_neg_Aufwaertswandler = ReadChannel_extRef(PC1); if (uint_PinC1_neg_Aufwaertswandler < 220) //Spannung an C2 > 4V { uint_PWM_Startbit2 = 1; uint_Dummy_Startzeitfreigabe = 1; } } } return 0; }
Dann war meine Vermutung nicht zutreffend. Wenn Du das genannte Bit setzst, wird DebugWire abgeschaltet, was dann zu ähnlichen Effekten wie dem geschilderten führt, wenn Du darüber programmierst. Daher muss ich passen.
Kann das Problem evtl. auch daher kommen, dass ich unter Project -> Configuration Options -> Device nur nen atmega48p, anstatt den von mir benutzten atmega48pa auswählen kann?
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.