Probleme mit PCINT an ATmega644P

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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.