Probleme mit C Code

Gast #238955
Lesenswert?

Also ich verstehs echt nicht mehr ...

Ich habe folgenden Code:

#include <avr/io.h>
#include <avr/interrupt.h>    // sei()
#include <avr/signal.h>      // SIGNAL

#define XTAL 1000000

int main(void) {
  /* configure all portD bits as input */
  DDRD = 0x00;
  // configure all PortB bits as output
  DDRC = 0xff;
  PORTC = 0xff;

  //sei();
  while(1);
  return 0;
}

SIGNAL (SIG_INTERRUPT0) {
  PORTB = 0xff;
}

Nun sollte doch nachdem ich den AVR mittels winavr/avrdude programmiert
habe, der Port C auf High Pegel sein .. oder ?

Interessanterweise ist er das aber nicht .. weiss vielleicht jemand was
ich falsch mache ?
Gast #238957
Lesenswert?

oh :)

es handelt sich um einen vollkommen neuen Atmega8.

Das erste Problem konnte ich lösen ... wahrscheinlich hatte der
programmer was ... denn obwohl avrdude meinte "successful" hab ichs
mal mit meinem anderen adapter und ponyprog probiert und siehe da, es
ging ...

aber jetzt funktioniert noch die sache mit dem interrupt nicht .. ich
schau wohl nochmal schnell ins tutorial hier :)
Gast #238959
Lesenswert?

> denn obwohl avrdude meinte "successful" hab ichs
> mal mit meinem anderen adapter und ponyprog probiert und siehe da,
> es ging ...

Du solltest nach jedem Brennvorgang die geschriebenen Daten
verifizieren.
Gast #238960
Lesenswert?

hmm . .tut das avrdude nicht von haus aus ?
könnte schwören dass dort was mit Verifying stand.

zurück zu meinem jetzigen Problem:

Ich würde gerne einen externen Interrupt nutzen, habe aber das Problem,
dass er anscheinend nicht wirklich ausgelöst wird. Weiss zufällig jemand
woran das liegen könnte ? Die Initialisierung müsste ja so passen, oder
?

int main(void) {
  /* configure all portD bits as input */
  DDRD = 0x00;
  // configure all PortB bits as output
  DDRC = 0xff;
  PORTC = 0x00;

  //configure the external interrupt
  GICR |= (1<<INT0);
  MCUCR &= ~(1<<ISC01);
  MCUCR |= (1<<ISC00);


  // enable interrupts
  sei();
  while(1);
  return 0;
}

SIGNAL (SIG_INTERRUPT0) {
  PORTC = 0xff;
}
Gast #238962
Lesenswert?

gibt wohl doch ein problem :(

ich nutze jetzt den PORTB (war mit PORTC auch net anders).

es kommt mir vor, als würde sofort nach dem Einschalten ein IRQ
auftreten, und auch danach in sehr kurzen abständen (10ms?).
Ich habe eine LED angehängt und die scheint zeitweise zu flackern (für
ein paar Sekunden) dann leuchtet sie wieder durchgehend (auch wieder
ein paar Sekunden).

der Code ist folgender:
#include <avr/io.h>
#include <avr/interrupt.h>    // sei()
#include <avr/signal.h>      // SIGNAL

#define XTAL 1000000

int ab = 0x00;

int main(void) {

  // configure all PortB bits as output
  DDRB = 0xff;
  PORTB = 0x00;

  //configure the external interrupt
  GICR |= (1<<INT0);
  MCUCR |= (1<<ISC00) | (1<<ISC01);


  // enable interrupts
  sei();
  while(1);
  return 0;
}

SIGNAL (SIG_INTERRUPT0) {
  if (ab == 0x00)
  {
    PORTB = 0xff;
    ab = 0xff;
  }
  else
  {
    PORTB = 0x00;
    ab = 0x00;
  }
}

Nun zur eigentlichen Frage: warum ist das so? Ein IRQ sollte doch erst
bei Überschreiten eines gewissen Pegels auftreten .. oder?  - Mein
Multimeter zeigt eigentlich schöne 0,00V (Low) und 4,3V (High) an.
Das Ganze hängt an einem FT245 - kann hier das Problem liegen?
Gast #238963
Lesenswert?

Ich habe heute an einem aehnlichen Problem gearbeitet. Bei mir laeuft es
jetzt.

Ich verstehe diesen Teil Deines Programms nicht:
  //configure the external interrupt
  GICR |= (1<<INT0);
  MCUCR |= (1<<ISC00) | (1<<ISC01);

Ich weiss nicht, was Du z.B. mit 1<<INT0 machst.

Bei mir sieht das so aus und es funktioniert:

// Konfiguration des Interrupts
// Der externe Interrupt INT0 liegt an PD2 (Pin4 des Atmega8)
// INT0 soll bei fallender Flanke ausloesen, weil an Pin4 ein Pullup-
// widerstand nach Vdd und ein Taster nach GND geschaltet sind.
MCUCR = 0x02 ;
// INT0 aktivieren
GIMSK = 0b01000000 ;

// PD2 of Datadirection Register D to input
DDRD = 0b11111011 ;

Ich habe das ganze aber nur auf dem Simulator getestet, da ich noch
keine Hardware habe.
Gast #238964
Lesenswert?

Also bei Deinem Code sollte eigentlich bei einer steigenden Flanke an
INT0 ein Interrupt ausgelöst werden. Vielleicht ist das Signal nicht
sauber, oder der USB-Chip gibt tatsächlich diese INT-Signale 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