Probleme mit PCINT an ATmega644P

OP #1329318
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
OP #1329387
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
OP #1329432
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren