mikrocontroller.net

Forum: Compiler & IDEs Probleme mit PCINT an ATmega644P


Autor: Steffen K. (chaos_studi)
Datum:

Bewertung
0 lesenswert
nicht 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":
void init(void)
{


  DDRC = 0xf8;  // PC0, PC1, PC2 als Eingang, Rest als Ausgang
  PORTC= 0xf8;  // Pullups für Eingägne an

  /**  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 
        PORTA |=(1<<3);
}

ISR(PCINT2_vect) 
{
  PORTA &= ~(1<<3);
}
Über Hilfe würde ich mich freuen,
Grüße

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wo schaltest du eigentlich Pin 3 vom Port A auf Ausgang?

Autor: Steffen K. (chaos_studi)
Datum:

Bewertung
0 lesenswert
nicht 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
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
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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Steffen K. (chaos_studi)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Steffen K. (chaos_studi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Problem mittels Austausch des ATmega644 gelöst

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.