Forum: Compiler & IDEs Probleme mit PCINT an ATmega644P


von Steffen K. (chaos_studi)


Lesenswert?

Hallo

Ich vermute ich baue irgendeinen Denkfehler bei meiner Schaltung mit 
einem ATmega644P

und zwar habe ich eine LED eingeschaltet, die mittels eines Interrupts 
an PCO, PC1 oder PC2 (Bez.: PCINT16-18) abgeschaltet werden soll, später 
im Programm soll sie dann wieder angehen, ist aber im Moment alles noch 
nicht in nutzung da rauskommentiert.
Nun das eigentliche Problem: LED geht an, aber nach einem 
Potentialwechsel an einem der drei Pins passiert nichts.

Ich vermute ich hab irgendetwas wichtiges vergessen, die relaventen 
Codebereiche "folgen":
1
void init(void)
2
{
3
4
5
  DDRC = 0xf8;  // PC0, PC1, PC2 als Eingang, Rest als Ausgang
6
  PORTC= 0xf8;  // Pullups für Eingägne an
7
8
  /**  Taster-Interrupts **/
9
  PCICR |= (1<<PCIE2);  //Interrupt-Bank 2 Aktivieren
10
  PCIFR |=  (1 << PCIF2);  //interrupt-bank 2 aktivieren
11
  PCMSK2|=  (1<<PCINT16)|(1<<PCINT17)|(1<<PCINT18);  
12
13
  sei();  //Interrupts Aktivieren 
14
        PORTA |=(1<<3);
15
}
16
17
ISR(PCINT2_vect) 
18
{
19
  PORTA &= ~(1<<3);
20
}
Über Hilfe würde ich mich freuen,
Grüße

von Justus S. (jussa)


Lesenswert?

Steffen K. schrieb:

>   PORTC= 0xf8;  // Pullups für Eingägne an

imo schaltest du da alle Ausgänge auf 1 und keine PullUps...kA ob das 
der Grund ist...

von Karl H. (kbuchegg)


Lesenswert?

Wo schaltest du eigentlich Pin 3 vom Port A auf Ausgang?

von Steffen K. (chaos_studi)


Lesenswert?

Justus Skorps schrieb:
> imo schaltest du da alle Ausgänge auf 1 und keine PullUps...kA ob das
> der Grund ist...

Das stimmt - mea culpa - hab es geändert
1
PORTC= 0x07;  // Pullups für Eingägne an
 aber keine Verbesserung im verhalten, hätte wenn ja eigentlich, da die 
Eingänge kein definiertes Potential haben, wild Interrupts ausllösen 
müssen Denk

eine Definition
1
DDRA=0xff;
 hab ich schon im Code, hab aber der Übersichtlichkeit wegen hier drauf 
verzichtet, weil AN (also Ausgang auf hig) geht die LED ja, nur in der 
Interruptroutine nicht aus, das lässt mich vermuten dass er nicht in die 
Interruptroutine springt.

Danke schonmal auf weiter Tipps hoff

von Karl H. (kbuchegg)


Lesenswert?

Steffen K. schrieb:

> Danke schonmal *auf weiter Tipps hoff*

OK. Noch ein Tip.
Poste dein komplettes Program, da der Fehler ziemlich offensichtlich 
nicht in dem Bereich steckt, den du für relevant hältst.

von Steffen K. (chaos_studi)


Lesenswert?

So dann  mal der rest vom Code, nicht wundern es ist kurz, da es nur ein 
testprogramm ist; nachdem das Teil incl Kommunikation nicht funtkioniert 
hat, habe ich nun zum Testen ohne geteste und funzt auch nicht :-(
[c]#include <avr/io.h>
#include <stdint.h>
#include <avr/interrupt.h>
#include <util/delay.h>


/**Taster Interrupt**/

ISR(PCINT2_vect)
{
  PORTA &= ~(1<<3);

    _delay_ms(10);  //kurz warten damit Prellen keinen neuen Interrupt 
auslöst
  }


/** Initialisierung das ATmega 644P **/

void init(void)
{
  _delay_ms(100);  //Warten bis Spannung stabi

  CLKPR = (1<<CLKPCE);  //Clock Prescaler änderbar
  CLKPR = 0x00;    //clock Prescaler auf 1

  DDRA = 0xff;   // PAx als Ausgang
  DDRB = 0xff;  // PBx als Ausgang
  PORTB=0x00;
  DDRC = 0xf8;  // PC0, PC1, PC2 als Eingang, Rest als Ausgang
  PORTC= 0x07;  // Pullups für Eingänge an

  ACSR |= (1 << ACD);  //Deaktiviere AD Komparator

  /** Konfiguriere Taster-Interrupts **/
  PCICR |= (1<<PCIE2);  //Interrupt-Bank 2 Aktivieren
  PCIFR |=  (1 << PCIF2);  //interrupt-bank 2 aktivieren
  PCMSK2|=  (1<<PCINT16)|(1<<PCINT17)|(1<<PCINT18);

  sei();  //Interrupts Aktivieren
}


/** Mainloop**/

void run(void)
  {
    uint8_t led = 0;
    //TODO UART KOMMUNIKATION
    if(led==2)
    {
      PORTA |=(1<<3);
    }
  }

/**Main function is called first **/

int main(void)
{
  init();
  PORTA |=(1<<3);
  for(;;)
    run();

  return 0;
}[\c]
Ergebnis: LED geht an, ich kann am interrupteingang machen was ich will 
sie geht nicht mehr aus

von Steffen K. (chaos_studi)


Lesenswert?

Problem mittels Austausch des ATmega644 gelöst

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.