Forum: Mikrocontroller und Digitale Elektronik keine Verbindung zum AVR ATmega48PA übder Dragon


von Andreas H. (heilinger)


Lesenswert?

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

von Hc Z. (mizch)


Lesenswert?

Nur 'ne Idee ... setzt Dein Programm PRSPI in PRR?

von Andreas H. (heilinger)


Lesenswert?

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

von Hc Z. (mizch)


Lesenswert?

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.

von Andreas H. (heilinger)


Lesenswert?

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
Noch kein Account? Hier anmelden.