Forum: Compiler & IDEs Probleme mit C Code


von Thomas (Gast)


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 ?

von Elektrikser (Gast)


Lesenswert?

Welcher AVR?
Atmega 16,32,...
JTAG (Schau mal in den Fuses) aktiv?

von Thomas (Gast)


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 :)

von Thomas (Gast)


Lesenswert?

jaja .. man sollte den externen IRQ halt auch richtig aktivieren seufz

von Rolf Magnus (Gast)


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.

von Thomas (Gast)


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;
}

von Thomas (Gast)


Lesenswert?

grmml .. dummer verdrahtungsfehler wies scheint .. :)

von Thomas (Gast)


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?

von Rolf (Gast)


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.

von edvdoctor (Gast)


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.

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.